ホームページ >バックエンド開発 >PHPチュートリアル >PHP 変数を MySQL の VALUES 句で使用するとエラーが発生するのはなぜですか?

PHP 変数を MySQL の VALUES 句で使用するとエラーが発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-21 15:17:10416ブラウズ

Why Do PHP Variables Cause Errors When Used in MySQL's VALUES Clause?

MySQL ステートメント内に PHP 変数を含める方法

問題:

PHP で、ステートメント内で変数を使用するVALUES で囲まれた MySQL ステートメントが原因で

質問:

VALUES 内に変数を含めるとエラーが発生するのはなぜですか?

回答:

MySQL ステートメントに PHP 変数を含めるには 2 つの異なるアプローチがあります適切に:

  1. プリペアド ステートメントを使用:

    SQL データ リテラル (文字列、数値) を表す変数の場合は、プリペアド ステートメントを使用する必要があります。これには以下が含まれます:

    • SQL ステートメントでのプレースホルダーの定義
    • クエリの準備
    • プレースホルダーへの変数のバインド
    • クエリの実行

    例(mysqli):

    $type = 'testing';
    $sql = "INSERT INTO contents (type, reporter, description) VALUES ('whatever', ?, ?)";
    $mysqli->execute_query($sql, [$type, $reporter, $description]);
  2. ホワイトリスト フィルタリングを使用:

    クエリ部分を表すその他の変数 (キーワードなど) 、識別子)、ホワイト リストでフィルタリングし、許可された値のみが使用されるようにする必要があります。 例 (orderby の確認):

    $orderby = $_GET['orderby'] ?: 'name';
    $allowed = ['name', 'price', 'qty'];
    $key = array_search($orderby, $allowed);
    if ($key === false) throw new InvalidArgumentException("Invalid field name");

結論:

これらの原則に従うことで、SQL インジェクションやPHP 変数が関係する場合にクエリが正しく実行されるようにします。データ リテラルにはプリペアド ステートメントを使用する必要がありますが、ホワイトリストによりクエリの他の部分には許可された値のみが挿入されるようになります。

以上がPHP 変数を MySQL の VALUES 句で使用するとエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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