【问题标题】:PDO Still get result even if didn't bind any parameterPDO 即使没有绑定任何参数,仍然得到结果
【发布时间】:2014-08-18 22:55:30
【问题描述】:

我试图产生一些异常来测试函数,所以我没有将任何数组传递给$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 中尝试了这些查询(我可以想象当它们到达数据库时查询会是什么样子),但没有得到相同的结果。

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 对我来说充满了惊喜....

顺便说一句,我什至 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 注入。

在我的情况下,将其设置为 false 似乎只是为了允许以某种方式注入。

有什么想法吗?

【问题讨论】:

  • 提供真实代码或重现行为所需的最短代码。
  • 此代码生成完全相同的结果。我只是更改了表名

标签: php mysql pdo


【解决方案1】:

你已经执行了你认为的其他语句

$conn->prepare($sql); // there is no assign
$stmt->execute();

改成

$stmt = $conn->prepare($sql); // there is assign
$stmt->execute();

【讨论】:

  • 更新了我的代码,真正的代码是这样分配的,但仍然会产生结果。
  • 在我的真实代码中就像你想让我改变的一样。我为这个问题制作了一个示例代码。
【解决方案2】:

PDO 默认为静默错误,例如失败时返回布尔值false。除非您明确打开异常,否则它永远不会抛出任何异常。

而且由于您的代码不检查返回值,因此您永远不会得到任何失败的迹象,例如

$conn->prepare($sql) or die($conn:errorInfo);

会告诉你一些事情的。

试试

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

启用例外。

【讨论】:

  • 我也试过了......它只是打印出正常的东西
猜你喜欢
  • 2014-05-12
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多