あなたは最初のケースが安全ではないということは正しいです。ただし、ステートメントの準備には、変数データを使用している場合や、同じクエリを繰り返し実行している場合にのみ価値があることを理解することが重要です。プレーンステートメントを実行している場合変数なし 、あなたは単にこれを行うことができます:
$sql = "SELECT * from myTable WHERE this_column IS NOT NULL";
$result = $conn->query($sql);
そして、最終的にPDOStatement
PDO::exec()
を使用する場合と同じように、操作するオブジェクト 。
2番目のケースについても、ほぼ正しいです。何が起こっているのかというと、データベースに渡された変数がエスケープされて引用符で囲まれます(PDOStatement::bindParam()
の3番目の引数で特に指定しない限り 、ほとんどの場合に問題のない文字列として送信されます。)したがって、不良データが送信されてもクエリは「失敗」しません。データベースにIDとして存在しなかった有効な番号を渡した場合とまったく同じように動作します。もちろん、いくつかありますエッジケース
正しく準備されたステートメントがあっても、まだ脆弱な場所です。
また、作業を楽にするために、次のようなプリペアドステートメントを使用して、暗黙のバインディングを実行できます。
$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->execute([":id"=>$id]);
または、このように、名前のないパラメータを使用する場合:
$sql = "SELECT * FROM myTable WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$id]);
当然、私が答えを入力している間、これのほとんどはコメントで説明されました!