准备好的语句 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 注入准备好的语句中,然后你就可以执行它了
简要版本(没有 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 注入准备好的语句中,然后你就可以执行它了