Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Problem z bindParam
Forum PHP.pl > Forum > Przedszkole
Pjotrek80
Próbuje napisać metodę insert. Mam problem z bindParam.

Oto fragment kodu metody:
  1. $stmt = $this->prepare($sql);
  2.  
  3. foreach($valuesArr as $valueName => $value){
  4. if(!is_array($value)){
  5. $bindValName = '"';
  6. $bindValName .= ':'.$valueName;
  7. $bindValName .= '"';
  8. $stmt->bindValue($bindValName, $value);
  9. }else {
  10. $hasParam = true;
  11. $paramArr = $value;
  12. $bindParamName = $valueName;
  13. $bindParName = '"';
  14. $bindParName .= ':'.$bindParamName;
  15. $bindParName .= '"';
  16. $stmt->bindParam($bindParName, $paramName);
  17. }
  18. }
  19.  
  20. if(!$hasParam){
  21. $stmt->execute($valuesArr);
  22. $insetItemId = $this->lastInsertId();
  23. $stmt->closeCursor();
  24. return $insetItemId;
  25. }
  26.  
  27. foreach($paramArr as $param){
  28. $paramName = $param;
  29. $stmt->execute();
  30. $id = $this->lastInsertId();
  31. array_unshift($insetItemIdArr, $id);
  32. }
  33. $stmt->closeCursor();
  34. return $insetItemIdArr;
  35.  


Wywala ostrzeżenie:
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in...
Nie wiem co jest nie tak z paramName, bo chyba o to krzyczy?
mlawnik
Moim zdaniem $bindParamName nie może zawierać się w podwójnych cudzysłowach, spróbój z pojedyńczymi lub bez.
Nie widzę, abyś tu deklarował $paramName, więc jak nie zadeklarowałeś to wali errory.
Pjotrek80
Cytat(mlawnik @ 12.08.2013, 23:50:09 ) *
Moim zdaniem $bindParamName nie może zawierać się w podwójnych cudzysłowach, spróbój z pojedyńczymi lub bez.
Nie widzę, abyś tu deklarował $paramName, więc jak nie zadeklarowałeś to wali errory.

Z pojedynczym też nie działa :/
Nie mam żadnych komunikatów odnośnie niezadeklarowanego $paramName. Nawet wcześniej ustawiałem wartość początkową ale nic to nie zmieniło.
mlawnik
http://stackoverflow.com/questions/1305381...was-not-defined

http://forums.devshed.com/php-development-...ned-942635.html

Sprawdź podane rozwiązania, generalnie chodzi o niezgadzającą się liczbę $bindParName i $paramName (zmień nazwę na paramValue, bardziej opisowa i adekwatna do zawartości)
Pjotrek80
Cytat(mlawnik @ 13.08.2013, 00:52:47 ) *
http://stackoverflow.com/questions/1305381...was-not-defined

http://forums.devshed.com/php-development-...ned-942635.html

Sprawdź podane rozwiązania, generalnie chodzi o niezgadzającą się liczbę $bindParName i $paramName (zmień nazwę na paramValue, bardziej opisowa i adekwatna do zawartości)


Nie występuje u mnie żaden z powyższych błędów (liczba parametrów po lewej i prawej stronie VALUES zgadza się. Nazwy po prawej stronie zgadzają się z nazwami w bindParam i bindValues) :/
nospor
Cytat
Z pojedynczym też nie działa :/
Nazwa parametrow ma byc bez zadanych pojedynczych czy podwojnych cudzyslowi.... skad zes to wymyslil ze ma tam byc cos takiego? Nazwa parametru skladak sie z dwukropka i nazwy - nic wiecej.

Poza tym twoj kod to jakas sieczka, ktorej nie idzie zrozumiec.
Pjotrek80
Cytat(nospor @ 13.08.2013, 10:06:42 ) *
Nazwa parametrow ma byc bez zadanych pojedynczych czy podwojnych cudzyslowi.... skad zes to wymyslil ze ma tam byc cos takiego? Nazwa parametru skladak sie z dwukropka i nazwy - nic wiecej.

Poza tym twoj kod to jakas sieczka, ktorej nie idzie zrozumiec.


