Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]MySQL vs MySQLi i magia zapytań
phpamator
post
Post #1





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

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


Helloł smile.gif

Panie i Panowie (to tak, żeby ta piękniejsza część się nie obraziła), postanowiłem przerobić moje skrypty żeby działały nieco lepiej, używając nieco mądrzejszych metod i ... owszem, część ... bez problemu ale kiedy zmieniłem procedurę aktualizacji danych .... nie chce działąć.

Nie zeby to był jaiś kosmiczny ciąg zapytań czy coś, poprostu aktualizacja jednej wartości, zresztą sami zobaczcie:
  1. if($check == true){
  2. require_once('../../config/imdbConfig.php');
  3.  
  4. $update = $mysqli->prepare("UPDATE `shop_order` SET status_id = ? WHERE order_id = ?");
  5. $update = $mysqli->bind_param($_POST['status_id'],$_POST['order_id']);
  6. print_r($update);
  7. $update->execute();
  8. $update->close();
  9. }

I co tu jest źle ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 17)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




1) Czy tak ciezko napisac czym sie blad objawia?
2) Tak ciezko sprawdzic zawartosc zmiennych?
3) Tak ciezko wyswietlic potencjalny blad bazy danych?

4) Czy tak ciezko zajrzec do manuala i zobaczyc jak sie powinno poprawnie wykonywac bind_param?!
http://php.net/manual/en/mysqli-stmt.bind-param.php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post
Post #3





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


bind_param na pewno nie ma takiej składni. Przyjrzyj się dokładnie jeszcze raz w dokumentacji.


--------------------
Go to the top of the page
+Quote Post
phpamator
post
Post #4





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

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


Widać nie jestem jeszcze na poziomie kiedy potrafi się sprawdzić co się dzieje ze skryptem do którego wysyłamy dane ajaxem smile.gif
Nie wiem, jak sprawdzić, wiem napewno, że ajax wysyła dane, widzę to w konsoli, nie potrafię albo nie wiem jak spowodować żeby skrypt realizujący query pokazał cokolwiek - wszak on tylko wykonuje zadanie w tle??
No chyba, że jest jakaś metoda na podglądanie co robi ów skrypt nawet gdy tego nie widać wink.gif ?
Błąd jaki mi się pojawia to błąd serwera 500 a co za tym idzie nie łatwo stwierdzić jednoznacznie co go powoduje, bo 500 znaczy o ile wiem błąd kodu(zazwyczaj).

Inna rzecz, że mój post znajduje się w dziale o dzwięcznej nazwie "Przedszkole" gdzie jak zawsze mi się wydawało, można pytać o rzeczy proste, banalne, podstawowe itd smile.gif
i gdzie na zadane pytanie otrzymam odpowiedź wyjaśniającą problem a nie "Weź 'se' poszukaj w googlach .... " albo poczytaj manual.
ale mniejsza .....

Mówisz kolego, że składnia MySQLi bind->param nie wygląda w ten sposób ?
  1. if($check == true){
  2. require_once('../../config/imdbConfig.php');
  3.  
  4. $update = $mysqli->prepare("UPDATE `shop_order` SET status_id = ? WHERE order_id = ?");
  5. $update = $mysqli->bind_param('sssddi', $_POST['status_id'],$_POST['order_id']);// co to jest 'sssddi' ?
  6. print_r($update);
  7. $update->execute();
  8. $update->close();
  9. }




fakt, jest tam jeszcze jedna wartość która nie wiem tak naprawdę do czego się odwołuje.
Poczytam więc MANUAL, dzięki za okazaną pomoc .....

Ten post edytował PHPRexio 13.11.2016, 19:15:17
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Widać nie jestem jeszcze na poziomie kiedy potrafi się sprawdzić co się dzieje ze skryptem do którego wysyłamy dane ajaxem

I dlatego wlasnie jak sie zaklada temat to sie nie pisze: NIe dziala, zgadnijcie czemu
Tylko sie pisze: wysylam ajaxa do takiego skryptu i dostaje 500.
Tak ciezko?

