我试图产生一些异常来测试函数,所以我没有故意将任何数组传递给$stmt->execute()
,我希望得到一个异常,或者什么都没有(因为没有匹配的结果),但我仍然可以取一些东西并打印出来???
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql='Select id from books where bookname=?';
$stmt=$conn->prepare($sql);
$stmt->execute();
if($row=$stmt->fetch(PDO::FETCH_ASSOC)){
print_array($row); //print_array is a function can print out key and the value
}
打印出来
[id] => 123 (just an example)
如果我将查询更改为
'Select * from books where bookname= ?';
打印出表格中的第一行数据。
我想知道execute()和fetch()之间发生了什么....我在phpmyadmin中直接尝试了那些查询(我可以想象当他们到达DB时查询会是怎样的),但是没有&#39 ;得到相同的结果。
Select id from books where bookname= ?
Select id from books where bookname= '?'
Select id from books where bookname= ''
Select id from books where bookname= ' '
到目前为止,PDO让我感到惊讶......
BTW我甚至var_dump($stmt->execute())
并返回true
。
更新
我打开了
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
并尝试打印出$conn->errorInfo()
和$stmt->errorInfo()
没有错误消息。还是得到了结果。
但是,当我设置$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
我得到了PDOException:
SQLSTATE[HY093]: Invalid parameter number: no parameters were bound' in ...
如果我关闭它,它无论如何都会在execute()中有或没有数组。
但许多文章都希望此属性为false,以防止SQL注入。
在我的情况下设置它似乎只是为了允许注射。
有什么想法吗?
答案 0 :(得分:2)
您已经执行了其他您认为的陈述
$conn->prepare($sql); // there is no assign
$stmt->execute();
将其更改为
$stmt = $conn->prepare($sql); // there is assign
$stmt->execute();
答案 1 :(得分:0)
PDO默认为无提示错误,例如失败时返回布尔值false
。除非你明确地打开异常,否则它永远不会抛出任何异常。
由于您的代码没有检查返回值,因此您永远不会得到任何失败的迹象,例如
$conn->prepare($sql) or die($conn:errorInfo);
会告诉你什么。
尝试
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
启用例外。