Я пытаюсь сделать функцию 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()
к каждому строковому ключу ассоциативного массива.