Php 如何判断PDO是否在模拟语句?

Php 如何判断PDO是否在模拟语句?,php,mysql,pdo,Php,Mysql,Pdo,无论PDO是在PDO::ATTR\u EMULATE\u PREPARES设置为TRUE还是FALSE的情况下执行的,如何判断PDO是否实际在模拟语句或它们是否由本机驱动程序处理,它似乎无法作为PDO连接处理程序属性使用,因为此设置可以在运行时更改。 但是可以为语句处理程序获取它。 因此,如果您想在启动任何实际语句之前了解仿真状态,就必须使用假查询。作为一个额外的证明,我在展示仿真方面的小技巧可以用来: try { $pdo->setAttribute( PDO::ATTR_EMU

无论PDO是在
PDO::ATTR\u EMULATE\u PREPARES
设置为TRUE还是FALSE的情况下执行的,如何判断PDO是否实际在模拟语句或它们是否由本机驱动程序处理,它似乎无法作为PDO连接处理程序属性使用,因为此设置可以在运行时更改。
但是可以为语句处理程序获取它。
因此,如果您想在启动任何实际语句之前了解仿真状态,就必须使用假查询。作为一个额外的证明,我在展示仿真方面的小技巧可以用来:

try {
    $pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, FALSE);
    $sth  = $pdo->prepare("SELECT 1");
    $emul = $sth->getAttribute(PDO::ATTR_EMULATE_PREPARES);
    var_dump($emul);
    $sth = $pdo->prepare("SELECT 1 LIMIT ?,?");
    $sth->execute(array(1,2));    

    $pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, TRUE);
    $sth  = $pdo->prepare("SELECT 1");
    $emul = $sth->getAttribute(PDO::ATTR_EMULATE_PREPARES);
    var_dump($emul);
    $sth = $pdo->prepare("SELECT 1 LIMIT ?,?");
    $sth->execute(array(1,2));    
} catch (PDOException $e) {
    echo $e->getMessage();
}
输出

bool(false)
bool(true)
SQLSTATE[42000]: Syntax error or access violation:
1064 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version 
for the right syntax to use near ''1','2'' at line 1
意味着在第二种情况下,PDO只是进行模拟,因此将值格式化为字符串,从而导致解析错误


虽然我不认为这些信息有多大用处。为什么不把它设置成你想要的任何条件呢

嗯,它似乎不能作为PDO连接处理程序属性使用,因为此设置可以在运行时更改。
但是可以为语句处理程序获取它。
因此,如果您想在启动任何实际语句之前了解仿真状态,就必须使用假查询。作为一个额外的证明,我在展示仿真方面的小技巧可以用来:

try {
    $pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, FALSE);
    $sth  = $pdo->prepare("SELECT 1");
    $emul = $sth->getAttribute(PDO::ATTR_EMULATE_PREPARES);
    var_dump($emul);
    $sth = $pdo->prepare("SELECT 1 LIMIT ?,?");
    $sth->execute(array(1,2));    

    $pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, TRUE);
    $sth  = $pdo->prepare("SELECT 1");
    $emul = $sth->getAttribute(PDO::ATTR_EMULATE_PREPARES);
    var_dump($emul);
    $sth = $pdo->prepare("SELECT 1 LIMIT ?,?");
    $sth->execute(array(1,2));    
} catch (PDOException $e) {
    echo $e->getMessage();
}
输出

bool(false)
bool(true)
SQLSTATE[42000]: Syntax error or access violation:
1064 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version 
for the right syntax to use near ''1','2'' at line 1
意味着在第二种情况下,PDO只是进行模拟,因此将值格式化为字符串,从而导致解析错误


虽然我不认为这些信息有多大用处。为什么不把它设置成你想要的任何条件呢

不确定是否可能,因为如果PDO正在仿真或未仿真,它的全部目的是隐藏到php代码。不确定是否可能,因为它的全部目的是隐藏到php代码,如果PDO正在仿真或未仿真。