Prepared语句不返回任何行

时间:2015-04-10 15:23:14

标签: php mysql pdo prepared-statement

简短版本(没有尝试和捕获):

$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()返回false,但如果我使用以下SQL语句手动查询我的数据库,则会返回一行:

SELECT * FROM bin_content WHERE LotId="A32";

我绑定$filter对象的属性,因为查询是动态的,具体取决于$filter的属性。是否有可能以某种方式限制我认为我绑定的东西?

1 个答案:

答案 0 :(得分:2)

使用预先准备好的陈述时,请不要引用您想要的内容并注入'安全地进入声明。

如果您查询

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

它将真正寻找具有该名称的用户,这就是为什么它真正寻找用户":lot"当您查询数据库时。

改为使用

"SELECT * FROM table WHERE user = :user_name"

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

->execute ();

现在它会安全地将$ var注入预处理语句,然后你可以执行它