На этой странице буду собирать интересные нюансы работы Pdo.

Как видно выше, после выполнения функции execute, переменная $int теперь имеет строковый тип данных.
Как известно, функция PDOStatement::bindParam принимает значение по ссылке и вроде бы ничего страшного, но с переменными происходит магия (значение не меняется, тип не меняется, debugDumpParams говорит, что все хорошо, но выполнится SQL-запрос уже не может).
$dsn = 'pgsql:host=my-postregsql;port=5433;dbname=customer';
$dbh = new PDO($dsn, 'user', 'pass');
$stmt = $dbh->prepare('
UPDATE
public.customer
SET
bonus=:bonus
WHERE
customer_id=:customer_id
');
$params = [
'bonus' => false,
'customer_id' => 132,
];
foreach ($params as $field => $value) {
$type = $field === 'bonus' ? \PDO::PARAM_BOOL : \PDO::PARAM_INT;
// не работает (см. ошибку ниже):
// $stmt->bindParam(':' . $field, $value, $type);
// работает:
$stmt->bindParam(':' . $field, $params[$field], $type);
}
// в обоих случаях $stmt->debugDumpParams(); будет одинаков
$stmt->execute();// в случае с передачей $value в bindParam, ф-я execute вернет: bool(false)
print_r($stmt->errorInfo());// в случае с передачей $value в bindParam, ф-я errorInfo вернет массив:
// Array
// (
// [0] => 22P02
// [1] => 7
// [2] => ОШИБКА: неверное значение для логического типа: "132"
// )
Удачки.
Комментарии
Комментариев пока нет.