PDO :: ATTR_EMULATE_PREPARES打破了一个简单的命令

时间:2018-09-16 15:07:50

标签: php mysql

我有一个非常简单的MCVE,即使没有表/数据库也会受到影响:

<?php
$pdoConnection = new PDO( "mysql:host=<hostname>", "<user>", "<pwd>" );
$pdoConnection->setAttribute( PDO::ATTR_EMULATE_PREPARES, TRUE );
$command = $pdoConnection->prepare("SELECT IF('1', -:foo, :foo) AS FOO");
$command->bindValue( "foo", 1, PDO::PARAM_INT );
$command->execute();
echo "<pre>";
print_r($command->fetch(PDO::FETCH_ASSOC));
?>

结果符合预期:

Array
(
    [FOO] => -1
)

通过禁用准备仿真
$pdoConnection->setAttribute( PDO::ATTR_EMULATE_PREPARES, TRUE );

完全破坏了代码。没有错误,也没有任何输出,因为即使是常规且正确的MySQL代码也没有执行任何操作。

我的问题:

  1. 是否有合法个没有结果的原因,或者
  2. 这是一个错误,但是导致该错误的原因是什么? PHP还是MySQL?

版本:

  • 操作系统:SLES 12.3
  • PHP:7.2.9
  • MySQL 8.0.12

0 个答案:

没有答案