【问题标题】:How to tell if PDO is emulating statements?如何判断 PDO 是否在模拟语句?
【发布时间】:2012-07-26 06:15:44
【问题描述】:

无论 PDO 是否在 PDO::ATTR_EMULATE_PREPARES 设置为 TRUEFALSE 的情况下执行,如何判断 PDO 是否实际模拟语句或它们是否由原生驱动?

【问题讨论】:

  • 不确定是否有可能,因为它的全部目的是在 PDO 是否正在模拟时隐藏到 php 代码中。

标签: php mysql pdo


【解决方案1】:

好吧,它似乎不能用作 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 只是模拟,因此将值格式化为导致解析错误的字符串。

虽然我认为这些信息没有多大用处。为什么不将其设置为您想要的任何条件?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2017-06-04
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多