Когда я запускаю этот код:
<?php if (preg_match('/^[a-z0-9]+$/', $_GET['p'])) { $page = realpath("includes/$_GET[p].php"); if ($page) { include $page; } } ?>
Я получаю эту ошибку:
Примечание. Неопределенный индекс: p в index.php в строке 3
В сообщении об ошибке говорится, что нет элемента массива с ключом p
. Если вы не можете гарантировать, что переменная (или элемент массива) существует, вы должны сначала проверить ее с помощью функции isset
:
if (isset($_GET['p']) && preg_match('/^[a-z0-9]+$/', $_GET['p'])) { $page = realpath("includes/$_GET[p].php"); if ($page) { include $page; } }
Что Gumbo сказал для проверки, установлен ли индекс в массиве.
Кроме того, для разбора индекса массива в строке вы должны использовать скобки вокруг массива, и вам следует избегать индекса с одинарными кавычками, если это строка.
$page = realpath("includes/{$_GET['p']}.php");
Но для включения файлов, предложенных пользователем, самым безопасным способом является поиск файлов в массиве и включение их только в том случае, если они существуют.
$page = realpath("includes/ " . $_GET['p'] . ".php");
Нет реальной проблемы. PHP дает уведомление, а не предупреждение или ошибку . В принципе, ваш скрипт не получает параметр p
URL. Поэтому он использует '' и дает уведомление в журнале. Если вы видите это сообщение на своей отображаемой странице, настройте отчет об ошибках php на что-то вроде E_ERROR | E_WARNING
E_ERROR | E_WARNING
в PHP.ini
На странице нет параметра «p», может быть? Вы $_REQUEST
виду $_REQUEST
?
Кроме того, разве это не “ $ {_ GET ['p']} ", когда вы обращаетесь к массиву?
Посмотрите на array_key_exists () для проверки наличия ключа массива …. Но в вашем случае я предлагаю вам подобрать класс фильтров функций, которые специализируются на работе с пользовательским вводом.