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 intvalatau floatvalatau di doublevalatas 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 intvalatau floatvalatau doublevalsebaliknya 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.