Od razu mozemy ci powiedziec: odpal konsole Firebug w Firefox i tam sobie mozesz podejrzec co zwraca ci dokladnie twoj skrypt. Dodatkowo wlacz wyswietlanie wszystkich bledow w php. To sa podstawy

Cytat
fakt, jest tam jeszcze jedna wartość która nie wiem tak naprawdę do czego się odwołuje.
No tak, nie wiem do czego sluzy wiec go zignoruje a potem bede sie dziwil na forum ze nie dziala....
Przeciez w manualu sa podane przyklady uzycia oraz jest opis kazdego parametru pokolei. Trzeba sie mocno starac by tego nie zobaczyc :/
Pierwszy parametr okresla typ wkladanych danych

Cytat
Inna rzecz, że mój post znajduje się w dziale o dzwięcznej nazwie "Przedszkole" gdzie jak zawsze mi się wydawało, można pytać o rzeczy proste, banalne, podstawowe itd
No wlasnie nie za bardzo a juz szczegolnie gdy odpowiedz jak wol jest w manualu. Niestety cala rzesza uzytkownikow mysli ze jak przedszkole to juz nie musza sie sami wysilac


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
phpamator
post
Post #6





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

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


I tu cię zaskoczę nospor, poświęcam temu bardzo dużo czasu .... najwyraźniej nie jestem tak bystry jak mi się wydaje i to jest główny powód, że zaglądam na forum wink.gif gdzie szukam pomocy w rozwiązaniu tych 'łamigłówek' ......ale wygląda na to, że to nienormalne podejście do tematu? wink.gifsmile.gifsmile.gif

Co do właczania wyświetlania błędów, pewnie bym to zrobił gdybym testował kod na jakimś dev serwerze, ja niestety robię to natakim gdzie wolałbym tego nie robić, stąd problem.

Ale mniejsza, jeśli mimo wszystko mogę dostać jakieś wskazówki ..... będzie fajnie, jeśli nie .... trudno, będę musiał się męczyć dalej sam ... czyli jak do tej pory.

Według manuala, sssddi to znaczniki typu danych.
Przykład którym się podpierałem to:
http://php.net/manual/en/mysqli-stmt.bind-param.php
I tutaj znalazłem co nieco na temat składni. Niestety nawet dodanie ss ani ii nie powoduje zmian czyli dalej nie działa.
  1. if($check == true){
  2. require_once('../../config/imdbConfig.php');
  3.  
  4. $update = $mysqli->prepare("UPDATE `shop_order` SET status_id = ? WHERE order_id = ?");
  5. $update = $mysqli->bind_param('ss', $status_id ,$order_id);
  6.  
  7. // dla ułatwienia zadania dodałem 'ss' czyli o ile dobrze rozumien string, string czyli pierwsza wartość typu ... i druga wartość typu .....
  8. // czy tak ?
  9.  
  10. $update->execute();
  11. $update->close();
  12. }
  13. echo 'Status updated!';


Jeśli tak .... to dlaczego dalej nie działa ?


Ten post edytował PHPRexio 13.11.2016, 19:35:51
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Niestety nawet dodanie ss ani ii nie powoduje zmian czyli dalej nie działa.
Bo nadal nie ma prawa dzialac. Zajrzyj prosze jeszcze raz do manuala i zobacz na jakim obiekcie jest wywolywane tam bind_param() a na jakim obiekcie wywolujesz to ty. Naprawde nie trzeba byc jakos specjalnie bystrym do tego wink.gif

Co do wyswietlania bledow: Jak nie mozna wlaczyc ich wyswietlania, to sie wlacza ich logowanie i przeglada logi wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
phpamator
post
Post #8





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

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


No fakt, mogę grzebać w logach ....
Tak zauważyłem .... sam się sobie dziwię jak mogłem tego nie zauważyć wink.gif
  1.  
  2. if($check == true){
  3. require_once('../../config/imdbConfig.php');
  4.  
  5. $update = $mysqli->prepare("UPDATE `shop_order` SET status_id = ? WHERE order_id = ?");
  6. $update ->bind_param('ss', $status_id ,$order_id);// poprawiłem ..... ale dalej nic :)
  7. print_r($update);
  8. $update->execute();
  9. //$update->close();
  10. }
  11. echo 'Status updated!';


