0

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

7

Проблема с неопределённым индексом в 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 ответ(ов)

0

Ошибка обращения к элементу массива $_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>.

0

Если вы хотите упростить работу с массивами $_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. Это позволяет вам удобно и безопасно извлекать данные из запросов, не повторяя одну и ту же логику.

0

У меня была такая же проблема на локальном сервере с XAMPP. В итоге я использую такую комбинацию параметров:

// Сообщать обо всех ошибках, кроме E_NOTICE
// Это значение по умолчанию, установленное в php.ini
error_reporting(E_ALL ^ E_NOTICE);

Для подробной информации можете обратиться к документации PHP: php.net.

0

Для начала, проверьте, установлено ли значение $_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. Важно следовать правильным структурам и соблюдать ясность в логике, чтобы код был более читабельным и понятным.

0

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

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

Также рекомендуется использовать E_ALL | E_STRICT в процессе разработки, чтобы выявить возможные предупреждения и ошибки.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь