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