2

PDO がFALSEのTRUEPDO::ATTR_EMULATE_PREPARES設定されて実行されるかどうかに関係なく、PDO が実際にステートメントをエミュレートしているのか、それともネイティブ ドライバーによって処理されているのかを確認する方法は?

4

1 に答える 1

0

この設定は実行時に変更できるため、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

2 番目のケースでは、PDO が単にエミュレートすることを意味するため、値を文字列としてフォーマットするため、解析エラーが発生します。

そのような情報はあまり役に立たないと思いますが。好きな条件に設定してみませんか?

于 2013-01-23T05:27:18.817 に答える