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


Прошло более часа на этом:(
Пусть этот ответ поможет некоторым людям, имеющим этот глупый тривиальный вопрос.