PHP で安全な MySQL プリペアド ステートメントを作成する
MySQL プリペアド ステートメントを使用した PHP の初心者であれば、次のような問題に遭遇したことがあるでしょう。列からデータを安全に取得する必要がある。これを達成するために、プリペアド ステートメントの世界に飛び込んで、クエリの安全性を確保してみましょう。
脆弱なクエリを明らかにする
現在の SQL ステートメントは、簡単ではありますが、セキュリティの点で不十分です:
$qry = "SELECT * FROM mytable where userid='{$_GET['userid']}' AND category='{$_GET['category']}'ORDER BY id DESC";
このアプローチでは、アプリケーションが SQL インジェクション攻撃に対して脆弱になり、悪意のあるユーザーが特殊文字を使用してクエリを操作できます。
安全なプリペアド ステートメントの作成
クエリを保護するには、プリペアド ステートメントを使用しましょう。
$stmt = $db->prepare("SELECT * FROM mytable WHERE userid=? AND category=? ORDER BY id DESC");
このステートメントでは、プレースホルダー (「?」) を使用して入力パラメーターを表します。次に、これらのパラメータを実際の値に安全にバインドします。
$stmt->bind_param('ii', intval($_GET['userid']), intval($_GET['category']));
データを個別にバインドすることで、悪意のある文字によるクエリの変更を防ぎます。
パフォーマンスの最適化
あなたは、準備されたステートメントのパフォーマンスへの影響について知りたいと考えています。 1 回の実行ではわずかなメリットしか得られませんが、ページまたはループ内で複数回実行すると真価を発揮します。
プリペアド ステートメントはクエリ プランをキャッシュするため、実行のたびにクエリ プランを解析してコンパイルする必要がなくなります。 。この最適化により、特に複雑なクエリの速度が大幅に向上します。
連想配列の抽出
複数の列を返すクエリの場合、次の関数を使用して自動的に連想配列にバインドします:
function stmt_bind_assoc (&$stmt, &$out) { ... }
このユーティリティは、次の操作のプロセスを効率化します。
結論
プリペアド ステートメントは、MySQL クエリを保護し、SQL インジェクション攻撃を防ぐために不可欠です。これらを実装すると、アプリケーションを保護し、同じクエリを複数回実行するときにパフォーマンスの最適化を実現できます。プリペアド ステートメントの機能を利用して、安全かつ効率的なデータ アクセスを実現します。
以上がPHP プリペアドステートメントを使用して MySQL からデータを安全に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。