Эта:
$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();