MySQL ステートメントに PHP 変数を含める
このシナリオでは、特に「contents」テーブルに値を挿入するときに問題が発生します。 MySQL ステートメントの「VALUES」セクションで PHP 変数「$type」を使用する場合。適切なアプローチを詳しく見てみましょう。
1.プリペアド ステートメントを使用する (推奨)
この方法は、あなたのクエリを含むクエリの 99% に対処します。 SQL データ リテラル (文字列または数値) を表す変数は、例外なく、準備されたステートメントを介して組み込む必要があります。ただし、静的な値はそのまま挿入できます。
準備プロセスには 4 つの段階が含まれます。
さまざまなデータベース ドライバーでの動作は次のとおりです:
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 サイトの他の関連記事を参照してください。