ホームページ > データベース > mysql チュートリアル > MySQLステートメントにPHP変数を安全に埋め込む方法は?

MySQLステートメントにPHP変数を安全に埋め込む方法は?

Mary-Kate Olsen
リリース: 2025-01-25 16:56:10
オリジナル
372 人が閲覧しました

How to Safely Embed PHP Variables in MySQL Statements?

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 リテラル (文字列、数値) を表す変数には必須です。ワークフローは次のとおりです:

  • プレースホルダーを使用する: 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 サイトの他の関連記事を参照してください。

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