Предупреждение: PDOStatement :: bindValue (): SQLSTATE : Недопустимый номер параметра: Столбцы / Параметры основаны на 1

Я пытаюсь сделать функцию query следующим образом:

 public function Query( $sql, $params = array() ) { $this->error = false; if ( $this->query = $this->pdo->prepare( $sql ) ) { for ( $i = 0, $size = count( $params ); $i < $size; $i ++ ) { echo $i; $this->query->bindValue( $i, $params[ $i ] ); } if ( $this->query->execute() ) { echo 'suc'; } } } 

и назовите его так:

 $mysql->Query( "SELECT * FROM `client_info` WHERE `name` = ? AND `password`= ?", array( 'test', 'test' ) ); 

и результат:

 Warning: PDOStatement::bindValue(): SQLSTATE[HY093]: Invalid parameter number: Columns/Parameters are 1-based Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens 

Я понятия не имею, что здесь не так, все должно быть хорошо, и это должно работать!

  $i = 0 

А также

Предупреждение: PDOStatement :: bindValue (): SQLSTATE [HY093]: Недопустимый номер параметра: Столбцы / Параметры основаны на 1

Сравните эти две вещи, вы заметите, что ваш $i должен начинаться с 1, а не 0.

Это также можно подтвердить из руководства PHP

параметр

Идентификатор параметра. Для подготовленного оператора с использованием именованных заполнителей это будет имя параметра формы: name. Для подготовленного заявления с использованием заполнителей вопросительных знаков это будет 1-индексированная позиция параметра.

Вы также можете получить эту проблему, когда делаете что-то так же просто, как наличие перепутанной функции абстракции, и в итоге вы передаете массив bindValue (), когда он должен быть строкой, например:

 $a = array(':slug','mickey1'); $st = $PDO->prepare($sSQL); $st->bindValue(':slug',$a); // the bug! 

В моем случае я должен был бы сделать array(':slug' => 'mickey1') $a как array(':slug' => 'mickey1') и должен был повторить мой массив, чтобы я мог bindValue() к каждому строковому ключу ассоциативного массива.