我正在尝试使用PDO从MySQL数据库中获取数据。例如,如果用户的ID是 2767207 ,我会运行blixUserGetInfo("2767207")
。
但是,每当我使用 0 以外的用户ID运行它时,blixUserGetInfo("0")
,将返回null
,并且不会引发任何错误,即使提供的ID <数据库中存在strong> 。
function blixUserGetInfo($userid){
$connection = //database connection
// replacing this with
// "SELECT * FROM `users` WHERE `id` = $userid"
// works for some reason
$statement = "SELECT * FROM `users` WHERE `id` = ?";
$prepared = $connection->prepare($statement);
$prepared->bindValue(1, $userid); //returns TRUE
$prepared->execute(); //also returns TRUE
$code = $prepared->errorCode(); //returns '00000' (no error)
return $prepared->fetch(); //returns null
}
但是,如果我从
更改$statement
“SELECT * FROM`users` WHERE`id` =?”
到
“SELECT * FROM`users` WHERE`id` = $ userid”
并删除bindValue
语句,它按预期工作。
我也尝试将bindValue
语句更改为bindValue(1, $userid, PDO::PARAM_INT)
,但仍然没有运气。两次声明returns true
。
为什么第一个示例不起作用like it should?这是一个错误,我做错了什么,还是预期的行为?
答案 0 :(得分:3)
除非绝对必要,否则我真的不喜欢这种bindValue
和bindParam
复杂性。您可以使用execute
$statement = "SELECT * FROM `users` WHERE `id` = ?";
$prepared = $connection->prepare($statement);
$prepared->execute(array($userid));
虽然我知道这并没有回答为什么bindValue无法正常工作,但它不必担心通过引用传递并传递值可能是这个问题的一个因素。
如果此execute
没有返回错误,并且您的表确实包含该条件的数据,那么它几乎肯定会返回它。
虽然我没有确认,但您在获取之前将连接设置为null的行为可能是您无法查看任何数据的实际原因。为什么要将连接设置为NULL
并尝试在之后获取?
答案 1 :(得分:0)
我建议您不再使用bindValue()
功能。
在这种情况下,bindParam()
函数效果更好。使用值占位符代替?
的{{1}})
:[placeholder name]