Подтвердить что ты не робот

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, но если ничего не объявлено, я бы хотел, чтобы страница загружалась нормально.

Можете ли вы мне помочь?

4b9b3361

Ответ 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"]

Он будет работать немного медленнее, но будет содержать код в чистоте.

Когда что-то экономит время для программиста и требует времени для пользователей сайта (или требует больше оборудования), это зависит от того, сколько людей будут его использовать.