php $ _GET и неопределенный индекс

Для меня возникла новая проблема, поскольку я пытался запустить свой скрипт на другом сервере 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 

Я хочу, чтобы сценарий вызывал определенные функции javascript, если значение объявлено для s , но если ничего не объявлено, я бы хотел, чтобы страница загружалась нормально.

Вы можете мне помочь?

Сообщение об ошибках не будет включать уведомления на предыдущем сервере, поэтому вы не видели ошибок.

Вы должны проверить, действительно ли индекс 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> .

Поймите, чтобы проверить, доступна ли переменная с isset , например

 if (isset($_GET['s'])) { //do stuff that requires 's' } else { //do stuff that doesn't need 's' } 

Вы можете отключить уведомление об уведомлениях, но иметь дело с ними – это хорошая гигиена и может позволить вам выявить проблемы, которые вы могли бы пропустить.

Я всегда использую служебную функцию / класс для чтения из массивов $ _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'); 

У меня была такая же проблема в 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

Сначала установите флажок $_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

Фактически ни один из предложенных ответов, хотя и хорошая практика, не удаляет предупреждение.

Ради правильности, я бы сделал следующее:

 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") 

поэтому, если параметр существует, вы получаете значение, а если оно не получается, вы получаете значение по умолчанию.

Вы должны проверить, существует ли индекс, прежде чем использовать его (сравните его)

 if (isset($_GET['s']) AND $_GET['s'] == 'foobar') { echo "foo"; } 

Использовать E_ALL | E_STRICT при разработке!

Избегайте, если, 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.'">'; 

чистый, читаемый код – код, поддерживаемый

Я рекомендую вам проверить свои массивы, прежде чем вы будете слепо обращаться к ним:

 if(isset($_GET['s'])){ if ($_GET['s'] == 'jwshxnsyllabus') /* your code here*/ } 

Другое (быстрое) исправление – отключить отчет об ошибках, написав это в верхней части скрипта:

 error_reporting(0); 

В вашем случае очень вероятно, что на вашем другом сервере настройка отчетов об ошибках в php.ini установлена php.ini 0.
error_reporting функцию error_reporting с параметром 0 в качестве параметра, вы отключите все уведомления / предупреждения и ошибки. Подробнее см. Руководство по php .

Помните, что это быстрое решение, и настоятельно рекомендуется избегать ошибок, а не игнорировать их.