【发布时间】:2017-12-05 23:22:17
【问题描述】:
代码如下:
<?php
$dbh = new \PDO('sqlite:');
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$goodSql = 'SELECT number FROM (SELECT 1 number UNION SELECT 2) numbers WHERE number not in (2)';
echo json_encode($dbh->query($goodSql)->fetchAll(PDO::FETCH_NUM));
$badSql = 'SELECT number FROM (SELECT 1 number UNION SELECT 2) numbers WHERE number not in (?)';
$binds = ['2'];
$statement = $dbh->prepare($badSql);
$statement->execute($binds);
echo json_encode($statement->fetchAll(PDO::FETCH_NUM));
?>
第一条语句成功地从结果中排除了2。排除由内联 SQL 条件 NOT IN (2) 指定。
第二条语句未能从结果中排除2。排除由参数2 在条件NOT IN (?) 中的PDO 绑定指定。
在 PDO/MySQL 中,这两个语句产生相同的结果。
发生了什么?这是一个错误还是记录了这个结果?
附:我已经使用https://3v4l.org/otfDj 在所有 PHP 版本上对此进行了测试,并在 5.6.0 - 5.6.30、7.0.0 - 7.2.0alpha2 中得到了相同的结果。
【问题讨论】: