PDO передать по ссылке уведомления? - PullRequest
8 голосов
/ 21 июля 2011

Это:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color");
$stmt->bindParam(':color', $someClass->getColor());
$stmt->execute();

дает это:

Уведомление во время выполнения
Передавать только переменные ссылка

хотя он все еще выполняется.

Это:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color");
$tempColor = $someClass->getColor();
$stmt->bindParam(':color',$tempColor);
$stmt->execute();

работает без жалоб.

Я не понимаю разницу?

Ответы [ 4 ]

9 голосов
/ 21 июля 2011

В описании PDOStatement::bindParam() говорится, что оно связывает переменную PHP с меткой квеста или именованным заполнителем.Так как вы пытаетесь передать метод класса (даже если этот метод возвращает значение), он все еще не является именем переменной, отсюда и предупреждение.Возможно, вы захотите взглянуть на PDOStatement::bindValue(), чтобы защитить свой код в будущем.

6 голосов
/ 21 июля 2011

Второй параметр bindParam - это переменная reference .Поскольку на функцию return нельзя ссылаться, она не в состоянии строго удовлетворить потребности параметра bindParam (хотя PHP будет работать с вами и только выдаст здесь предупреждение).

Чтобы получить лучшее представление, вот пример: этот код даст те же результаты, что и ваш второй пример:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color");
$tempColor = NULL; // assigned here
$stmt->bindParam(':color',$tempColor);
$tempColor = $someClass->getColor(); // but reassigned here
$stmt->execute();

Это невозможно при возврате функции.

2 голосов
/ 21 июля 2011

Если вы хотите избежать присвоения значения переменной, вам лучше попробовать:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = ?");
$stmt->execute(array($someClass->getColor()));

Как уже упоминалось, ошибка вызвана тем, что PDO :: Statement-> bindParam ожидает, что параметр 2 будет переменной, переданной по ссылке.

0 голосов
/ 19 апреля 2016

Если вы действительно хотите связать значение вместо ссылки, вы можете использовать PDOStatement :: bindValue , и тогда ваш код будет выглядеть примерно так:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color");
$stmt->bindValue('color', $someObject->getColor());
$stmt->execute();
...