PDO bindParam() с подготовленным оператором не работает
Хорошо, это проблема:
Это работает:
$STH = $DBH->prepare("SELECT * FROM juegos WHERE id = 1");
$STH->execute();
Это не означает:
$STH = $DBH->prepare("SELECT * FROM juegos WHERE id = :id");
$STH->bindParam(':id', '1', PDO::PARAM_STR);
$STH->execute();
Что в мире я делаю неправильно? Это даже не исключение.
Спасибо всем!
Кроме того, это весь код
<?php
try {
$DBH = new PDO("everything is", "ok", "here");
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$STH = $DBH->prepare("SELECT * FROM juegos WHERE id = :id");
$STH->bindParam(':id', '1', PDO::PARAM_STR);
$STH->execute();
$STH->setFetchMode(PDO::FETCH_ASSOC);
while($row = $STH->fetch()) {
echo $row['nombre']."<br/>";
}
$DBH = null;
echo "Todo salió bien";
} catch (PDOException $e) {
echo "Error";
}
?>
Ответы
Ответ 1
Используя bindParam()
переменная связывается как ссылка.
Строка не может быть передана по ссылке.
Следующие вещи могут быть переданы по ссылке:
Переменные, т.е. foo ($ a)
Новые операторы, т.е. foo (новый foobar())
Ссылки, возвращаемые из функций
Попробуйте использовать bindValue()
$STH->bindValue(':id', '1', PDO::PARAM_STR);
Ответ 2
Значение параметра :tabla
будет автоматически процитировано и экранировано PDO. Выполненный запрос будет выглядеть следующим образом:
SELECT * FROM 'juegos'
который недействителен SQL.
Ответ 3
PHP BinParam()
Привязывает переменную PHP к соответствующему заполнителю имени или вопроса в выражении SQL, который использовался для подготовки оператора.
Правильный способ использования bindParam:
$id = 1;
$sth = $DBH->prepare("SELECT * FROM juegos WHERE id = :id");
$sth->bindParam(':id', $id, PDO::PARAM_INT);// use bindParam to bind the variable
:id //represents the variable
$id //is the variable being represented by ':id',
PDO::PARAM_INT //states that the value of the variable $id should be a string
PHP BindValue()
Привязывает значение соответствующему заполнителю имени или вопроса в выражении SQL, который использовался для подготовки оператора.
$id=10;
$name=roadkill;
$sth = $dbh->prepare('SELECT *
FROM juegos
WHERE id < :id AND name = :name');
$sth->bindValue(':id', $id, PDO::PARAM_INT);// use bindValue to bind the variable value
$sth->bindValue(':name', $name, PDO::PARAM_STR);// use bindValue to bind the variable value
Ключевое различие между этими двумя методами заключается в том, что в отличие от PDOStatement::bindValue()
, при bindParam()
переменная привязана как ссылка и будет оцениваться только во время вызова PDOStatement::execute()
.
Ответ 4
не передавать значение непосредственно BindParam.
try {
// $DBH = new PDO("everything is", "ok", "here");
$DBH = new PDO("mysql:host=localhost;dbname=test", 'root', '');
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$STH = $DBH->prepare("SELECT * FROM statstracker WHERE SrNo = :id");
$id = 1; // here you should keep it as variable and pass it to param
$STH->bindParam(':id', $id, PDO::PARAM_STR);
$STH->execute();
$STH->setFetchMode(PDO::FETCH_ASSOC);
while($row = $STH->fetch()) {
echo $row['SrNo']."<br/>";
}
$DBH = null;
echo "Todo salió bien";
} catch (PDOException $e) {
echo "Error";
}
Ответ 5
Для меня замена двойной кавычки одинарной кавычкой устранила проблему.
Предыдущая $ STH = $DBH-> prepare ("ВЫБЕРИТЕ * ИЗ СТРАСТКРАТОРА, ГДЕ SrNo =: id");
Решение: $ STH = $DBH-> prepare ('SELECT * FROM statstracker WHERE SrNo =: id');
И это работает, хотя не уверен, почему.
Надеюсь, поможет!