ホームページ > バックエンド開発 > PHPチュートリアル > MySQL INSERT ステートメントに PHP 変数を安全に含める方法

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

Barbara Streisand
リリース: 2024-12-21 18:03:23
オリジナル
865 人が閲覧しました

How to Safely Include PHP Variables in MySQL INSERT Statements?

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

このシナリオでは、特に「contents」テーブルに値を挿入するときに問題が発生します。 MySQL ステートメントの「VALUES」セクションで PHP 変数「$type」を使用する場合。適切なアプローチを詳しく見てみましょう。

1.プリペアド ステートメントを使用する (推奨)

この方法は、あなたのクエリを含むクエリの 99% に対処します。 SQL データ リテラル (文字列または数値) を表す変数は、例外なく、準備されたステートメントを介して組み込む必要があります。ただし、静的な値はそのまま挿入できます。

準備プロセスには 4 つの段階が含まれます。

  • SQL ステートメント内の変数のプレースホルダーを指定します。
  • 変更されたクエリ。
  • 変数をそれぞれにバインドします
  • クエリを実行します。

さまざまなデータベース ドライバーでの動作は次のとおりです:

PHP 8.2 での mysqli :

$sql = "INSERT INTO contents (type, reporter, description) VALUES ('whatever', ?, ?)";
$mysqli->execute_query($sql, [$reporter, $description]);
ログイン後にコピー

mysqli と以前の PHP バージョン:

$stmt = $mysqli->prepare("INSERT INTO contents (type, reporter, description) VALUES ('whatever', ?, ?)");
$stmt->bind_param("ss", $reporter, $description);
$stmt->execute();
ログイン後にコピー

PDO:

$sql = "INSERT INTO contents (type, reporter, description) VALUES ('whatever', ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$reporter, $description]);
ログイン後にコピー

2.クエリ部分のホワイトリスト フィルタリングを実装する

キーワード、テーブル名またはフィールド名、演算子など、SQL クエリの特定の部分を表す変数を含める必要がある場合は、「ホワイトリスト」を使用してそれらの有効性を確認します。

たとえば、変数がフィールドによる順序を表す場合:

$allowed = ["name", "price", "qty"];
$key = array_search($orderby, $allowed, true);
if ($key === false) { throw new InvalidArgumentException("Invalid field name"); }
ログイン後にコピー

同様に、次のことを確認します。有効な順序付けの指示:

$allowed = ["ASC", "DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) { throw new InvalidArgumentException("Invalid ORDER BY direction"); }
ログイン後にコピー

検証したら、クエリ文字列を準備し、MySQL 構文に従って識別子を適切にエスケープすることを忘れないでください:

$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";
ログイン後にコピー

以上がMySQL INSERT ステートメントに PHP 変数を安全に含める方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート