Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] [MySqli] MySqli->query jak wyswietlic blad
Forum PHP.pl > Forum > Przedszkole
codex
Problem powstaje gdy próbuję wykonać dodawanie rekordu do utworzonej wcześniej bazy tabeli.
Niby nie wywala żadnych błędów, lecz gdy podglądam tabelę w PhpAdmin to widzę, że rekord nie został dodany.
Kod który skleciłem do tej pory nie wyświetla co to za błąd.
oto kod:

  1. $DBHOST= 'fdb2.biz.nf';
  2. $DBUSER='****dbuser****';
  3. $DBPASSWORD='****dbpassword****';
  4. $DBNAME='****dbname****';
  5. $TABNAME='userlog';
  6.  
  7.  
  8. $email = $_POST['enailAddress'];
  9. $password = $_POST['setPasswordx'];
  10. $userHost = $_SERVER['REMOTE_HOST'];
  11. $userBrowser = $_SERVER['HTTP_USER_AGENT'];
  12. $defaultUserLevel = '3';
  13.  
  14. $mysqli = new mysqli ( $DBHOST, $DBUSER, $DBPASSWORD, $DBNAME );
  15. if ($mysqli->connect_errno) {
  16. printf("<br>nie mozna zdefiniowac klasy --mysqli-- <br> error: %s <br>",
  17. $mysqli->connect_error);
  18. } else {
  19. printf ("<br>klasa mysqli zdefiniowana <br>");
  20. }
  21. $query = "INSERT INTO $TABNAME VALUE ( ' ', $email, $password,
  22. $defaultUserLevel,
  23. $userHost,
  24. $userBrowser)";
  25. if (!$mysqli->query($query)) printf ("nie mozna dodac rekordu<br> error: questionmark.gif?");
  26. $mysqli->close();


W dokumentacji (którą słabo rozumię) mysqli::query mam napisane, że metoda zwraca FALSE w przypadku błędu.
1. Jak wyświetlić jaki to błąd?
2. Ewentualnie co robię źle w tym kodzie ?
Damonsson
Jeżeli pierwszą wartością jest primary index autoincrement, to ślesz mu nulla, a nie ' '.

A wyświetlenie błędu:
zamiast
  1. if (!$mysqli->query($query)) printf ("nie mozna dodac rekordu<br> error: questionmark.gif?");

to
  1. $mysqli->query($query) or die($mysqli->error);
codex
Zrobiłem jak pisałeś, teraz nie wywala żadnego komunikatu o błędzie jednak w PhpAdmin przeglądam tą samą tabelę po dodaniu 2 rekordów kolejnych widzę, że:

rekordy = 0;
nstępny autoindex = 1;

znaczy, że rekordu nie dodano, czy źle rozumiem ten cały PhpAdmin ?
-----------------------------------------------------------------------------
Przerobiłem linijkę z wyświetlaniem kodu z powrotem na taki zapis:
  1. if (!$mysqli->query($query)) printf("nie dodano rekordu error: %s", $mysqli->error);


i teraz wyświetla mi błąd z którego ja nic nie rozumie, poza tym, że mam błąd składni MySql:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near ' xxxxxxxx, 3, ,
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,' at line 1


przy czym xxxxxxxx to jest fraza przypisana do zmiennej $password w moim przykładzie ....
Nie rozumie, dla czego server czepia się akurat tego ciągu znaków a pierwszy ($email) mu najwyraźniej odpowiada ?
Comandeer
Polecam poczytać o prepared statements i SQL injection. A przynajmniej stosować mysqli_real_escape_string

Co do problemu: każdy string powinien być opakowany apostrofem lub cudzysłowem - najprawdopodobniej o to się rzuca skrypt.
codex
Zrobiłem Commander jak pisałeś - opakowałem stringi w cudzysłowy. Teraz wywala mi taki error:


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xxxxxxxx, 3, "", ")' at line 1



Słabo kumam angielski.
1. Czy tam nie ma być jakiś przecinek na końcu tej listy parametrów ?
2. Co oznacza ta liczba 3 w komunikacie błędu - liczba parametrów po 'xxxxxxxx' ? - (by się zgadzało) czy zbieg okoliczności
3. Co do mysqli_real_escape_string oraz innych kwestii bezpieczeństwa - przyjdzie czas nie mogę narzucać sobie dodatkowego
materiału teraz gdy mi przyszło ogarniać HTML, PHP, JS, CSS i teraz jeszcze zderzenie MySql facepalmxd.gif styknie.
w ogóle co do bezpieczeństwa ... na szybko to przypomniał mi się art gynvaela o funkcji printf() użytej w formularzach,
myślę, że kwestia bezpieczeństwa to zbyt szeroki temat teraz bo mam tak, że jak zacznę coś to .... smile.gif. Na teraz to chcę mieć
serwis który cos robi, normalnie działa. mam tyle na razie:
free poker
bez kwestii bezpieczeństwa się nie obejdzie ponieważ można by było oszukiwać jak to w pokerze bywa smile.gif

-----------------------------------------
edycja:
Nie mogę korzystać z wersji mysql mo server wywala błędy, że funkcja jest przestarzała w miejsce tego muszę mysqli
podawać. da się to jakoś poustawiać żeby łykał mysql było by łatwiej - jest masa przykładów użycia.
casperii
  1. INSERT INTO `table` (
  2. `field1`,
  3. `field2`
  4. ) VALUES (
  5. '".$value1."',
  6. '".$value2."')
codex
Dzieeeeki ci dobry człowieku casperii exclamation.gif! O to chodziło. Jakoś nigdzie nie widziałem wcześniej podobnego zapisu !
Działa wszystko elegancko - sprawdziłem w phpadmin. przepisałem linie jak poleciłeś. Wkleję je jeszcze raz poniżej gdyby ktoś miał podobny problem:
oto przerobione linijki kodu:
  1. $query = "INSERT INTO `userlog` (`username`,
  2. `userpassword`,
  3. `userlevel`,
  4. `userhost`,
  5. `useragent` )
  6. VALUES (
  7. '".$email."',
  8. '".$password."',
  9. '".$defaultUserLevel."',
  10. '".$userHost."',
  11. '".$userBrowser."')";
  12. if (!$mysqli->query($query)) printf("nie dodano rekordu error: %s", $mysqli->error);


Ważne, że wystarczy pominąć pole z właściwością auto_increment - nie trzeba stosować NULL ani pustego stringu.
Amen.
Comandeer
Jest jeszcze inny zapis, IMO jeszcze bardziej fajny:
Kod
INSERT INTO tabela SET pole = value, pole2 = value2
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.