7

pdo で準備済みステートメントを使用するときにエミュレーションをオフにすると、副作用はありますか? 私は select * を使用しており、文字列ではなく int として処理する必要がある結果を制限しています。私は2つのうちの1つを行うことができます。

$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

または、これらの変数を param タイプで明示的にバインドするには:

$stm = $pdo->prepare('SELECT * FROM table LIMIT ?, ?');
$stm->bindParam(1, $limit_from,PDO::PARAM_INT);
$stm->bindParam(2, $per_page,PDO::PARAM_INT);
$stm->execute();
$data = $stm->fetchAll();

長所と短所はありますか?明らかに、エミュレーションをオフにすると、バインディングが大幅に節約されます。

4

2 に答える 2

16

プリペアド ステートメントは、低レベル データベース ドライバの機能です。データベースは最初にクエリ構造を受け入れ、変数パラメーターを個別に受け取ります。繰り返しますが、これはデータベース自体によって実際にサポートされている機能です。

「エミュレートされた準備」とは、PHP 側で同じ API を個別のprepare()and bind/execute呼び出しで使用することを意味しますが、PDO ドライバーは内部的に文字列をエスケープして連結し、古き良き長い SQL 文字列をデータベースに送信します。データベースは、ネイティブのパラメーター化されたクエリ機能を使用できません。

エミュレートされた準備をオフにすると、PDO はデータベースのネイティブのパラメーター化されたクエリ機能を使用するようになります。データベース (-driver) がネイティブのパラメーター化されたクエリをサポートしていない場合にのみ、エミュレートされた準備を有効にする/そのままにしておく必要があります。エミュレートされた準備は、古いデータベース (-drivers) をサポートするためだけのものであり、PHP コードでパラメーターをバインドする方法は変更されません。

エミュレートされた準備、すべてのクライアント側のエスケープと連結と同様に、特定の状況下でセキュリティ上の欠陥を明らかにする可能性があります。クエリとデータがデータベースに至るまでずっと分離されている場合、これらの欠陥は発生しません。

于 2013-03-30T12:16:21.587 に答える
0

いいえ、言及する価値のある賛否両論はありません。

明らかに、エミュレーションをオフにすると、バインディングが大幅に節約されます。

それほどではありません。execute()このような場合にのみ LIMIT を使用してバインディングを使用し、エミュレーションがオンになっていても、他のすべての場合に遅延バインディングを使用し続けることができます。

于 2013-03-30T11:45:18.043 に答える