PDO проходит по ссылке?

Эта:

$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(); 

бежит без жалобы.

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

Второй параметр bindParam – это ссылка на переменную. Поскольку возврат функции нельзя ссылаться, она не в полной мере отвечает потребностям параметра 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(); 

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

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

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

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

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

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

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