Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Prepared statements - mysqli, bind_param przekazywanie zmiennych do zapytania SQL, jedna zmienna jest ok, dwie nie wchodzą
Leopard
post 26.04.2009, 16:18:58
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 2
Dołączył: 20.07.2008

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


Chce wykonać proste zapytanie do bazy, w którym są dwie zmienne ($id, $name):

  1. <?php
  2. $mysqli = new mysqli('localhost', 'root', '', 'test1');
  3. if(mysqli_connect_errno()) {
  4.    throw new Exception(mysqli_connect_error());
  5.    exit();
  6. }
  7. $stmt = $mysqli->prepare("SELECT * FROM TEST WHERE id=? AND name=?");
  8.  
  9. $stmt->bind_param('is', $id, $name);
  10. $id = 1;
  11. $name = 'imie';
  12.  
  13. $stmt->execute();
  14. $stmt->bind_result($id, $first_name, $last_name);
  15. while ($data = $stmt->fetch()) {
  16.    echo $id . $first_name . $last_name . '<br />';
  17. }
  18. ?>


Wyskakuje mi błąd:
Fatal error: Call to a member function bind_param() on a non-object in C:\wamp\www\eOOP\mysqli.php on line 10
(w linii z bind_param)

Kiedy daje w zapytanie jedną zmienną to wszystko jest ok:

  1. <?php
  2. ...
  3. $stmt = $mysqli->prepare("SELECT * FROM TEST WHERE id=?");
  4.  
  5. $stmt->bind_param('i', $id);
  6. $id = 1;
  7.  
  8. $stmt->execute();
  9. ...
  10. ?>


bind_param z dwoma zmiennymi chyba piszę dobrze bo w manualu jest taki przykład:

  1. <?php
  2. $stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
  3. $stmt->bind_param('sssd', $code, $language, $official, $percent);
  4.  
  5. $code = 'DEU';
  6. $language = 'Bavarian';
  7. $official = "F";
  8. $percent = 11.2;
  9. ?>


Gdzie robię błąd?


--------------------
Once committed to a full attack, only a fatal bullet will stop a charging Leopard.
Piszę poprawnie po polsku.
Go to the top of the page
+Quote Post
megawebmaster
post 26.04.2009, 18:48:24
Post #2





Grupa: Zarejestrowani
Postów: 143
Pomógł: 17
Dołączył: 8.11.2008
Skąd: Libiąż

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


Skoro wywala Ci błąd o brak obiektu stmt to chyba rozwiązanie jest proste - coś Ci nie zwraca $mysqli->prepare() obiektu MySQLi_Statement. Musisz coś w tym kierunku kombinować. Ja tutaj akurat nie mam zbyt dużego doświadczenia.
Go to the top of the page
+Quote Post
Leopard
post 27.04.2009, 08:32:42
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 2
Dołączył: 20.07.2008

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


Dzięki,
wstyd się przyznać, miałem literówkę w nazwie pola "name" w bazie danych worriedsmiley.gif , kod jest ok.


--------------------
Once committed to a full attack, only a fatal bullet will stop a charging Leopard.
Piszę poprawnie po polsku.
Go to the top of the page
+Quote Post
dr_bonzo
post 27.04.2009, 08:41:27
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Dlatego rzucanie wyjatkow przez baze danych jest co najmniej pomocne (inaczej kazde ->prepare() musisz sprawdzac sam IF'em).
Cytat
mysqli_prepare() returns a statement object or FALSE if an error occured.

Jesli zapytanie sie nie uda to ci od razu to pokaze, w dodatku z komunikatem mysql.

Ten post edytował dr_bonzo 27.04.2009, 08:42:16


--------------------
Nie lubię jednorożców.
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.08.2025 - 01:43