経験から、そして準備されたステートメントを使用してパラメーターをバインドすることの利点も常に言われてきたため、コードでこれら2つの手法を常に使用してきましたが、これら2つの手法のそれぞれの目的を正確に理解したいと思います。
準備されたステートメントの私の理解から:
$sql = "SELECT * FROM myTable WHERE id = ".$id;
$stmt = $conn->prepare($sql);
$stmt->execute();
前のコードは、私が提案したクエリを使用して、データベースに一種のバッファーを作成する必要があります。私の理解では (そして私は非常に間違っている可能性があります)、前のコードは安全ではありません。文字列は実際の内容に$sql
応じて何でもかまいません。$id
$id
1; DROP TABLE myTable;--
私の理解から、これは私のパラメーターをバインドする場所です。代わりに次のことを行う場合:
$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id', $id);
$stmt->execute();
データベースは、事前に sql ステートメントのすべての部分を正確に認識している必要があります:
SELECT
これらの列:*
FROM myTable
およびWHERE id =
「ユーザーが入力した変数」、および の場合"a variable that was input by the user" != a variable
、クエリは失敗します。
私の理解は正しいと言われた人もいれば、それは間違っていると言われた人もいます。間違っているか、正しいか、または何かが欠けているかどうかを誰かに知らせてもらえますか? すべてのフィードバックは大歓迎です!