PHP проверка / проверка массива целых чисел

#php #arrays #validation #integer #sanitization

#php #массивы #проверка #целое число #очистка

Вопрос:

У меня есть следующий массив, и я хотел бы знать, каким наилучшим способом будет проверка и проверка этого массива, чтобы убедиться, что разрешены только целые числа?

 if(is_array($_POST['taxonomy'])) {
    $term_ids = array_map('esc_attr', $_POST['taxonomy']);
}
  

Который выглядит так при печати:

 Array
(
    [0] => 13
    [1] => 12
)
  

Я знаю, что esc_attr не очень безопасен, поэтому хотелось бы чего-то более сложного.

Любая помощь была бы отличной.

Приветствия,

Дэйв

Комментарии:

1. Приведите их к целым числам, несмотря ни на что…

2. Если бы это была строка, я бы просто использовал (int), но есть ли что-то похожее на использование для массива? Спасибо за ваш ответ

3. вы делаете это для значений массива в цикле

4. Просто приведите их и сопоставьте с целыми числами.

Ответ №1:

Поскольку это $_POST данные, вы захотите проверить ctype_digit (т. Е. Строку, содержащую только цифры):

 $sanitizedValues = array_filter($_POST['taxonomy'], 'ctype_digit');
  

Обратите внимание, что это просто отбрасывает нечисловые значения.

Комментарии:

1. просто попробовал это, и, похоже, все работает на месте, спасибо за все остальные комментарии, кстати, очень полезно! Насколько это безопасно? Если бы кто-то что-то вставил в этот массив? (У нас было несколько проблем со взломом, поэтому я просматриваю весь код и затыкаю любые дыры). Приветствия

2. При этом вы можете быть уверены, что $sanitizedValues содержит только строки, содержащие только числа. Ни больше, ни меньше.

3. Очень красиво и очень чисто. Приветствую @deceze и всех остальных, кто опубликовал ответ.

4. Неплохо. Именно то, что я искал. Слава.

Ответ №2:

Альтернативой может быть использование функций фильтрации phps:

 $array = array(
  13, 12, '1', 'a'
);

$result = filter_var($array, FILTER_VALIDATE_INT, array(
  'flags'   => FILTER_REQUIRE_ARRAY,
  'options' => array('min_range' => 1)
));

var_dump($result);

/*
array(4) {
  [0]=>
  int(13)
  [1]=>
  int(12)
  [2]=>
  int(1)
  [3]=>
  bool(false)
}
*/
  

Комментарии:

1. Гораздо более подробный, но технически более подходящий. 1 🙂

2. Извините, ребята, в чем разница между ними?

3. Если вы проверяете одно поле, я думаю, это просто вопрос вкуса. Хотя, если у вас много проверок, функции фильтрации могут сэкономить вам некоторую работу (см. , например, filter_input_array). И я думаю, если вам или кому-то еще нужно понять, что вы делаете 3 месяца спустя, функция фильтра более четко показывает, что происходит.

4. На данный момент это всего лишь один ввод. Я проверил filter_input_array, и, похоже, он будет очень полезен! Я также добавлю 1 к этому ответу, большое спасибо @Yoshi за вашу помощь и советы. Каждый день — школьный день 🙂

Ответ №3:

 if(is_array($_POST['taxonomy'])) {
    $term_ids = array_map('intval', $_POST['taxonomy']);
}
  

Должно сработать. ПРИМЕЧАНИЕ: это очистка. Подробнее: http://php.net/manual/en/function.intval.php

Ответ №4:

 foreach( $array as $key => $value) {
    $array[$key] = (int) $value;

    if( $array[$key] != $value ) {
        // error
    }
}
  

Комментарии:

1. POST-данных никогда int не бывает, это все строки.

2. Это выглядит как numbers: Array ( [0] => 13 [1] => 12 )

3. Да, но это строки , а не int s.

Ответ №5:

Если вы ищете однострочную строку для проверки на соответствие указанному условию, вы можете использовать:

 $onlyIntegers = Arr::check($_POST['taxonomy'], 'ctype_digit');
  

предполагая, что вы $_POST['taxonomy'] можете содержать числовые строки, как предложил @deceze, или просто:

 $onlyIntegers = Arr::check($_POST['taxonomy'], 'is_int');
  

если вы уверены, что $_POST['taxonomy'] значения должны быть фактически целыми числами.

Arr::check метод является частью этой библиотеки php array, которая содержит различные методы, помогающие вам работать с различными типами массивов.