Php $_GET и undefined index
Новая проблема возникла для меня, когда я попытался запустить мой script на другом сервере PHP.
На моем старом сервере следующий код выглядит нормально - даже если не объявлен параметр s
.
<?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), я получаю следующую ошибку, если не определено значение для s
.
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
Что мне нужно для script вызвать определенные функции javascript, если объявлено значение для s
, но если ничего не объявлено, я бы хотел, чтобы страница загружалась нормально.
Можете ли вы мне помочь?
Ответы
Ответ 1
Отчет об ошибках не будет включать уведомления на предыдущем сервере, поэтому вы не видели ошибок.
Вы должны проверить, действительно ли индекс 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: BTW, первый набор кода, который я написал, имитирует то, что ваш намерен делать в нем целиком. Ожидается ли ожидаемый результат неожиданного значения в ?s=
для вывода тега <body>
или это был надзор? Обратите внимание, что коммутатор будет исправлять это, всегда по умолчанию <body>
.
Ответ 2
Получить привычку проверять, доступна ли переменная с isset, например
if (isset($_GET['s']))
{
//do stuff that requires 's'
}
else
{
//do stuff that doesn't need 's'
}
Вы можете отключить уведомление об уведомлениях, но иметь дело с ними - это хорошая гигиена и может позволить вам выявить проблемы, которые вы могли бы пропустить.
Ответ 3
Я всегда использую функцию утилиты/класс для чтения из массивов $_GET и $_POST, чтобы избежать необходимости всегда проверять, существует ли индекс... Что-то вроде этого будет делать трюк.
class Input {
function get($name) {
return isset($_GET[$name]) ? $_GET[$name] : null;
}
function post($name) {
return isset($_POST[$name]) ? $_POST[$name] : null;
}
function get_post($name) {
return $this->get($name) ? $this->get($name) : $this->post($name);
}
}
$input = new Input;
$page = $input->get_post('page');
Ответ 4
У меня была такая же проблема в localhost с xampp. Теперь я использую эту комбинацию параметров:
// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);
php.net: http://php.net/manual/pt_BR/function.error-reporting.php
Ответ 5
Сначала установите флажок $_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>"
?>
И также правильно обрабатывайте ваши условия ifelse
Ответ 6
На самом деле ни один из предложенных ответов, хотя и хорошая практика, удалит предупреждение.
Для правильности, я бы сделал следующее:
function getParameter($param, $defaultValue) {
if (array_key_exists($param, $_GET)) {
$value=$_GET[$param];
return isSet($value)?$value:$defaultValue;
}
return $defaultValue;
}
Таким образом, я проверяю массив _GET
, чтобы ключ существовал без запуска предупреждения. Не рекомендуется отключать предупреждения, потому что много раз они, по крайней мере, интересны, чтобы взглянуть.
Чтобы использовать функцию, которую вы просто выполняете:
$myvar = getParameter("getparamer", "defaultValue")
поэтому, если параметр существует, вы получаете значение, а если оно не получается, вы получаете значение по умолчанию.
Ответ 7
Я рекомендую вам проверить свои массивы, прежде чем вы будете слепо обращаться к ним:
if(isset($_GET['s'])){
if ($_GET['s'] == 'jwshxnsyllabus')
/* your code here*/
}
Еще одно (быстрое) исправление - отключить отчет об ошибках, написав это в верхней части script:
error_reporting(0);
В вашем случае очень вероятно, что на вашем другом сервере конфигурация сообщений об ошибках в php.ini
установлена на 0 по умолчанию.
Вызывая error_reporting
с параметром 0 в качестве параметра, вы отключите все уведомления/предупреждения и ошибки. Подробнее см. руководство по php.
Помните, что это быстрое исправление, и настоятельно рекомендуется избегать ошибок, а не игнорировать их.
Ответ 8
Вы должны проверить, существует ли индекс, прежде чем использовать его (сравните)
if (isset($_GET['s']) AND $_GET['s'] == 'foobar') {
echo "foo";
}
Использовать E_ALL | E_STRICT при разработке!
Ответ 9
Избегайте, если, else и elseifs!
$loadMethod = "";
if(isset($_GET['s'])){
switch($_GET['s']){
case 'jwshxnsyllabus':
$loadMethod = "loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')";
break;
case 'aquinas':
$loadMethod = "loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')";
break;
case 'POP2':
$loadMethod = "loadSyllabi('POP2')";
}
}
echo '<body onload="'.$loadMethod.'">';
чистый, читаемый код является поддерживаемым кодом
Ответ 10
Простая функция, работает с GET или POST. Плюс вы можете назначить значение по умолчанию.
function GetPost($var,$default='') {
return isset($_GET[$var]) ? $_GET[$var] : (isset($_POST[$var]) ? $_POST[$var] : $default);
}
Ответ 11
Другим вариантом будет подавление неопределенного уведомления об индексе PHP символом @
перед переменной GET следующим образом:
$s = @$_GET['s'];
Это отключит уведомление. Лучше проверить, установлена ли переменная, и действовать соответствующим образом.
Но это тоже работает.
Ответ 12
Реальный ответ на это - поставить символ @At перед переменной, которая подавит ошибку
@$_GET["field"]
@$_POST["field"]
Он будет работать немного медленнее, но будет содержать код в чистоте.
Когда что-то экономит время для программиста и требует времени для пользователей сайта (или требует больше оборудования), это зависит от того, сколько людей будут его использовать.