Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PDO] Błąd wykonania skryptu
Forum PHP.pl > Forum > PHP
ze4lot
Błąd:
Kod
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /system/autoresponder.php on line 84



Skrypt, który go generuje. Nie mam zielonego pojęcia jak to rozwiązać... proszę o pomoc.
  1. <?
  2. @include('engine.php');
  3. class arEngine extends standart
  4. {
  5. public function getEmailList($table, $conditions)
  6. {
  7. $this->dbs();
  8.  
  9. foreach($conditions as $name => $value)
  10. {
  11. if(!is_array($value))
  12. {
  13. $cond[][$name] = $value;
  14. } else {
  15. foreach($value as $element=>$val)
  16. {
  17. $cond[][$name] = $val;
  18. }
  19. }
  20. }
  21. $i=0;
  22. $j=0;
  23. $query = "SELECT * FROM ".$table." WHERE ";
  24. foreach($cond as $id => $name)
  25. {
  26. foreach($name as $name2 => $val);
  27. {
  28. $temp = $name2."=:".$name2;
  29. $queryElement[] = $temp;
  30.  
  31. if($i>0)
  32. {
  33. $end = end($queryElement);
  34. if(prev($queryElement) == $temp)
  35. {
  36. ++$j;
  37. } else {
  38. $j=0;
  39. }
  40. $bind[] = array(":".$name2.$j, $val);
  41. } else {
  42. $bind[] = array(":".$name2.$j, $val);
  43. }
  44.  
  45. $i++;
  46. }
  47. }
  48. $queryElementSize = count($queryElement);
  49. $j=0;
  50. for($i=0;$i<$queryElementSize;$i++)
  51. {
  52. if($queryElement[$i] != $queryElement[$i-1] && $queryElement[$i] != $queryElement[$i+1])
  53. {
  54. $query .= $queryElement[$i];
  55. if($i<($queryElementSize-1))
  56. {
  57. $query .= " AND ";
  58. }
  59. } else {
  60. if($queryElement[$i] != $queryElement[$i-1])
  61. {
  62. $query .= "(";
  63. }
  64. $query .= $queryElement[$i];
  65. if( $queryElement[$i] == $queryElement[$i+1])
  66. {
  67. $query .= $j." OR ";
  68. } else {
  69. $query .= $j.") ";
  70. if($queryElement[$i+1])
  71. {
  72. $query .= "AND ";
  73. }
  74. }
  75. $j++;
  76. }
  77. }
  78. unset($j);
  79. $stmt=$this->pdo->prepare($query);
  80. foreach($bind as $bindValue)
  81. {
  82. $stmt->bindValue($bindValue[0], $bindValue[1]);
  83. }
  84. $stmt -> execute();
  85. while($row = $stmt -> fetch())
  86. {
  87. foreach($row as $name->$value)
  88. {
  89. $list[$name] = $value;
  90. }
  91. }
  92. $stmt -> closeCursor();
  93. if(count($list)>0)
  94. {
  95. return $list;
  96. } else {
  97. return false;
  98. }
  99. }
  100. }
  101.  
  102. $conds = array('cos1' => array(1, 2, 'abc'),
  103. 'cos2' => 'foo',
  104. 'cos3' => 'bar'
  105. );
  106.  
  107. $ar = new arEngine;
  108. $email_list = $ar -> getEmailList('konta', $conds);
  109. print_r($email_list);
  110. ?>


engine.php
  1. class standart
  2. {
  3. ...
  4. public function dbs() {
  5. $db_user = "usuniete by mod";
  6. $db_pass = "usuniete by mod";
  7. $db_dsn = "usuniete by mod";
  8. $this->pdo = new PDO($db_dsn, $db_user, $db_pass);
  9. }
  10. ...
  11. }
Zyx
Na mój gust Twój super-rozbudowany algorytm generowania zapytania ma jakiś błąd i albo podpina za mało argumentów pod zapytanie, albo generuje za dużo argumentów. Sprawdź w pierwszej kolejności, jaka jest postać uzyskanego zapytania oraz jakie dane są do niego pakowane.
nospor
a ja dodam jeszcze, że Twoj problem z obiektówką nie ma żadnego związku, więc przenoszę.
phpion
A ja dodam jeszcze... winksmiley.jpg, że świetnym posunięciem było publiczne podawanie danych dostępowych do bazy danych smile.gif
ze4lot
najwyższa pora pracować w dzień a nie w nocy...
zaraz się biorę za przerabianie. Dzięki

*** EDIT BŁĄD ZNALEZIONY ***

zapytanie $query:
  1. SELECT * FROM konta WHERE (cos=:cos0 OR cos=:cos1 OR cos=:cos2) AND foo=:foo AND bar=:bar


pętla tworząca bindy generuje:
  1. bindValue(:cos0, wartosc1);
  2. bindValue(:cos1, wartosc2);
  3. bindValue(:cos2, wartosc3);
  4. bindValue(:foo0, wartosc4);
  5. bindValue(:bar0, wartosc5);


czyli

bindy, które się nie powtarzają (foo i bar) mają dopisaną wartość '0' natomiast w zapytaniu są bez tego zera.

*** EDIT ***

może jest tu jakaś osoba co dysponuje większą ilością czasu i potrafi moje wypociny zamienić na prawdziwe OOP? na prawdę przydała by mi się porządna lekcja
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.