准备好的语句 returns 没有行

Prepared statement returns no rows

简要版本(没有 try 和 catches):

$dbConnection = new PDO("mysql:host=$serverName;dbname=$dbName", $userName, $password, $dbOptions);
$dbStatement = $dbConnection->prepare('SELECT * FROM bin_content WHERE LotId=":lot";');
dbStatement->bindParam(':' . $key, $filter->$key);
// $filter->lot contains "A32" and $key="lot",
// so I'm assuming "A32" will be filled into the statement
$dbStatement->execute(); // this is actually in a try/catch, and no exceptions are caught here
$row = $dbStatement->fetch(); // this returns false

上面代码中提到了fetch()returnsfalse,但是如果我用下面的SQL语句手动查询我的数据库,返回一行:

SELECT * FROM bin_content WHERE LotId="A32";

我正在绑定 $filter 对象的 属性,因为查询是动态的,具体取决于 $filter 的属性。有没有可能我没有绑定我认为我绑定的东西?

使用准备好的语句时,不要在语句中安全地引用您以后想要'inject'的内容。

如果你查询这个

"SELECT * FROM table WHERE user = 'some-user'" 

它会逐字查找具有该名称的用户,这就是当您查询数据库时它逐字查找用户“:lot”的原因。

改为使用

"SELECT * FROM table WHERE user = :user_name"

bindParam->(':user_name', $var);

->execute ();

现在它会安全地将 $var 注入准备好的语句中,然后你就可以执行它了