2010-11-30 18 views
0

私はデータベースの抽象化とクエリキャッシングレイヤーとして長年にわたってADOdbを使用してきました。最近は、主にセキュリティのために用意されたステートメントに切り替え、実装されている(または実装されていない)方法が不思議になりました。ADOdbでエミュレートされたプリペアドステートメントを確認するにはどうすればよいですか?

Prepareメソッドのドキュメントからの引用: "最初の配列要素に元のSQL文を含む配列を返します。配列の残りの要素はドライバに依存します。エラーがある場合、またはPrepare()をエミュレートする場合は、元の$ SQL文字列を返します。

テストでのステートメントの変数:接続のオン

$stmt = $db->Prepare("SELECT * FROM pages WHERE id = ?"); 
print_r($stmt); 

は 『mysqlの』または 『mysqliの』パラメータのみ元のクエリ文字列が返されるで開く - プリペアドステートメントをエミュレートされることを意味、私は推測します。接続は、()(しますprint_rから)を「Pdo_Mysql」リターンで開か:

Array (
    [0] => SELECT * FROM pages WHERE id = ? 
    [1] => PDOStatement Object ([queryString]=>SELECT * FROM pages WHERE id = ?) 
) 

は、私は本当のプリペアドステートメントの明確な証拠としてこれを取ることができますか?そうでない場合は、サーバー側(クエリログやMySQLProxyなど)を調べるための迅速で汚い方法を知っている人はいませんか?私はドキュメンテーションが言うように、あなたが文を準備しようとした場合

答えて

0

は、私は、本当の準備文の

の明確な証拠としてこれを取ることができます...ライブラリのソースを読みしようとしましたが、途中で迷子になりましたプリペアドステートメントをサポートしていないドライバを使用すると、指定されたクエリのみが返されます。準備された文がエミュレートされるかどうかを確認するには、$stmtが配列かどうかをチェックするだけです。私はあなたが、配列を渡すことで準備しようとしないだろうと仮定ので、この1は十分なはずです:

$stmt = $db->Prepare("SELECT * FROM pages WHERE id = ?"); 
if(is_array($stmt)){ 
    //prepared 
} 
else{ 
    //emulated 
} 

mysqliのドライバがmysqli driver supporting prepared statementsにもかかわらず、SQLを返し、なぜあなたが混乱している場合、それはドライバーのライン662で説明しています/adodb-mysqli.inc.php

// Prepare() not supported because mysqli_stmt_execute does not return a recordset, but 
// returns as bound variables. 
+0

まあ、私は、MySQLでクエリログの設定と異なる接続を試みるテストどんちゃん騒ぎに行ってきました:全体の事件は、私が思ったよりメシエです! pdo_mysqlドライバを持つADOdbはPDO-> prepare()命令を実際に発行します - PDO itsefはプリペアドステートメントをエミュレートします!実際のPSを持つ唯一の方法は、ネイティブのmysqli関数を使用してSELECT *をあきらめているようです。 – djn

関連する問題