MySQL ステートメントに PHP 変数を埋め込む
PHP 変数を使用して SQL ステートメントを強化し、クエリを動的に生成します。あなたが経験している問題は次のとおりです:
<code class="language-php">$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");</code>
このエラーを解決するには、次のガイドラインに従ってください:
1. 準備されたステートメントを使用します
これは、ステートメント内の SQL リテラル (文字列、数値) を表す変数には必須です。ワークフローは次のとおりです:
prepare()
メソッドを使用します。 bind_param()
を使用して、プレースホルダーを変数値に関連付けます。 execute()
を使用します。 mysqli (PHP 8.2) の場合:
<code class="language-php">$type = 'testing'; $reporter = "John O'Hara"; $description = 'whatever'; //添加了description变量 $sql = "INSERT INTO contents (type,reporter,description) VALUES (?,?,?)"; //修改了占位符数量 $stmt = $mysqli->prepare($sql); $stmt->bind_param("sss", $type, $reporter, $description); //修改了参数类型和数量 $stmt->execute();</code>
mysqli (古い PHP バージョン) の場合:
<code class="language-php">$type = 'testing'; $reporter = "John O'Hara"; $description = 'whatever'; //添加了description变量 $sql = "INSERT INTO contents (type,reporter,description) VALUES (?,?,?)"; //修改了占位符数量 $stmt = $mysqli->prepare($sql); $stmt->bind_param("sss", $type, $reporter, $description); //修改了参数类型和数量 $stmt->execute();</code>
PDO 内:
<code class="language-php">$type = 'testing'; $reporter = "John O'Hara"; $description = 'whatever'; //添加了description变量 $sql = "INSERT INTO contents (type,reporter,description) VALUES (?,?,?)"; //修改了占位符数量 $stmt = $pdo->prepare($sql); $stmt->execute([$type, $reporter, $description]); //修改了参数数量</code>
2. ホワイトリスト フィルタリングを実装します
キーワード、識別子、演算子などのクエリ部分には、ホワイトリストのアプローチを使用します。これらの変数を、許可される値の事前定義されたリストによってフィルターします:
<code class="language-php">$orderby = $_GET['orderby'] ?? "name"; // 使用 null 合并运算符 $allowed = ["name", "price", "qty"]; if (!in_array($orderby, $allowed, true)) { // 使用 in_array 进行更简洁的检查 throw new InvalidArgumentException("无效的字段名称"); }</code>
識別子がデータベース構文 (MySQL のバッククォートなど) に従って正しくフォーマットされていることを確認してください。次に、この変数を SQL 文字列に安全に含めます:
<code class="language-php">$query = "SELECT * FROM `table` ORDER BY `{$orderby}` $direction"; // 使用大括号避免变量名冲突</code>
プリペアド ステートメントとホワイトリスト フィルタリングを使用すると、SQL インジェクション攻撃を効果的に防止し、PHP 変数を MySQL クエリに安全に統合できます。 mysql_query
関数は非推奨となっており、mysqli
または PDO
を使用することをお勧めします。 これを反映し、元の例のバグを修正するためにコード例が更新されました。
以上がMySQLステートメントにPHP変数を安全に埋め込む方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。