ホームページ >データベース >mysql チュートリアル >PHP でプリペアド ステートメントを安全に使用して MySQL データベースにクエリを実行するにはどうすればよいですか?

PHP でプリペアド ステートメントを安全に使用して MySQL データベースにクエリを実行するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-16 10:46:12807ブラウズ

How Can I Securely Use Prepared Statements in PHP to Query a MySQL Database?

MySQL 用 PHP の安全なプリペアド ステートメント

MySQL と PHP を使用する場合、データベースのセキュリティを確保するにはプリペアド ステートメントを使用することが重要です。クエリ。プリペアド ステートメントは、ユーザー指定の入力から SQL ステートメントを分離することで、SQL インジェクション攻撃を防御します。

安全なプリペアド ステートメントの作成

安全なプリペアド ステートメントを作成するには、次のようにします。次のコード スニペットを使用します:

$db = new mysqli("host", "user", "pw", "database");
$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. 接続を作成します: mysqli クラスを使用して MySQL 接続オブジェクト ($db) を作成します。
  2. ステートメントを準備します: 接続オブジェクトで prepare() メソッドを使用して、SQL ステートメントを準備します。プレースホルダー (?) は、後でユーザー入力に置き換えられるパラメーターを表します。
  3. パラメーターのバインド: ユーザー提供のパラメーター (この場合、$_GET) をバインドするには、bind_param() メソッドを使用します。 ['userid'] と $_GET['category']) を準備されたファイルのプレースホルダーに追加します。ステートメント。

データの取得

ステートメントを準備した後、ステートメントを実行し、データを取得し、結果を反復処理できます。

$stmt->execute();
$stmt->store_result();
$stmt->bind_result($column1, $column2, $column3);

while ($stmt->fetch()) {
    echo "col1=$column1, col2=$column2, col3=$column3 \n";
}

の連想配列利便性

データを連想配列として取得するには (例: SELECT * クエリの場合)、次の関数を使用できます。

function stmt_bind_assoc(&$stmt, &$out) {
    $data = mysqli_stmt_result_metadata($stmt);
    $fields = array();
    $out = array();

    $fields[0] = $stmt;
    $count = 1;

    while ($field = mysqli_fetch_field($data)) {
        $fields[$count] = &$out[$field->name];
        $count++;
    }
    call_user_func_array(mysqli_stmt_bind_result, $fields);
}

この関数により、結果をバインドできます。連想配列を使用すると、 code:

$stmt->store_result();

$resultrow = array();
stmt_bind_assoc($stmt, $resultrow);

while ($stmt->fetch()) {
    print_r($resultrow);
}

パフォーマンスに関する考慮事項

準備されたステートメントはパフォーマンスを向上させるように設計されていますが、ページ上で数回使用しても大幅な改善が得られない可能性があります。ただし、アプリケーションがデータベース操作を頻繁に実行する場合、ステートメントを準備すると、応答時間が大幅に改善される可能性があります。

以上がPHP でプリペアド ステートメントを安全に使用して MySQL データベースにクエリを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。