处理PDO :: ATTR_EMULATE_PREPARES属性false不会导致存储函数(MySql)中的错误

If I set the PDO::ATTR_EMULATE_PREPARES property to false, an Invalid Argument Error of Mysql Stored Function is not raised.

  • CentOS 6.10, PHP 7.2.9, MariaDB 10.2.11

MySQL Stored Function (Example)

CREATE DEFINER=`tester`@`%` FUNCTION `blabla`(`item` TEXT, `no` INT, `option` TINYINT, `type` VARCHAR(1))....

PDO::ATTR_EMULATE_PREPARES = false

<?php
$dbh = new PDO('mysql:......
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$sql = "SELECT blalba('test', 1, 'a')"; // <-- set invalid argument, expected 4
$stmt = $dbh->prepare($sql);
$stmt->execute();
print_r($stmt->errorInfo);

// result ==> 
Array
(
    [0] => 00000
    [1] => 
    [2] => 
)

PDO::ATTR_EMULATE_PREPARES = true

<?php
$dbh = new PDO('mysql:......
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$sql = "SELECT blalba('test', 1, 'a')"; // <-- set invalid argument, expected 4
$stmt = $dbh->prepare($sql);
$stmt->execute();
print_r($stmt->errorInfo);

// result ==> 
Array
(
    [0] => 42000
    [1] => 1318
    [2] => Incorrect number of arguments for FUNCTION project.BLABLA; expected 4, got 3
)

set => false set => true