Ми повинні подбати про вразливості ін’єкцій SQL та порожній стан . Я збираюся впоратися з обома, як нижче.
Для чистого числового масиву, використовуйте відповідне а саме перетворення типів intval
або floatval
або doubleval
над кожним елементом. Для типів рядків, mysqli_real_escape_string()
які також можна застосувати до числових значень, якщо бажаєте. MySQL дозволяє як рядки, так і варіанти номерів, а також дат .
Щоб належним чином вийти із значень перед переходом на запит, створіть функцію, подібну до:
function escape($string)
{
// Assuming $db is a link identifier returned by mysqli_connect() or mysqli_init()
return mysqli_real_escape_string($db, $string);
}
Така функція, швидше за все, вже буде доступна у вашій програмі, або, можливо, ви її вже створили.
Очистити рядковий масив на зразок:
$values = array_map('escape', $gallaries);
Числовий масив може бути продезінфікувати , використовуючи intval
або floatval
або doubleval
замість того, щоб в якості придатних:
$values = array_map('intval', $gallaries);
Потім нарешті побудуйте умову запиту
$where = count($values) ? "`id` = '" . implode("' OR `id` = '", $values) . "'" : 0;
або
$where = count($values) ? "`id` IN ('" . implode("', '", $values) . "')" : 0;
Оскільки масив також іноді може бути порожнім, як $galleries = array();
ми повинні відзначити, що IN ()
це не дозволяє порожній список. Можна також використовувати OR
натомість, але проблема залишається. Отже, вищеперевірка count($values)
, полягає в тому, щоб забезпечити те саме.
І додайте його до остаточного запиту:
$query = 'SELECT * FROM `galleries` WHERE ' . $where;
Порада : Якщо ви хочете показати всі записи (без фільтрування) у випадку порожнього масиву замість того, щоб ховати всі рядки, просто замініть 0 на 1 у помилковій частині терміналу.