Мы должны позаботиться о 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 в ложной части троицы.