Kita harus merawat kerentanan injeksi SQL dan kondisi kosong . Saya akan menangani keduanya seperti di bawah ini.
Untuk array numerik murni, gunakan konversi jenis yang sesuai yaitu intval
atau floatval
atau di doubleval
atas setiap elemen. Untuk tipe string mysqli_real_escape_string()
yang juga dapat diterapkan ke nilai numerik jika diinginkan. MySQL memungkinkan angka dan varian tanggal sebagai string .
Untuk menghindari nilai-nilai sebelum meneruskan ke kueri, buat fungsi yang mirip dengan:
function escape($string)
{
// Assuming $db is a link identifier returned by mysqli_connect() or mysqli_init()
return mysqli_real_escape_string($db, $string);
}
Fungsi seperti itu kemungkinan besar sudah tersedia untuk Anda di aplikasi Anda, atau mungkin Anda sudah membuatnya.
Sanitasi array string seperti:
$values = array_map('escape', $gallaries);
Array angka dapat dibersihkan dengan menggunakan intval
atau floatval
atau doubleval
sebaliknya sesuai:
$values = array_map('intval', $gallaries);
Kemudian akhirnya membangun kondisi permintaan
$where = count($values) ? "`id` = '" . implode("' OR `id` = '", $values) . "'" : 0;
atau
$where = count($values) ? "`id` IN ('" . implode("', '", $values) . "')" : 0;
Karena kadang-kadang array juga bisa kosong, $galleries = array();
karena itu kita harus mencatat bahwa IN ()
tidak mengizinkan daftar kosong. Satu juga bisa menggunakan OR
, tetapi masalahnya tetap. Jadi cek di atas count($values)
,, adalah untuk memastikan hal yang sama.
Dan tambahkan ke permintaan terakhir:
$query = 'SELECT * FROM `galleries` WHERE ' . $where;
TIP : Jika Anda ingin menampilkan semua rekaman (tanpa pemfilteran) jika array kosong alih-alih menyembunyikan semua baris, cukup ganti 0 dengan 1 di bagian salah ternary.