Может ли $ _GET ['param_name'] создать проблемы с возвратом массива? - PullRequest
1 голос
/ 13 марта 2012

Я новичок в PHP, и этот вопрос кажется глупым.

Но я действительно запутался в ассоциативном массиве $ _GET, который может помочь мне получить доступ ко всем параметрам, отправленным через URL.

Предположим, я ожидаю строку product_ID и напишу в коде так:

$id = $_GET['prod_id'];
Get_Data($id);

Хотя Get_Data () - это функция, которая ожидает, что единственным параметром будет строка, но не массив. Что, если какой-нибудь плохой парень введет в URL что-то вроде этого:

.../product.php?prod_id[]=1&prod_id[]=2

Метод, использующий $_GET['prod_id'], вернет массив (1,2) вместо строки. Это может привести к серьезным проблемам в моем приложении.

Теперь вопрос: существует ли глобальный способ избежать описанного выше случая?


[EDIT]

Иногда я хочу получить массив из $_GET['prod_id'] вместо строки (например: получение данных из мультиселектора, где пользователи могут выбрать более 1 продукта)

Можно ли проверить, находится ли возвращаемый массив в правильной структуре (одномерный массив с невинными данными) или был обманут каким-то плохим парнем, как этот:

.../product.php?prod_id[a]=1&prod_id[b]=2&prod_id[c]=3&prod_id[d]=4

Я думаю, что очень просто передать массив со сложной структурой в php $ _GET, но кодеру очень сложно проверить, нужна ли им правильная структура.

Не могли бы вы, пожалуйста, просветить меня? Спасибо!

Ответы [ 4 ]

3 голосов
/ 13 марта 2012

Ответ: Валидация

Обычно используют функцию filter_input().

http://ca3.php.net/filter

Если иногда вы хотите, чтобы это был массив, используйтеусловие if (is_array($_GET['prod_id'])) и использовать другой набор проверок.

3 голосов
/ 13 марта 2012

Если в URL был передан массив, то при получении через $_GET это будет массив PHP, а не строка, похожая на сериализованный массив.

// Inside a form performing a get request:
// [] on a name makes it an array:
<input type='checkbox' name=arr[] value='chk1' />
<input type='checkbox' name=arr[] value='chk2' />

// Dumps an array, rather than a serialized string
print_r($_GET['arr']);

Итак, в вашем первом случае:

$id = $_GET['prod_id'];
Get_Data($id);

Всегда проверяйте свои входные данные:

Вы должны проверять содержимое $id, чтобы оно находилось в пределах ожидаемых границ, и если вы попытаетесь использовать его как строку, когда это действительно массив, функции, действующие на нем, будут выдавать предупреждения или ошибки. Поскольку PHP слабо типизирован, функция, ожидающая целое число, будет успешно работать, если вы передадите ей массив, но, скорее всего, вылетит и сработает с ошибками во всех ваших журналах или на экране.

// Make sure $id is an int
if (!ctype_digit($id)) {
  // invalid data, abort!
}

С другой стороны, если ожидается, что значением будет массив:

if (!is_array($_GET['prod_id'])) {
  // it wasn't an array, abort!
}
0 голосов
/ 13 марта 2012

Используйте проверку, что-то вроде этого:

$id = (!isset($_GET['prod_id'])) ? null : $_GET['prod_id'];
if (intval($id) > 0) {
   //...
}
#OR
if (is_int($id) > 0) {
  //...
} 
0 голосов
/ 13 марта 2012
$id = str($_GET['prod_id']);

Это тип преобразует переменную как строковый литерал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...