ホームページ >データベース >mysql チュートリアル >私の PDO が作成した「INSERT INTO」ステートメントが機能しないのはなぜですか?

私の PDO が作成した「INSERT INTO」ステートメントが機能しないのはなぜですか?

DDD
DDDオリジナル
2025-01-13 07:01:42855ブラウズ

Why Doesn't My PDO Prepared `INSERT INTO` Statement Work?

MySQL の INSERT INTO の PDO プリペアド ステートメントのトラブルシューティング

MySQL INSERT INTO 操作に PDO プリペアド ステートメントを使用すると、データが挿入されないなど、予期しない結果が生じる場合があります。 一般的な原因とその解決策を見てみましょう。

次のコードを考えてみましょう:

<code class="language-php">$statement = $link->prepare("INSERT INTO testtable(name, lastname, age)
        VALUES('Bob','Desaunois','18')");

$statement->execute();</code>

このコードは testtable に新しい行を挿入しようとしますが、データベースへのデータの取り込みに失敗することがよくあります。

ミッシング リンク: パラメーター バインディング

問題はパラメータのバインドがないことにあります。 準備されたステートメントは SQL インジェクションに対するセキュリティを強化しますが、値をクエリに直接埋め込むのではなく、値のプレースホルダーを使用する必要があります。 これにより、特に複数のデータセットを使用して同じクエリを実行する場合に、より安全かつ効率的な実行が可能になります。

ソリューション: 名前付きパラメータと位置パラメータ

パラメータ バインディングを正しく実装する 2 つの方法は次のとおりです。

1.名前付きパラメータ:

<code class="language-php">$statement = $link->prepare('INSERT INTO testtable (name, lastname, age)
    VALUES (:fname, :sname, :age)');

$statement->execute([
    ':fname' => 'Bob',
    ':sname' => 'Desaunois',
    ':age' => '18',
]);</code>

これは、:fname メソッドの配列内の値にマップされる名前付きプレースホルダー (:sname:ageexecute()) を使用します。

2.位置パラメータ:

<code class="language-php">$statement = $link->prepare('INSERT INTO testtable (name, lastname, age)
    VALUES (?, ?, ?)');

$statement->execute(['Bob', 'Desaunois', '18']);</code>

これは、疑問符 (?) をプレースホルダーとして使用し、対応する値が execute() メソッドの配列で提供されます。 ここでは順序が重要です。

どちらのアプローチもパラメータを効果的にバインドし、SQL インジェクションを防止し、信頼性の高いデータ挿入を保証します。 コーディング スタイルとプロジェクトの要件に最も適した方法を選択してください。 最適なセキュリティを維持するために、プリペアド ステートメントを使用する場合でも、ユーザー入力をクエリで使用する前に必ずサニタイズしてください。

以上が私の PDO が作成した「INSERT INTO」ステートメントが機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。