Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] [MySqli] MySqli->query jak wyswietlic blad
codex
post 29.11.2015, 12:53:35
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 29.11.2015

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował codex 29.11.2015, 16:06:52
Go to the top of the page
+Quote Post
Damonsson
post 29.11.2015, 13:03:51
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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);


Ten post edytował Damonsson 29.11.2015, 13:05:30
Go to the top of the page
+Quote Post
codex
post 29.11.2015, 16:04:22
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 29.11.2015

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował codex 29.11.2015, 16:05:21
Go to the top of the page
+Quote Post
Comandeer
post 29.11.2015, 16:14:02
Post #4





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
codex
post 29.11.2015, 17:02:23
Post #5





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 29.11.2015

Ostrzeżenie: (0%)
-----


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.

Ten post edytował codex 29.11.2015, 17:08:46
Go to the top of the page
+Quote Post
casperii
post 29.11.2015, 17:11:54
Post #6





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


  1. INSERT INTO `table` (
  2. `field1`,
  3. `field2`
  4. ) VALUES (
  5. '".$value1."',
  6. '".$value2."')
Go to the top of the page
+Quote Post
codex
post 29.11.2015, 18:07:30
Post #7





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 29.11.2015

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Comandeer
post 29.11.2015, 18:23:18
Post #8





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


Jest jeszcze inny zapis, IMO jeszcze bardziej fajny:
Kod
INSERT INTO tabela SET pole = value, pole2 = value2


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.07.2025 - 06:40