PDO即使没有绑定任何参数仍然得到结果

时间:2014-08-08 14:43:35

标签: php mysql pdo

我试图产生一些异常来测试函数,所以我没有故意将任何数组传递给$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注入。

在我的情况下设置它似乎只是为了允许注射。

有什么想法吗?

2 个答案:

答案 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);

启用例外。