Ten post edytował PHPRexio 13.11.2016, 19:40:45
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
sam się sobie dziwię jak mogłem tego nie zauważyć
Bo nie przegladales logow tongue.gif

Cytat
No fakt, mogę grzebać w logach ....
To naprawde nic ujmujacego ani hanbiacego. Kazdy porzadny dev grzebie w logach niezaleznie czy dopiero zaczyna czy zaczynal 20 lat temu. Lepiej wyrob sobie w koncu ten nawyk by nie latac z kazda pierda na forum. A jak juz polecisz to staraj sie udzielic wiecej informacji niz: nie dziala, czemu? To nie quiz. smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
phpamator
post
Post #10





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

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


Powoli nabieram, nie zmienia to jednak faktu, że dalej nie mogę się doszukać błędu i zaktualizować danych używając tej metody ....
  1. // cały kod..zik, już nawet zmieniłem nazwy zmiennych, żeby odpowiadały tym z przykładu i ..... d...
  2. // z całkowitą pewnością mogę stwierdzić, AJAX przesyła dane ... 100%
  3.  
  4. if($_SERVER['REQUEST_METHOD'] == "POST" && $_POST['method']=='update'){
  5. $check = file_exists("../../config/imdbConfig.php");
  6. if($check == true){
  7. include('../../config/imdbConfig.php');//tu includuje dane do połączenia
  8. $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  9. $stmt = $mysqli->prepare("stmt `shop_order` SET `status_id` = ? WHERE `order_id` = ? ");
  10. $stmt ->bind_param('ii', $status_id ,$order_id);
  11. $status_id = $_POST['status_id'] ?: '';
  12. $order_id = $_POST['order_id'] ?: '';
  13. $stmt->execute();
  14. //printf("%d Row stmtd.\n", $stmt->affected_rows);
  15. $stmt->close();
  16. echo 'Status stmtd!';
  17. }
  18.  
  19. }
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Widzisz na ekranie
Status stmtd!
?
Jesli nie, znaczy ze cos nie tak wink.gif
Jesli tak, znaczy ze masz blad zapytania albo przekazujesz zle dane. W pierwszym wypadku wyswietl blad zapytania, w drugim wyswietl dane jakie wkladasz do zapytania


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
phpamator
post
Post #12





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

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


No właśnie nie, ale, poszedłem na łatwiznę i zrobiłem nieco inaczej. Nie do końca działa, jeszcze mi nie zwraca prawidłowo ale w bazie zapisuje wink.gif
  1. if($_SERVER['REQUEST_METHOD'] == "POST" && $_POST['method']=='update'){
  2. $check = file_exists("../../config/imdbConfig.php");
  3. $test = mysqli_query($mysqli,"SELECT @version");
  4. if($check == true){
  5. require_once('../../config/imdbConfig.php');
  6. $status_id = $_POST['status_id'] ?: '';
  7. $order_id = $_POST['order_id'] ?: '';
  8. $sqlOrder = "UPDATE `shop_order` SET `status_id` = '$status_id' WHERE `order_id` = '$order_id' ";
  9. $update = $conn->query($sqlOrder);
  10. $update->close();
  11. echo 'Updated!';
  12. }else{
  13. echo 'Failed!';
  14. }
  15. }
Go to the top of the page
+Quote Post
rafkon1990
post
Post #13





Grupa: Zarejestrowani
Postów: 37
Pomógł: 9
Dołączył: 14.09.2016
Skąd: Śląskie

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


Cytat(PHPRexio @ 13.11.2016, 20:18:04 ) *
Powoli nabieram, nie zmienia to jednak faktu, że dalej nie mogę się doszukać błędu i zaktualizować danych używając tej metody ....
  1. // cały kod..zik, już nawet zmieniłem nazwy zmiennych, żeby odpowiadały tym z przykładu i ..... d...
  2. // z całkowitą pewnością mogę stwierdzić, AJAX przesyła dane ... 100%
  3.  
  4. if($_SERVER['REQUEST_METHOD'] == "POST" && $_POST['method']=='update'){
  5. $check = file_exists("../../config/imdbConfig.php");
  6. if($check == true){
  7. include('../../config/imdbConfig.php');//tu includuje dane do połączenia
  8. $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  9. $stmt = $mysqli->prepare("stmt `shop_order` SET `status_id` = ? WHERE `order_id` = ? ");
  10. $stmt ->bind_param('ii', $status_id ,$order_id);
  11. $status_id = $_POST['status_id'] ?: '';
  12. $order_id = $_POST['order_id'] ?: '';
  13. $stmt->execute();
  14. //printf("%d Row stmtd.\n", $stmt->affected_rows);
  15. $stmt->close();
  16. echo 'Status stmtd!';
  17. }
  18.  
  19. }


poczytaj o bind_param tymczasem podpowiem że bind_param powinien mniej więcej tak wyglądać:
  1. // cały kod..zik, już nawet zmieniłem nazwy zmiennych, żeby odpowiadały tym z przykładu i ..... d...
  2. // z całkowitą pewnością mogę stwierdzić, AJAX przesyła dane ... 100%
  3.  
  4. if($_SERVER['REQUEST_METHOD'] == "POST" && $_POST['method']=='update'){
  5. $check = file_exists("../../config/imdbConfig.php");
  6. if($check == true){
  7. include('../../config/imdbConfig.php');//tu includuje dane do połączenia
  8. $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  9. $stmt = $mysqli->prepare("UPDATE `shop_order` SET `status_id` = :status WHERE `order_id` = :order ;");
  10. $stmt ->bind_param(':status',$_POST['status_id'], PDO::PARAM_INT);
  11. $stmt ->bind_param(':order', $_POST['order_id'], PDO::PARAM_INT);
  12. $stmt->execute();
  13. //printf("%d Row stmtd.\n", $stmt->affected_rows);
  14. $stmt->close();
  15. echo 'Status stmtd!';
  16. }
  17.  
  18. }


edit1:
Poprawka zapytania.

Ten post edytował rafkon1990 14.11.2016, 11:00:48
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #14





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Wtrącę się tylko, że nie musisz tak zapisywać warunku:
  1. if($_SERVER['REQUEST_METHOD'] == "POST" && $_POST['method']=='update')


Tablica $_POST nigdy nie będzie wypełniona, kiedy dane są przesłane inną metodą. Poza tym Twój kod wyrzuci notice, jeśli nie ma klucza method w danych POST. Lepiej to zapisać tak:
  1. if(isset($_POST['method']) && $_POST['method'] === 'update')
Go to the top of the page
+Quote Post
viking
post
Post #15





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


W międzyczasie zastanów się dlaczego w zapytaniu jest stmt zamiast update


--------------------
Go to the top of the page
+Quote Post
phpamator
post
Post #16





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

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


Cytat(viking @ 13.11.2016, 22:48:38 ) *
W międzyczasie zastanów się dlaczego w zapytaniu jest stmt zamiast update


Wspominałem, że chciałem wykluczyć jakiekolwiek błędy mogące mieć wpływ na wykonywanie skryptu i dlatego jest $stmt zamiast $update wink.gif

Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie chodzilo o zmienna $stmt tylko o tekst stmt w zapytaniu.....

stmt `shop_order` SET `status_id` = :status WHERE `order_id` = :order

Robiac replace na calym pliku zamieniles bezmyslnie slowo kluczowe UPDATE w zapytaniu na STMT.... Mowilem bys wyswietlal bledy zapytan ale po co.... Przeciez i tak wiesz lepiej :/


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
phpamator
post
Post #18





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

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


Aaaa to mi się przypadkiem zmieniło, ale zaraz poprawiłem i tak naprawdę było jak należy.
Całkowicie jednak odmienny jest sposób bindowania od tego o którym czytałem, stąd nieporozumienie i dlatego nic mi nie działało.
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 Aktualny czas: 22.08.2025 - 07:39