PHP/HTML — функция isset
Вопрос
Я новичок в PHP и создаю веб-сайт для своей компании.Я использую существующий код, который я получил, но, похоже, не могу заставить его работать должным образом - буду очень признателен за любую помощь!
У меня есть переменная, $идентификатор, который определяет тип категории продукта, отображаемый на странице.Сначала мне нужно проверить, установлена ли переменная id, а если нет, то по умолчанию для переменной будет присвоена категория 0.
У меня есть следующий код:
setdefault($id, 0);
function setdefault(&$var, $default="")
{
if (!isset($var))
{
$var = $default;
}
}
Итак, для адреса www.website.com/browse.php я ожидаю, что по умолчанию он будет равен $id=0;с адресом www.website.com/browse.php?id=3, я ожидаю, что он установит $id равным 3 и отобразит соответствующие продукты.Однако, несмотря на установку $id, по умолчанию он по-прежнему равен 0.Есть ли что-то явно неправильное в моем коде?
Решение
Вы, вероятно, ожидаете, что PHP будет использовать $_POST и $_GET в качестве глобальных переменных.Когда-то PHP настраивался таким образом, но новые версии требуют, чтобы вы явно ссылались на эти переменные.
Вы можете попробовать это:
setdefault($_GET['id'], 0);
function setdefault(&$var, $default="")
{
if (!isset($var))
{
$var = $default;
}
}
или еще проще (с помощью тернарного оператора):
$id = array_key_exists('id', $_GET) ? $_GET['id'] : 0;
Другие советы
Во-первых, если это PHP 5.X, я настоятельно рекомендую не передавать переменные по ссылке с помощью оператора &.Что, как говорится.вызов функции isset всегда будет истинным внутри этой функции.Но вы получите предупреждение о неопределенной переменной в setdefault($id, 0);
Вместо этого попробуйте это.
$id = isset($id) ? $id : 0;
Если $id не установлен, вызов setdefault($id,0) выдаст предупреждение.Такая функция, как setdefault, не работает в PHP.Используйте это вместо этого.
if (!isset($id)) $id = 0;
Если вы делаете это для переменных массива, таких как $_GET и $_POST, вы можете сделать это:
function getuservar($A, $index, $default = '') {
if (!isset($A[$index])) return $default;
if (get_magic_quote_gpc()) return stripslashes($A[$index]);
return $A[$index];
}
$clean_id = getuservar($_GET, 'id', 0);
Эта форма возврата лучше, потому что вы немедленно прекращаете использовать массив $_GET и используете только те переменные, которые очищены в остальной части кода.Вы очищаете внешние переменные один раз и больше никогда не трогаете внешние переменные в своем коде.$A может быть $_GET, $_POST, $_REQUEST или $_COOKIE.
Он также обрабатывает раздражающие вещи Magic_quote, поэтому вы знаете, что данные в переменной — это текст, отправленный пользователем.Просто не забудьте очистить его еще раз при отправке обратно пользователю или в базу данных.
Как $id
устанавливается?Если register_globals
выключен (и он отключен по умолчанию в PHP 4.2 и новее), вам нужно посмотреть $_GET['id']
или $_POST['id']
вместо этого (или $_REQUEST['id']
, но есть причины избегать этого).
Код для установки $id
в какое-то время из строки запроса (browse.php?id=3
) также необходимо будет включить.Возможно, вы думаете о register_globals
настройки PHP, которые автоматически создают переменные при включении в строку запроса.НЕ ВКЛЮЧАЙТЕ эту функцию повторно, уже несколько лет это оказывается очень плохой идеей.
Любую переменную, которую вы извлекаете из строки запроса, необходимо проверить на тип/безопасность перед ее использованием.Например, вы можете извлечь переменную из $_GET
суперглобальный, проверьте, является ли он числовым, если нет, установите значение по умолчанию:
if (!is_numeric($_GET['id']) {
setdefault($_GET['id'], 0);
}