Przykład z manuala:
  1. <?php
  2. /* Execute a prepared statement by binding PHP variables */
  3. $calories = 150;
  4. $colour = 'red';
  5. $sth = $dbh->prepare('SELECT name, colour, calories
  6. FROM fruit
  7. WHERE calories < :calories AND colour = :colour');
  8. $sth->bindParam(':calories', $calories, PDO::PARAM_INT);
  9. $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
  10. $sth->execute();
  11. ?>

Jak widać pierwszy parametr metody bindParam (czyli nazwa parametru) jest podany w apostrofach.
Czego konkretnie nie rozumiesz? Chętnie wytłumaczę
Crozin
@Pjotrek80: Twój problem jest bardziej fundamentalny. Nie odróżniasz składni języka, która wymaga by tekst ujęty był w cudzysłowie bądź apostrofach, od składni SQL-a, który tak się składa że jest umieszczany jako... zwykły tekst. Chociaż domyślam się, że rozumiesz różnicę pomiędzy poniższymi zapisami?
  1. var_dump('Ala ma kota');
  2. var_dump('"Ala ma kota"');
  3. var_dump('\'Ala ma kota\'');
nospor
Cytat
Jak widać pierwszy parametr metody bindParam (czyli nazwa parametru) jest podany w apostrofach.
facepalmxd.gif
Rety... bierzesz sie za powazniejsze rzeczy a masz totalny brak podstawowej wiedzy i nie odrozniasz co to zapisu tekstu bezposredni a zapis tekstu ze zmiennej....

Nie chce mi sie takiej podstawy wyjasniac wiec uwierz na slowo: twoje nazwy parametrow maja byc bez apostrofow. Kapisz?
Pjotrek80
Cytat(nospor @ 13.08.2013, 10:32:11 ) *
facepalmxd.gif
Rety... bierzesz sie za powazniejsze rzeczy a masz totalny brak podstawowej wiedzy i nie odrozniasz co to zapisu tekstu bezposredni a zapis tekstu ze zmiennej....

Nie chce mi sie takiej podstawy wyjasniac wiec uwierz na slowo: twoje nazwy parametrow maja byc bez apostrofow. Kapisz?


Nie mam teraz jak tego sprawdzić ale pewnie masz rację. Na razie dzięki za pomoc.

Cytat(Crozin @ 13.08.2013, 10:31:59 ) *
@Pjotrek80: Twój problem jest bardziej fundamentalny. Nie odróżniasz składni języka, która wymaga by tekst ujęty był w cudzysłowie bądź apostrofach, od składni SQL-a, który tak się składa że jest umieszczany jako... zwykły tekst. Chociaż domyślam się, że rozumiesz różnicę pomiędzy poniższymi zapisami?
  1. var_dump('Ala ma kota');
  2. var_dump('"Ala ma kota"');
  3. var_dump('\'Ala ma kota\'');

Już chyba rozumiem różnicę smile.gif dzięki

Cytat(nospor @ 13.08.2013, 10:32:11 ) *
facepalmxd.gif
Rety... bierzesz sie za powazniejsze rzeczy a masz totalny brak podstawowej wiedzy i nie odrozniasz co to zapisu tekstu bezposredni a zapis tekstu ze zmiennej....

Nie chce mi sie takiej podstawy wyjasniac wiec uwierz na slowo: twoje nazwy parametrow maja byc bez apostrofow. Kapisz?


Sprawdziłem bez apostrofów/cudzysłowu, nie działa :/ Pewnie to jakiś totalnie podstawowy błąd którego nawet w dziale "przedszkole" nie wypada analizować :/
nospor
Blad masz nadal ten sam?? Dokladnie ten sam??
Pokaz kod po zmianach
Pjotrek80
Cytat(nospor @ 13.08.2013, 17:35:40 ) *
Blad masz nadal ten sam?? Dokladnie ten sam??
Pokaz kod po zmianach


  1. }else {
  2. $hasParam = true;
  3. $paramArr = $value;
  4. $bindParName = ':'.$valueName;
  5. $stmt->bindParam($bindParName, $paramName);
  6. }



Różni się tylko tym, że $bindParName nie jest brane w apostrof.
Błąd dalej jest taki sam:
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in...
nospor
Ciapki brales w dwoch miejscach a zmiany pokazales tylko w jednym..... Pokaz caly kod po zmianach - caly.


Wskaz w kodzie dokladnie linie, ktorej dotyczy blad z komunikatu bledu.
Pjotrek80
Cytat(nospor @ 13.08.2013, 18:05:42 ) *
Ciapki brales w dwoch miejscach a zmiany pokazales tylko w jednym..... Pokaz caly kod po zmianach - caly.


Wskaz w kodzie dokladnie linie, ktorej dotyczy blad z komunikatu bledu.


  1. $stmt = $this->prepare($sql);
  2.  
  3. foreach($valuesArr as $valueName => $value){
  4. if(!is_array($value)){
  5. $bindValName .= ':'.$valueName;
  6. $stmt->bindValue($bindValName, $value);
  7. }else {
  8. $hasParam = true;
  9. $paramArr = $value;
  10. $bindParName = ':'.$valueName;
  11. $stmt->bindParam($bindParName, $paramName);
  12. }
  13. }
  14.  
  15. if(!$hasParam){
  16. $stmt->execute($valuesArr);
  17. $insetItemId = $this->lastInsertId();
  18. $stmt->closeCursor();
  19. return $insetItemId;
  20. }
  21.  
  22. foreach($paramArr as $param){
  23. echo $param,'<br/>';
  24. $paramName = $param;
  25. $stmt->execute(); <- Wskazuje na tą linie (błąd)
  26. $id = $this->lastInsertId();
  27. array_unshift($insetItemIdArr, $id);
  28. }
  29. $stmt->closeCursor();
  30. return $insetItemIdArr;
nospor
No i super

$stmt->bindParam($bindParName, $paramName);
Nigdzie nie widze zdefiniowanej zmiennej $paramName

edit:
a nie, jest, tutaj
$paramName = $param;

Ino ze to jest juz po jej wykorzystaniu.... kolejnosc wykonywania kodu tez by sie przydalo opanowac
Pjotrek80
Cytat(nospor @ 13.08.2013, 18:28:32 ) *
No i super

$stmt->bindParam($bindParName, $paramName);
Nigdzie nie widze zdefiniowanej zmiennej $paramName


Definiowałem ją, ale też to nic nie zmieniło :/

Cytat(Pjotrek80 @ 13.08.2013, 18:31:12 ) *
Definiowałem ją, ale też to nic nie zmieniło :/


Poszło smile.gif
Zadeklarowałem $bindParName i $bindValName i poszło. Jasna cholera...
Jeszcze raz dzięki za zaangażowanie.
Crozin
Najprawdopodobniej w SQL-u masz :paramert_abc, a bindujesz :parametr_def. Sprawdź sobie finalną treść zapytania oraz listę parametrów jakie do niego podajesz.
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.