Melarikan diri sama efektifnya dengan pertahanan injeksi SQL seperti menggunakan parameter kueri.
Kedua cara tersebut juga kurang efektif jika Anda gagal melakukannya secara konsisten.
Kedua metode hanya berguna untuk melindungi nilai individu dalam ekspresi SQL. Mereka tidak mendukung bagian dinamis lainnya dari kueri. Misalnya, jika Anda ingin ORDER BY kolom yang ditentukan pengguna. Baik parameter kueri maupun fungsi escaping tidak menanganinya.
Jadi pada dasarnya, ini adalah masalah gaya dan preferensi pribadi.
Saya lebih suka parameter kueri karena menurut saya ini:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);
Lebih jelas dari ini:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);
Anda tidak dapat dengan serius mengatakan bahwa mengutak-atik semua tanda kutip terbuka/tutup dan .
penggabungan string lebih mudah daripada menggunakan prepare() dengan parameter kueri.
Kembali komentar Anda tentang query()
hipotetis fungsi dengan parameter.
Pertama-tama, itu tidak perlu. Menggunakan prepare() dan execute() bersama-sama adalah harga kecil yang harus dibayar untuk menulis kode aman, dan dengan bersikeras melakukannya dengan satu fungsi, Anda terdengar malas. Saya kira Anda tidak memeriksa nilai kembalian fungsi yang mengembalikan false
salah juga?
Untuk apa nilainya, akan mudah untuk menulis fungsi pembungkus untuk melakukan keduanya, karena PHP mendukung varargs secara implisit.
function myquery() {
global $pdo;
$params = func_get_args();
$sql = array_shift($params);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt; // so we can fetch(), etc.
}