Почему биндить в PDO надо обязательно переменную?

Поставил сервер с PHP 7.4
Так работает
$tel = '79998887766';
$b=$pdo->prepare(" INSERT INTO `main` SET tel=:tel");
$b->bindParam(":tel", $tel);


Так ошибка
$b=$pdo->prepare(" INSERT INTO `main` SET tel=:tel");
$b->bindParam(":tel", '79998887766');

Fatal error: Uncaught Error: Cannot pass parameter 2 by reference in... указана строка с bindParam

Я помню я раньше указывал значения вручную и всё работало. Теперь это грех и обязательно нужна переменная? )) Это можно поменять где ни будь в настройках конфигурационных файлов?
  • Вопрос задан
  • 138 просмотров
Решения вопроса 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Ну вообще-то в сообщении об ошибке всё сказано. C bindParam можно использовать только переменные. Потому что биндинг идёт по ссылке (by reference). А на строку, вписанную прямо в коде, ссылку не поставишь. В этом случае надо использовать другой метод
$b=$pdo->prepare(" INSERT INTO `main` SET tel=:tel");
$b->bindValue(":tel", '79998887766');

или вообще передавать данные сразу в execute():
$pdo->prepare(" INSERT INTO `main` SET tel=:tel")->execute(["tel" => '79998887766']);

и всё будет работать
Ответ написан
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Потому что при таком подходе можно переиспользовать подготовленное выражение - один раз prepare + bind'ы и потом множество раз execute()
$tel = '79998887766';

$b=$pdo->prepare(" INSERT INTO `main` SET tel=:tel");
$b->bindParam(":tel", $tel);

$b->execute();

$tel = '5454545454';
$b->execute();

$tel = '1231231233';
$b->execute();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы