PDO MySQL: クエリ キャッシュとプリペアド ステートメントのセキュリティを活用する
MySQL は、最適化とセキュリティのためにネイティブのプリペアド ステートメントとクエリ キャッシュの両方を提供します。しかし、次のような疑問が生じます: PDO 構成でどれを優先すべきでしょうか?
神話を暴く
一般的な認識は次のとおりです:
ただし、これらのステートメントは、最近の MySQL および PHP バージョンには当てはまらない可能性があります。
パフォーマンスとセキュリティ
パフォーマンスの観点から言えば、MySQL のバージョン5.1.17 以降では、プリペアド ステートメントを使用したクエリ キャッシュが可能です。したがって、新しい MySQL および PHP バージョンではパフォーマンスとセキュリティの両方を活用することができます。
セキュリティに関しては、ネイティブのプリペアド ステートメントは SQL インジェクションに対する追加の保護を提供しません。 PDO はすでにクエリ パラメータ値をエスケープしており、このプロセスは EMULATE_PREPARES 設定の影響を受けません。
エラー報告
ネイティブの準備済みステートメントは準備中に構文エラーを引き起こしますが、エミュレートされた準備済みステートメントはステートメントは、そのようなエラーを実行時まで延期します。これは、特に PDO::ERRMODE_EXCEPTION で作成するコードに影響します。
追加の考慮事項
推奨事項
古い MySQL および PHP バージョンの場合は、エミュレートすることをお勧めします準備されたステートメント。ただし、新しいバージョンの場合は、(エミュレーションをオフにして) ネイティブのプリペアド ステートメントを使用する必要があります。
カスタム PDO 接続関数
以下は、PDO 接続のコード スニペットです。最適な設定の機能:
function connect_PDO($settings) { $emulate_prepares_below_version = '5.1.17'; $dsnpairs = []; foreach ($settings as $k => $v) { if ($v !== null) { $dsnpairs[] = "{$k}={$v}"; } } $dsn = 'mysql:'.implode(';', $dsnpairs); $dbh = new PDO($dsn, $settings['user'], $settings['pass']); $serverversion = $dbh->getAttribute(PDO::ATTR_SERVER_VERSION); $emulate_prepares = (version_compare($serverversion, $emulate_prepares_below_version, '<')); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emulate_prepares); return $dbh; }
この機能を活用したり、特定の好みに合わせてカスタマイズしたりすることで、次のような理想的なバランスを実現できます。 PDO 接続のパフォーマンスとセキュリティ。
以上がPDO MySQL: プリペアドステートメントまたはクエリキャッシュ?どれを優先すべきでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。