@bubihart

Как решить проблему с Notice?

Учу PHP, возникла проблема которую не могу решить:
Выдает вот такой notice, не могу понять что не так:

Notice: Undefined index: captcha in C:\xampp\htdocs\test\add_message.php on line 9

Notice: Undefined index: rand_code in C:\xampp\htdocs\test\add_message.php on line 9

Строчка на которую указывает notice:

if($_POST['captcha'] != $_SESSION['rand_code'])
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
BuriK666
@BuriK666
Компьютерный псих
if (isset($_POST['captcha']) && isset($_SESSION['rand_code'])) {
  if($_POST['captcha'] != $_SESSION['rand_code'])

или
if(@$_POST['captcha'] != @$_SESSION['rand_code'])
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Если совсем по полочкам раскладывать, то:

- Ваша строчка 9 проверяет не равны ли captcha в $_POST и rand_code в $_SESSION.
- Ваша строчка никак не проверяет, чтобы эти переменные существовали / были определены, поэтому когда их нет - PHP информирует вас об этом (Notice) - прямым текстом говорит, что в упомянутых массивах нет таких индексов (элементов).
- Чтобы устранить PHP Notice, необходимо всегда проверять, заданы ли необходимые переменные:

1. В самом простом случае:
if ( 
    ( isset( $_POST['captcha'] ) && isset( $_SESSION['rand_code'] ) ) // переменные / индексы определены
    && $_POST['captcha'] != $_SESSION['rand_code'] // собственно, сравнение значений
) {
    // остальной код
}


2. В реальных условиях чаще всего это происходит в контексте функций / методов и когда идет ряд проверок, принято использовать подход "fail early" (вариации - quit early, bail out early) – проверки идут не вложенными, а одна за одной, наиболее ожидаемые - первыми. Пример аналогичного фрагмента кода с учетом этой практики:
function some_method_name() {

    // Если индексы не существуют или они приводятся к false - выходим из логики
    if ( empty( $_POST['captcha'] ) || empty( $_SESSION['rand_code'] ) ) {
        return; // может быть return false и тд - зависит от конкретной реализации
    }

    // Этот код выполнится только если предыдущая проверка прошла успешно и оба индекса имеют значения с которыми можно работать дальше
    if ( $_POST['captcha'] != $_SESSION['rand_code'] ) {
        // остальной код
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы