Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]MySQL vs MySQLi i magia zapytań
Forum PHP.pl > Forum > Przedszkole
phpamator
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 ?
nospor
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
viking
bind_param na pewno nie ma takiej składni. Przyjrzyj się dokładnie jeszcze raz w dokumentacji.
phpamator
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 .....
nospor
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
phpamator
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 ?
nospor
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
phpamator
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!';
nospor
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
phpamator
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. }
nospor
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
phpamator
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. }
rafkon1990
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.
SmokAnalog
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')
viking
W międzyczasie zastanów się dlaczego w zapytaniu jest stmt zamiast update
phpamator
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

nospor
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 :/
phpamator
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.
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.