Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z PDO, bindowanie parametrów, PDOStatement::execute(): SQLSTATE[HY093]
MMySlime
post 15.11.2012, 21:55:19
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 22.08.2012

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


Witam,

mam problem. Wywala mi errora gdy (tak sądzę) próbuję zbindować parametry w takim oto sobie kodzie:

  1.  
  2. public function select($table,$where = NULL,$add = NULL,$how = '*'){
  3.  
  4. if($where != NULL) $where = 'WHERE '.$where;
  5.  
  6. $select = $this->db->prepare('SELECT :how FROM :table :where :add');
  7.  
  8. $select->bindParam(':how', $how);
  9. $select->bindParam(':table', $table);
  10. $select->bindParam(':where', $where);
  11. $select->bindParam(':add', $add);
  12.  
  13. $select->execute();
  14.  
  15. }
  16.  
  17. public function insert( $table, $value){
  18.  
  19. $key = array_keys($value);
  20.  
  21. $value = array_values($value);
  22.  
  23. $i = 1;
  24.  
  25. $ij = 0;
  26.  
  27. $j = null;
  28.  
  29. foreach($key as $keys){
  30. $j++;
  31. }
  32.  
  33. $values = '';
  34.  
  35. foreach($key as $keyss){
  36. $values .= $values . $keyss . ' = ?, ';
  37. }
  38.  
  39. $values = substr( $values, 0, -2 );
  40.  
  41. $insert = $this->db->prepare('INSERT INTO '.$table.' SET '.$values);
  42.  
  43. while($i < $j){
  44. $insert->bindParam($i,$value[$ij]);
  45. $i++;
  46. $ij++;
  47. }
  48.  
  49. $insert->execute();
  50.  
  51. }


Dokładny kod błędu:

  1. Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in (Jakaś ścieżka) on line 85


Nie ma co owijać w bawełnę, powiem że nie wiem zupełnie co ten błąd oznacza.
Myślę że dobrze zbindowałem wartości ale skoro PHP wywala błąd to coś jest nie tak...
Próbowałem różnych metod jednak żadna z "moich" nie działa...
Prosiłbym o pomoc.

Dziękuję za wszystkie odpowiedzi smile.gif
Go to the top of the page
+Quote Post
abort
post 15.11.2012, 23:01:42
Post #2





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


Ilość parametrów (parametry to ciąg znaków zaczynający się od dwukropka) podanych w $this->db->prepare(); musi być równa ilości bindowań.
W listingu na początku w liniach 6-11 masz ok, ale już w liniach 41-44 tak nie jest.
Go to the top of the page
+Quote Post
zegarek84
post 15.11.2012, 23:55:46
Post #3





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


funkcja "select" raczej nie powinna działać - nie chce mi się sprawdzać ale tam nie rozumiesz idei bindowania i to zapytanie mogłeś po prostu skleić jako tekst...

w funkcji "insert" masz jeden podstawowy błąd:
Kod
$values .= $values . $keyss . ' = ?, ';

zdecyduj się na
$values .= $keyss . ' = ?, ';
lub
$values = $values . $keyss . ' = ?, ';

poza tym zastanawia mnie, czy nie powinno Ci zwrócić niepoprawne zapytanie - nie wiem czy na końcu INSERT może być przecinek i czy to poprawne, zrobił bym to raczej inaczej... dlaczego też w pętli zliczasz wielkość tablicy jak są do tego funkcje??...


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
MMySlime
post 16.11.2012, 20:26:18
Post #4





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 22.08.2012

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


@abort: Specjalnie dlatego zrobiłem while aby bindowała wszystkie parametry które są liczbami a nie ciągami znaków, jeżeli dobrze w php.net piszą to można wykorzystywać liczby zamiast stringów wink.gif

@zegarek84: Rzeczywiście zrobiłem błąd, skoro dodaję wartość do stringa to nie dodaje tej samej wartości :/ I jakby co spójrz na funkcję substr, obcina ona końcówkę którą jest ", "

Dzięki za odpowiedzi wink.gif

==EDIT==

@abort: A więc tak... strzeliłem faila. Miałem w kodzie napisać bindValue a napisałem bindParam ._.

==EDIT2==

Tak czy siak nie działa... zastosowałem się do waszych poleceń i nadal "wywala błęda" :/

==EDIT3==

O matko już 3 edit... w każdym bądź razie popełniłem błąd, tu chodziło głównie o while, zmienna $i była zła, na początku powinna być 0 i przed wykonaniem bindowania powiększyć ją o jeden, w tym cała magia oraz problem.
Ważne że sobie poradziłem i problem z głowy. Dzięki wszystkim za pomoc wink.gif

Ten post edytował MMySlime 16.11.2012, 20:51:12
Go to the top of the page
+Quote Post
abort
post 16.11.2012, 21:05:28
Post #5





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


To może inaczej, wrzuć ten kod:
  1. $prepare = 'INSERT INTO '.$table.' SET '.$values;
  2. $insert = $this->db->prepare($prepare);
  3.  
  4. $binds = '';
  5. while($i < $j){
  6. $insert->bindParam($i,$value[$ij]);
  7. $binds .= ':' . $i . '=' . $value[$ij] . ' ';
  8. $i++;
  9. $ij++;
  10. }
  11.  
  12. // Dobrze byłoby wiedzieć, co tu wypluje...
  13. echo 'Prep:' . $prep . ', bindings:' . $binds';
  14. $insert->execute();


I pokaż co wypluje. Druga sprawa: czy w linii 21 zaprezentowanego kodu nie masz czasem literówki?

Ten post edytował abort 16.11.2012, 22:00:19
Go to the top of the page
+Quote Post
MMySlime
post 16.11.2012, 22:27:28
Post #6





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 22.08.2012

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


@abort: Dzięki ale już nie trzeba, poradziłem sobie gdyż był błąd w pętli while wink.gif Zamiast $i = 1 powinno być 0 oraz przez bindem $i++, automatycznie to powiększało zmienną i usuwało problem.

==EDIT znowu==

U mnie już nie ma błędu ale u ciebie jest wink.gif Po $binds nie powinno być '

Ten post edytował MMySlime 16.11.2012, 22:33:41
Go to the top of the page
+Quote Post
abort
post 16.11.2012, 22:44:24
Post #7





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


Cytat(MMySlime @ 16.11.2012, 22:27:28 ) *
U mnie już nie ma błędu ale u ciebie jest wink.gif Po $binds nie powinno być '

A i owszem - ale takie rzeczy zdarzają się (mimo wszystko) przy pisaniu "na gorąco". Nie miało to na celu świadome wprowadzenie Cię w błąd.
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: 31.05.2024 - 19:22