简短版本(没有尝试和捕获):
$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
的属性。是否有可能以某种方式限制我认为我绑定的东西?
答案 0 :(得分:2)
使用预先准备好的陈述时,请不要引用您想要的内容并注入'安全地进入声明。
如果您查询
"SELECT * FROM table WHERE user = 'some-user'"
它将真正寻找具有该名称的用户,这就是为什么它真正寻找用户":lot"当您查询数据库时。
改为使用
"SELECT * FROM table WHERE user = :user_name"
bindParam->(':user_name', $var);
->execute ();
现在它会安全地将$ var注入预处理语句,然后你可以执行它