PDOStatement :: bindParam не работает после первого вызова

У меня есть небольшая проблема в написании простого класса, который использует PDO для подключения к БД.
Проблема в том, что PDOStatement :: bindParam не работает после первого вызова в цикле. Я имею в виду, что если у меня есть два параметра для передачи в PDOStatement, запрос не возвращает точный результат, вместо этого, если я даю только один параметр это дает правильный результат.

Вот код:

public function query($sql, $params = NULL) {
// Opens the PDO connection
$this->open();

$this->stmt = $this->pdo->prepare($sql);

if (isset($params)) {
foreach ($params as $key => $value) {
// This doesn't work after the second cicle.
$this->stmt->bindParam(':' . $key, $value);
}
}

$result = NULL;
if (!$this->stmt->execute()) {
$result = false;
} else {
$result = $this->stmt->fetchAll();
}

// Closes the PDO connection
$this->close();

return $result;
}

А вот PDOStatement :: debugDumpParams:

SQL: [114]
SELECT 1
FROM   users
WHERE  EXISTS
(
SELECT *
FROM   users
WHERE  username = :username
AND    password = :password) limit 1
PARAMS: 2
KEY:NAME: [9] :username paramno=0 NAME=[9] ":username" is_param=1 param_type=2
KEY:NAME: [9] :password paramno=1 NAME=[9] ":password" is_param=1 param_type=2

Спасибо за помощь!

0

Решение

TL; DR всегда использую bindValue() если вы не хотите использовать специальное поведение bindParam(),

foreach ($params as $key => $value) {
// This doesn't work after the second cicle.
$this->stmt->bindParam(':' . $key, $value);
}

Причиной того, что это не работает должным образом, является неправильное представление о том, что означает PDO с bindParam(), Это не означает «привязать параметр SQL», но «привязать значение (то есть параметр для bindParam ()) в качестве ссылочной переменной «. Таким образом, когда execute() называется, он будет использовать значение для $value (которая является переменной, связанной со всеми параметрами SQL) во время выполнения, а не во время bindParam() назывался.

Ср http://php.net/manual/en/pdostatement.bindparam.php где это поведение объясняется.

Решение заключается в использовании bindValue() вместо bindParam(),

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]