Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PDO] Błąd wykonania skryptu, SQLSTATE[HY093]: Invalid parameter number:...
ze4lot
post
Post #1





Grupa: Zarejestrowani
Postów: 54
Pomógł: 1
Dołączył: 29.03.2007
Skąd: Kraków

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


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. }
Powód edycji: [nospor]: usunalem dane dostępowe do bazy
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Zyx
post
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


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.
Go to the top of the page
+Quote Post
nospor
post
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




a ja dodam jeszcze, że Twoj problem z obiektówką nie ma żadnego związku, więc przenoszę.
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




A ja dodam jeszcze... (IMG:style_emoticons/default/winksmiley.jpg) , że świetnym posunięciem było publiczne podawanie danych dostępowych do bazy danych (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
ze4lot
post
Post #5





Grupa: Zarejestrowani
Postów: 54
Pomógł: 1
Dołączył: 29.03.2007
Skąd: Kraków

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


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

Ten post edytował ze4lot 16.11.2009, 15:29:51
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 18:34