好的,这就是问题所在:
这有效:
$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";
}
?>
答案 0 :(得分:17)
使用bindParam()
变量为bound as a reference。
字符串can't be passed by reference。
以下内容可以通过引用传递:
变量,即foo($ a)
新陈述,即foo(new foobar())
从函数返回的引用
尝试使用bindValue()
$STH->bindValue(':id', '1', PDO::PARAM_STR);
答案 1 :(得分:2)
:tabla
参数的值将由PDO自动引用和转义。执行的查询将变为:
SELECT * FROM 'juegos'
这是无效的SQL。
答案 2 :(得分:2)
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's value
$sth->bindValue(':name', $name, PDO::PARAM_STR);// use bindValue to bind the variable's value
这两种方法的主要区别在于,与PDOStatement::bindValue()
不同,bindParam()
将变量绑定为引用,并且仅在调用PDOStatement::execute()
时进行评估。 / p>
答案 3 :(得分:0)
不要将值直接传递给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";
}
答案 4 :(得分:0)
对我来说,用单引号代替双引号可以解决此问题。
上一个 $ STH = $ DBH-> prepare(“ SELECT * FROM statstracker WHERE SrNo =:id”);
解决方案: $ STH = $ DBH-> prepare('SELECT * FROM statstracker WHERE SrNo =:id');
它可以工作,尽管不确定为什么。
希望有帮助!