SQLSTATE [HY093]: неверный номер параметра: параметры не были связаны, но параметры предоставляются
Я создаю объект базы данных, который соединяет объект PDO
с объектом PDOStatement
, чтобы цепочка была доступна. В основном я просто использую методы, которые я чаще всего использую, но bindParam
дает мне трудное время.
private $stmt = null;
...
public function prepare($statement,array $driver_options = array()) {
if($this->stmt) throw new \Exception('PDO Statement already prepared, no override!');
$this->stmt = parent::prepare($statement, $driver_options);
return $this;
}
public function bindParam($place, &$val, $dataType){
if(!$this->stmt) throw new \Exception('PDO Statement is empty');
$this->stmt->bindParam($place, $val, $dataType);
return $this;
}
public function execute(array $params = array()){
if(!$this->stmt) throw new \Exception('PDO Statement is empty');
$this->stmt->execute($params);
return $this;
}
public function fetchAll($pdoFetchType){
if(!$this->stmt) throw new \Exception('PDO Statement is empty');
return $this->stmt->fetchAll($pdoFetchType);
}
...
public function getStmt(){
return $this->stmt;
}
public function clearStmt(){
$this->stmt = null;
}
Я получаю ошибку, начиная с заголовка, в этом коде:
$i = 0;
$db->prepare('SELECT * FROM users LIMIT ?,1')->bindParam(1, $i, \PDO::PARAM_INT);
while($row = $db->execute()->fetchAll(\PDO::FETCH_ASSOC)){
echo "<pre>".print_r($row, true)."</pre>";
$i++;
}
В основном то, что я узнал об этой ошибке, заключается в том, что оно возникает, когда предоставленные переменные в bindParam
равны null
, но $i
явно не является нулевым. Можете ли вы мне помочь?
EDIT: также работает
var_dump($this->stmt->bindParam($place, $val, $dataType));
в методе bindParam
возвращает TRUE
. Из руководства:
Возвращаемые значения
Возвращает TRUE при успешном завершении или FALSE при сбое.
Успешно, но не связывает параметр??? Я чувствую, что мой мозг скоро взорвется.
Ответы
Ответ 1
Я думаю, что использование ссылки &$val
вместо значения $val
является причиной этой проблемы.
Вместо этого попробуйте использовать этот код:
public function bindParam($place, $val, $dataType)
{
if(!$this->stmt) throw new \Exception('PDO Statement is empty');
$this->stmt->bindParam($place, $val, $dataType);
return $this;
}
ИЗМЕНИТЬ
Мой ответ неправильный.
Попробуйте изменить метод execute
:
public function execute(array $params = array()){
if(!$this->stmt) throw new \Exception('PDO Statement is empty');
$this->stmt->execute();
return $this;
}
Передача пустого массива в качестве параметра метода execute
удаляет все предыдущие привязки. Вот почему bindParam
возвратил true (успешно привязан), но при этом не указана ошибка "no params bound", как только вы вызвали execute
.
Ответ 2
Получена та же ошибка, но другая причина
У моего запроса были комментарии, в одном из которых был проклятый вопросительный знак.
Для PDO "?
" - это, конечно же, параметр для привязки.
У моего запроса больше ничего не возникало, и я понятия не имел, где PDO будет изобретать "параметр", пока я его не использовал, так как я всегда использую названные заполнители, например :value
Прошло более часа на этом:(
Пусть этот ответ поможет некоторым людям, имеющим этот глупый тривиальный вопрос.