Anda benar bahwa kasus pertama tidak aman. Penting untuk dipahami, bahwa menyiapkan pernyataan hanya memiliki nilai jika Anda menggunakan data variabel, dan/atau mengeksekusi kueri yang sama berulang kali. Jika Anda menjalankan pernyataan biasa tanpa variabel , Anda cukup melakukan ini:
$sql = "SELECT * from myTable WHERE this_column IS NOT NULL";
$result = $conn->query($sql);
Dan diakhiri dengan PDOStatement
objek untuk dikerjakan, sama seperti saat Anda menggunakan PDO::exec()
.
Untuk kasus kedua Anda, sekali lagi, Anda sebagian besar benar. Apa yang terjadi adalah variabel yang diteruskan ke database diloloskan dan dikutip (kecuali jika Anda menentukan sebaliknya dengan argumen ketiga ke PDOStatement::bindParam()
, itu dikirim sebagai string yang baik untuk sebagian besar kasus.) Jadi, kueri tidak akan "gagal" jika data buruk dikirim. Ini berperilaku persis seperti jika Anda telah melewati nomor yang valid yang tidak ada sebagai ID dalam database. Tentu saja ada beberapa kasus tepi
di mana Anda masih rentan bahkan dengan pernyataan yang disiapkan dengan benar.
Selain itu, untuk membuat hidup lebih mudah, Anda dapat menggunakan pernyataan yang disiapkan seperti ini, untuk melakukan pengikatan implisit:
$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->execute([":id"=>$id]);
Atau bahkan seperti ini, dengan parameter tanpa nama:
$sql = "SELECT * FROM myTable WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$id]);
Secara alami, sebagian besar telah dijelaskan di komentar saat saya mengetik jawabannya!