PDOStatement的bindValue仅使用值“0”

时间:2015-06-23 05:13:30

标签: php mysql pdo

我正在尝试使用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?这是一个错误,我做错了什么,还是预期的行为?

2 个答案:

答案 0 :(得分:3)

除非绝对必要,否则我真的不喜欢这种bindValuebindParam复杂性。您可以使用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]
相关问题