PHP $_GET и неопределенный индекс
Проблема с неопределённым индексом в PHP-скрипте на локальном сервере
У меня возникла новая проблема, когда я попытался запустить свой скрипт на другом PHP-сервере.
На моём старом сервере следующий код работает нормально, даже когда параметр <code>s</code>
не объявлен:
<?php
if ($_GET['s'] == 'jwshxnsyllabus')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')\">";
if ($_GET['s'] == 'aquinas')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">";
if ($_GET['s'] == 'POP2')
echo "<body onload=\"loadSyllabi('POP2')\">";
elseif ($_GET['s'] == null)
echo "<body>";
?>
Но теперь, на моем локальном сервере (XAMPP - Apache), я получаю следующую ошибку, когда для параметра <code>s</code>
не указано значение:
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 43
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 45
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 47
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 49
Я хочу, чтобы скрипт вызывал определённые функции JavaScript, если значение для <code>s</code>
объявлено, но чтобы страница загружалась нормально, если ничего не указано.
Можете помочь мне с этой проблемой?
5 ответ(ов)
Ошибка обращения к элементу массива $_GET
может быть связана с тем, что на предыдущем сервере не были включены уведомления, и поэтому вы не видели ошибок.
Перед тем как использовать индекс s
в массиве $_GET
, вам следует проверить, существует ли он.
Вот пример, который будет достаточным:
if (isset($_GET['s'])) {
if ($_GET['s'] == 'jwshxnsyllabus')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')\">";
else if ($_GET['s'] == 'aquinas')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">";
else if ($_GET['s'] == 'POP2')
echo "<body onload=\"loadSyllabi('POP2')\">";
} else {
echo "<body>";
}
Если вы планируете добавлять больше случаев, то использование оператора switch
может сделать ваш код более читаемым.
switch ((isset($_GET['s']) ? $_GET['s'] : '')) {
case 'jwshxnsyllabus':
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')\">";
break;
case 'aquinas':
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">";
break;
case 'POP2':
echo "<body onload=\"loadSyllabi('POP2')\">";
break;
default:
echo "<body>";
break;
}
EDIT: Кстати, первый код, который я написал, полностью воспроизводит ваше намерение. Ожидается ли, что при неожиданном значении ?s=
не будет выведен никакой <body>
тег, или это была ошибочная упущение? Учтите, что оператор switch
решит эту проблему, всегда выводя по умолчанию <body>
.
Если вы хотите упростить работу с массивами $_GET
и $_POST
, вы можете создать утилитарный класс, который будет обрабатывать эти массивы и проверять существование индексов, чтобы избежать повторяющегося кода. Вот пример того, как это можно реализовать:
class Input {
public function get($name) {
return isset($_GET[$name]) ? $_GET[$name] : null;
}
public function post($name) {
return isset($_POST[$name]) ? $_POST[$name] : null;
}
public function get_post($name) {
return $this->get($name) ?? $this->post($name);
}
}
$input = new Input;
$page = $input->get_post('page');
В данном классе Input
есть три метода: get
, post
и get_post
. Каждый из них проверяет наличие нужного индекса в соответствующем массиве и возвращает null
, если индекс отсутствует. Метод get_post
пытается сначала получить значение из массива $_GET
, а если его там нет, проверяет $_POST
. Это позволяет вам удобно и безопасно извлекать данные из запросов, не повторяя одну и ту же логику.
У меня была такая же проблема на локальном сервере с XAMPP. В итоге я использую такую комбинацию параметров:
// Сообщать обо всех ошибках, кроме E_NOTICE
// Это значение по умолчанию, установленное в php.ini
error_reporting(E_ALL ^ E_NOTICE);
Для подробной информации можете обратиться к документации PHP: php.net.
Для начала, проверьте, установлено ли значение $_GET['s']
. Измените ваши условия следующим образом:
<?php
if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus') {
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')\">";
} elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas') {
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">";
} elseif (isset($_GET['s']) && $_GET['s'] == 'POP2') {
echo "<body onload=\"loadSyllabi('POP2')\">";
} elseif (!isset($_GET['s']) || $_GET['s'] == null) {
echo "<body>";
}
?>
Также убедитесь, что вы корректно обрабатываете ваши условия if
и else
. Важно следовать правильным структурам и соблюдать ясность в логике, чтобы код был более читабельным и понятным.
Вы должны проверить, существует ли индекс, прежде чем использовать его (сравнивать).
if (isset($_GET['s']) && $_GET['s'] === 'foobar') {
echo "foo";
}
Также рекомендуется использовать E_ALL | E_STRICT
в процессе разработки, чтобы выявить возможные предупреждения и ошибки.
Функции startsWith() и endsWith() в PHP
Как получить расширение файла в PHP?
Как читать большой файл построчно?
ReCaptcha 2.0 с использованием AJAX
Почему нельзя вызывать абстрактные функции из абстрактных классов в PHP?