VALUES ステートメント内で PHP 変数を使用してテーブルに値を挿入するときに問題が発生する。 PHP 変数を MySQL ステートメントに統合するための適切なアプローチを理解することが重要です。
MySQL ステートメントにデータ リテラル (SQL 文字列または数値) を挿入するには、準備されたステートメントの使用。
PHP 8.2 では、これらの手順を 1 つの呼び出しに組み合わせることができます:
$type = 'testing'; $reporter = "John O'Hara"; $sql = "INSERT INTO contents (type,reporter,description) VALUES ('whatever',?,?)"; $mysqli->execute_query($sql, [$reporter, $description]);
古い PHP の場合バージョン:
$type = 'testing'; $reporter = "John O'Hara"; $sql = "INSERT INTO contents (type,reporter,description) VALUES ('whatever',?,?)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param("ss", $reporter, $description); $stmt->execute();
PDO は合理化されたアプローチを提供します:
$type = 'testing'; $reporter = "John O'Hara"; $sql = "INSERT INTO contents (type,reporter,description) VALUES ('whatever',?,?)"; $stmt = $pdo->prepare($sql); $stmt->execute([$reporter, $description]);
リテラル (キーワード、識別子) 以外のクエリ部分を表す変数は、ホワイトリストを通じてフィルター処理する必要があります。これにより、意図しない値の挿入が防止されます。
たとえば、ユーザー入力に基づいてフィールド名をフィルターするには:
$orderby = $_GET['orderby'] ?: "name"; // set the default value $allowed = ["name", "price", "qty"]; // the white list of allowed field names $key = array_search($orderby, $allowed, true); // see if we have such a name if ($key === false) { throw new InvalidArgumentException("Invalid field name"); }
以上がMySQL ステートメントに PHP 変数を安全に含めるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。