"Уведомление: Неопределенная переменная", "Уведомление: Неопределенный индекс" и "Уведомление: Неопределенное смещение" с использованием PHP


Я запускаю PHP-скрипт и продолжаю получать ошибки, такие как:

Примечание: Неопределенная переменная: my_variable_name в C:\wamp\www\mypath\index.php в строке 10

Примечание: Неопределенный индекс: my_index C:\wamp\www\mypath\index.php в строке 11

Строки 10 и 11 выглядят так:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

В чем смысл этих сообщений об ошибках?

Почему они появляются так внезапно? Я использовал этот сценарий в течение многих лет, и у меня никогда не было проблема.

Как мне их исправить?

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

Соответствующее мета-обсуждение:

Author: Pekka 웃, 2010-11-24

27 answers

Примечание: Неопределенная переменная

Из обширной мудрости Руководства по PHP:

Полагаться на значение по умолчанию неинициализированной переменной проблематично в случае включения одного файла в другой, который использует то же имя переменной. Это также является серьезным риском для безопасности при включенном регистре_глобалов. Ошибка уровня E_NOTICE выдается в случае работы с неинициализированными переменными, однако не в случае добавление элементов в неинициализированный массив. языковая конструкция isset() может использоваться для определения того, была ли переменная уже инициализирована. Дополнительно и более идеальным является решение empty(), поскольку оно не генерирует предупреждение или сообщение об ошибке, если переменная не инициализирована.

Из Документации PHP:

Предупреждение не генерируется, если переменная не существует. Это означает, что пустой() по сути является краткий эквивалент !isset($var)||$var == ложь.

Это означает, что вы можете использовать только empty(), чтобы определить, установлена ли переменная, и, кроме того, она проверяет переменную на соответствие следующему, 0,"",null.

Пример:

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "\n";
});

Проверьте приведенный выше фрагмент в 3v4l.org онлайн редактор PHP

Хотя PHP не требует объявления переменной, он рекомендует это, чтобы избежать некоторых уязвимостей в системе безопасности или ошибки, при которых можно было бы забыть указать значение переменной, которая будет использоваться позже в сценарии. Что PHP делает в случае необъявленных переменных, так это выдает ошибку очень низкого уровня E_NOTICE, о которой даже не сообщается по умолчанию, но Руководство советует разрешить во время разработки.

Способы решения этой проблемы:

  1. Рекомендуется: Объявляйте свои переменные, например, когда вы пытаетесь добавить строку к неопределенной переменной. Или использовать isset() / !empty() чтобы проверить, объявлены ли они, прежде чем ссылаться на них, как в:

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';
    

    Это стало намного чище с PHP 7.0, теперь вы можете использовать оператор null coalesce:

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. Установите пользовательский обработчик ошибок для E_NOTICE и перенаправьте сообщения из стандартного вывода (возможно, в файл журнала):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  3. Отключите E_NOTICE от отчетов. Быстрый способ исключить просто E_NOTICE является:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  4. Подавите ошибку с помощью оператора @.

Примечание: Настоятельно рекомендуется реализовать только пункт 1.

Примечание: Неопределенный индекс /Неопределенное смещение

Это уведомление появляется, когда вы (или PHP) пытаетесь получить доступ к неопределенному индексу массива.

Способы решения этой проблемы:

  1. Проверьте, существует ли индекс, прежде чем обращаться к нему. Для этого вы можете использовать isset() или array_key_exists():

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
  2. Языковая конструкция list() может генерировать это, когда он пытается получить доступ к индексу массива, который не существует:

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    

Две переменные используются для доступа к двум элементам массива, однако существует только один элемент массива, индекс 0, поэтому это приведет к созданию:

Примечание: Неопределенное смещение: 1

$_POST / $_GET / $_SESSION переменная

Уведомления, приведенные выше, часто появляются при работе с $_POST, $_GET или $_SESSION. Для $_POST и $_GET вам просто нужно проверить, существует ли индекс или нет, прежде чем использовать их. Для $_SESSION вы должны убедиться, что сеанс начался с session_start() и что индекс также существует.

Также обратите внимание, что все 3 переменные являются суперглобальными и прописными.

Связанные:

 896
Author: Rizier123, 2018-05-25 18:40:39

Попробуйте эти

Q1: это уведомление означает, что $varname не определен в текущей области действия скрипта.

Q2: Использование условий isset(), empty() перед использованием любой подозрительной переменной хорошо работает.

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';

// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
     $user_name = $_SESSION['user_name'];
}

Или, в качестве быстрого и грязного решения:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

Примечание о сеансах:

 112
Author: Ish, 2018-06-26 14:58:33

Отображение ошибок @ оператор

Для нежелательных и избыточных уведомлений можно использовать выделенный @ оператор для " скрыть " неопределенные сообщения переменной/индекса.

$var = @($_GET["optional_param"]);
  • Обычно это не поощряется. Новички, как правило, злоупотребляют этим.
  • Это очень неуместно для кода глубоко в логике приложения (игнорирование необъявленных переменных там, где этого делать не следует), например, для параметров функций или в петли.
  • Однако есть один плюс по сравнению с isset?: или ?? суперпрессией. Уведомления все еще могут регистрироваться. И можно воскресить @- скрытые уведомления с помощью: set_error_handler("var_dump");
    • Кроме того, вы не должны обычно использовать/рекомендовать if (isset($_POST["shubmit"])) в своем исходном коде.
    • Новички не заметят таких опечаток. Это просто лишает вас уведомлений PHPs для тех самых случаев. Добавьте @ или isset только после проверки функциональности.
    • Сначала устраните причину. Не тот уведомления.

  • @ в основном приемлемо для $_GET/$_POST входные параметры, в частности , если они необязательны.

И поскольку это охватывает большинство таких вопросов, давайте подробнее остановимся на наиболее распространенных причинах:

$_GET / $_POST / $_REQUEST неопределенный ввод

  • Первое, что вы делаете, когда сталкиваетесь с неопределенным индексом/смещением, - это проверяете наличие опечаток:
    $count = $_GET["whatnow?"];

    • Является ли это ожидаемое имя ключа и присутствует в каждом запросе страницы?
    • Имена переменных и обозначения массивов в PHP чувствительны к регистру.
  • Во-вторых, если уведомление не имеет очевидной причины, используйте var_dump или print_r чтобы проверить все входные массивы на предмет их текущего содержимого:

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);
    

    Оба покажут, был ли ваш скрипт вызван с правильными или вообще какими-либо параметрами.

  • Альтернативный или дополнительно используйте свой средства разработки браузера ( F12) и проверьте вкладку сеть на наличие запросов и параметров:

    browser developer tools / network tab

    Параметры публикации и ввода будут показаны отдельно.

  • Для параметров $_GET вы также можете заглянуть в QUERY_STRING в

    print_r($_SERVER);
    

    В PHP есть некоторые правила для объединения нестандартных имен параметров в суперглобальные. Apache также может немного переписать. Ты можешь также посмотрите на предоставленные необработанные $_COOKIES и другие заголовки HTTP-запросов таким образом.

  • Более очевидно, что посмотрите в адресной строке вашего браузера для ПОЛУЧЕНИЯ параметров:

    http://example.org/script.php?id=5&sort=desc

    Пары name=value после вопросительного знака ? являются параметрами вашего запроса (GET). Таким образом, этот URL-адрес может привести только к $_GET["id"] и $_GET["sort"].

  • Наконец-то проверьте свой <form> и <input> объявления, если вы ожидаете параметр, но получаете нет.

    • Убедитесь, что каждый требуемый ввод имеет <input name=FOO>
    • Атрибута id= или title= недостаточно.
    • Форма method=POST должна заполняться $_POST.
    • В то время как method=GET (или опуская его) приведет к $_GET переменным.
    • Также возможно, чтобы форма предоставляла action=script.php?get=param через $_GET и остальные method=POST поля в $_POST рядом.
    • С современными конфигурациями PHP (≥5.6) стало возможным (не модно) использовать $_REQUEST['vars'] опять же, какие пюре ПОЛУЧАЮТ и ПУБЛИКУЮТ параметры.
  • Если вы используете mod_rewrite, то вам следует проверить как access.log, так и включить RewriteLog чтобы выяснить отсутствующие параметры.

$_FILES

  • Те же проверки на вменяемость применяются к загрузке файлов и $_FILES["formname"].
  • Кроме того, проверьте наличие enctype=multipart/form-data
  • , а также method=POST в вашей <form> декларации.
  • Смотрите также: Неопределенный индекс PHP ошибка $_FILES?

$_COOKIE

  • Массив $_COOKIE никогда не заполняется сразу после setcookie(), но только при любом последующем HTTP-запросе.
  • Кроме того, время их действия истекло, они могут быть ограничены поддоменами или отдельными путями, и пользователь и браузер могут просто отклонить или удалить их.
 49
Author: mario, 2018-08-22 21:16:29

Это означает, что вы тестируете, оцениваете или печатаете переменную, которой вы еще ничего не назначили. Это означает, что у вас либо опечатка, либо вам нужно сначала проверить, была ли переменная инициализирована чем-то. Проверьте свои логические пути, они могут быть установлены в одном пути, но не в другом.

 37
Author: DGM, 2010-11-24 02:43:04

Как правило, из-за "плохого программирования" и возможности ошибок сейчас или позже.

  1. Если это ошибка, сначала выполните правильное присвоение переменной: $varname=0;
  2. Если он действительно определен только иногда, проверьте его: if (isset($varname)), прежде чем использовать его
  3. Если это потому, что вы неправильно написали, просто исправьте это
  4. Возможно, даже в вас появятся предупреждения PHP-настройки
 36
Author: Erik, 2018-04-11 08:46:21

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

Моим решением была такая функция:

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}

Поэтому, если я хочу сослаться на $name и echo, если оно существует, я просто пишу:

<?=ifexists('name')?>

Для элементов массива:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

На странице, если я хочу сослаться на $_REQUEST['имя']:

<?=ifexistsidx($_REQUEST,'name')?>
 32
Author: Ferenci Zoltán László, 2011-12-30 14:14:59

Лучший способ получить ввод строка :

$value = filter_input(INPUT_POST, 'value');

Этот однострочный текст почти эквивалентен:

if (!isset($_POST['value'])) {
    $value = null;
} elseif (is_array($_POST['value'])) {
    $value = false;
} else {
    $value = $_POST['value'];
}

Если вам абсолютно необходимо строковое значение, например:

$value = (string)filter_input(INPUT_POST, 'value');
 25
Author: mpyw, 2014-08-26 22:15:35

Это потому, что переменная '$user_location' не определяется. Если вы используете какой-либо цикл if, внутри которого вы объявляете переменную '$user_location', то у вас также должен быть цикл else и определить то же самое. Например:

$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;

Приведенный выше код приведет к ошибке, так как цикл if не выполняется, а в цикле else "$user_location" не был определен. Тем не менее PHP попросили повторить переменную. Поэтому, чтобы изменить код, вы должны сделать следующее:

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;
 24
Author: Roger, 2013-09-22 12:55:31

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

Для большинства сайтов очень часто используется сообщение об ошибках "по умолчанию" "Показывать все ошибки, но не "уведомления" и "устаревшие"". Это будет задано в php.ini и применено ко всем сайтам на сервере. Это означает, что те "уведомления", которые используются в примерах, будут подавлены (скрыты), в то время как другие ошибки, которые считаются более критичными, будут показано/записано.

Другой критической настройкой является то, что ошибки могут быть скрыты (т.Е. display_errors установлено значение "выключено" или "системный журнал").

Что произойдет в этом случае, так это то, что либо error_reporting был изменен, чтобы также показывать уведомления (в соответствии с примерами) и/или что настройки были изменены на display_errors на экране (в отличие от подавления их/регистрации их).

Почему они изменились?

Очевидный/самый простой ответ заключается в том, что кто-то изменил любую из этих настроек в php.ini или обновленная версия PHP теперь использует другой php.ini, чем раньше. Это первое место, куда нужно заглянуть.

Однако также возможно переопределить эти настройки в

  • .htconf (конфигурация веб-сервера, включая хосты и субконфигурации)*
  • .htaccess
  • в самом коде php

И любой из них также мог быть изменен.

Существует также дополнительное усложнение, которое может быть связано с конфигурацией веб-сервера. включите/отключите директивы .htaccess, поэтому, если у вас есть директивы в.htaccess, которые внезапно начинают/перестают работать, вам нужно это проверить.

(.htconf/.htaccess предположим, что вы работаете от имени apache. Если вы используете командную строку, это не будет применяться; если вы используете IIS или другой веб-сервер, вам нужно будет соответствующим образом проверить эти конфигурации)

Резюме

  • Проверьте error_reporting и display_errors директивы php в php.ini не изменились или вы не используете другой php.ini из предыдущих.
  • Проверьте error_reporting и display_errors директивы php в .htconf (или vhosts и т. Д.) Не изменились
  • Проверьте error_reporting и display_errors директивы php в .htaccess не изменились
  • Если у вас есть директива в файле .htaccess, проверьте, разрешены ли они по-прежнему в файле .htconf
  • Наконец, проверьте свой код; возможно, несвязанную библиотеку; чтобы узнать, установлены ли там директивы error_reporting и display_errors php.
 24
Author: Robbie, 2016-11-23 01:44:03

Быстрое решение состоит в том, чтобы присвоить вашей переменной значение null в верхней части кода

$user_location = null;
 17
Author: Shahin Mammadzada, 2014-05-12 19:02:26

Раньше я проклинал эту ошибку, но может быть полезно напомнить вам, чтобы избежать ввода пользователем.

Например, если вы считаете, что это умно, сокращенный код:

// Echo whatever the hell this is
<?=$_POST['something']?>

...Подумай еще раз! Лучшим решением является:

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

(Я использую пользовательскую функцию html() для экранирования символов, ваш пробег может отличаться)

 15
Author: rybo111, 2015-07-28 19:12:50

Я все время использую собственную полезную функцию exst(), которая автоматически объявляет переменные.

Ваш код будет -

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}
 13
Author: user2253362, 2013-04-09 14:07:38

На очень Простом языке.
Ошибка в том, что вы используете переменную $user_location, которая не была определена вами ранее, и у нее нет никакого значения, поэтому я рекомендую вам, пожалуйста, объявить эту переменную перед используя это, Например:


$user_location = '';
Или
$user_location = 'Los Angles';
Это очень распространенная ошибка, с которой вы можете столкнуться.Так что не волнуйтесь, просто объявите переменную и Наслаждайтесь кодированием .
 13
Author: Rishabh Seth, 2015-12-18 11:06:24

В PHP 7.0 теперь можно использовать оператор объединения Null:

echo "My index value is: " . ($my_array["my_index"] ?? '');

Равно:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

PHP руководство PHP 7.0

 12
Author: Lachezar Lechev, 2016-12-13 13:34:57

Почему бы не упростить ситуацию?

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']);         // returns null without any notice
echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>
 7
Author: gts, 2013-06-06 20:37:30

ПОЧЕМУ ЭТО ПРОИСХОДИТ?

Со временем PHP стал более ориентированным на безопасность языком. Настройки, которые раньше были отключены по умолчанию, теперь включены по умолчанию. Прекрасным примером этого является E_STRICT, который был включен по умолчанию с PHP 5.4.0.

Кроме того, согласно документации PHP, по умолчанию E_NOTICE отключен в php.ini. Документы PHP рекомендуют включить его для целей отладки . Однако, когда я загружаю PHP с Репозиторий Ubuntu – и из стека Windows BitNami – я вижу кое-что еще.

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

Обратите внимание, что error_reporting на самом деле по умолчанию установлено значение производства, а не значение "по умолчанию" по умолчанию. Это несколько сбивает с толку и не задокументировано за пределами php.ini, поэтому у меня есть нет проверил это на других дистрибутивах.

Чтобы ответить на ваш вопрос, однако, эта ошибка появляется сейчас, когда она не появлялась раньше, потому что:

  1. Вы установили PHP и новые настройки по умолчанию несколько плохо документированы, но не исключают E_NOTICE.

  2. E_NOTICE предупреждения, такие как неопределенные переменные и неопределенные индексы, на самом деле помогают сделать ваш код более чистым и безопасным. Я могу сказать вам, что много лет назад сохранение E_NOTICE включенным вынудило меня объявить свои переменные. Это значительно облегчило изучение языка Си, где отсутствие объявления переменных является гораздо большей помехой.

ЧТО Я МОГУ С ЭТИМ ПОДЕЛАТЬ?

  1. Выключите E_NOTICE скопировав "Значение по умолчанию" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED и заменив его тем, что в настоящее время раскомментировано после знака равенства error_reporting =. Перезапустите Apache или PHP, если используете CGI или FPM. Убедитесь, что вы редактируете "правильный" php.ini. Правильным будет Apache, если вы используете PHP с Apache, fpm или php-fpm, если вы используете PHP-FPM, cgi, если вы используете PHP-CGI и т. Д. Это не рекомендуемый метод, но если у вас есть устаревший код, который будет чрезвычайно сложно редактировать, то это может быть вашим лучшим решением ставка.

  2. Отключите E_NOTICE на уровне файла или папки. Это может быть предпочтительнее, если у вас есть какой-то устаревший код, но в противном случае вы хотите делать все "правильно". Для этого вам следует проконсультироваться с Apache2, nginx или любым другим выбранным вами сервером. В Apache вы бы использовали php_value внутри <Directory>.

  3. Перепишите свой код, чтобы он был чище. Если вам нужно сделать это при переходе в производственную среду или вы не хотите, чтобы кто-то видел ваши ошибки, убедитесь, что вы отключение любого отображения ошибок и только регистрация ваших ошибок (см. display_errors и log_errors в php.ini и настройках вашего сервера).

Чтобы расширить вариант 3: Это идеальный вариант. Если вы можете пойти этим путем, вы должны. Если вы изначально не собираетесь следовать этим маршрутом, подумайте о том, чтобы в конечном итоге перейти на этот маршрут, протестировав свой код в среде разработки. Пока вы этим занимаетесь, избавьтесь от ~E_STRICT и ~E_DEPRECATED, чтобы посмотреть, что может пойти не так в будущем. Вы увидите МНОГО незнакомые ошибки, но это избавит вас от любых неприятных проблем, когда вам потребуется обновить PHP в будущем.

ЧТО ОЗНАЧАЮТ ОШИБКИ?

Undefined variable: my_variable_name - Это происходит, когда переменная не была определена перед использованием. Когда PHP-скрипт выполняется, он внутренне просто принимает нулевое значение. Однако в каком сценарии вам нужно было бы проверить переменную до того, как она была определена? В конечном счете, это аргумент в пользу "неаккуратного кода". Как разработчик, я могу сказать вам, что я мне нравится, когда я вижу проект с открытым исходным кодом, в котором переменные определены настолько высоко в своих областях, насколько их можно определить. Это облегчает определение того, какие переменные будут появляться в будущем, и облегчает чтение/изучение кода.

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

Undefined index: my_index - Это происходит, когда вы пытаетесь получить доступ к значению в массиве, а оно не существует. Чтобы предотвратить эту ошибку, выполните условную проверку.

// verbose way - generally better
if (isset($my_array['my_index'])) {
    echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;   

Другой вариант - объявить пустой массив в верхней части вашей функции. Этот это не всегда возможно.

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

(дополнительный совет)

  • Когда я столкнулся с этими и другими проблемами, я использовал IDE NetBeans (бесплатно), и это дало мне множество предупреждений и уведомлений. Некоторые из них предлагают очень полезные советы. Это не является обязательным требованием, и я больше не использую IDE, за исключением крупных проектов. В наши дни я больше похож на vim человека:).
 7
Author: smcjones, 2016-11-28 23:01:31

Неопределенный индекс означает в массиве, который вы запросили для недоступного индекса массива, например

<?php 

$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);

?>

Неопределенная переменная означает, что вы использовали полностью несуществующую переменную или которая не определена или не инициализирована этим именем, например

<?php print_r($myvar); ?>

Неопределенное смещение означает, что в массиве вы запросили несуществующий ключ. И решение для этого состоит в том, чтобы проверить перед использованием

php> echo array_key_exists(1, $myarray);
 5
Author: Sintayehu Abaynhe, 2017-06-30 01:02:18

Что касается этой части вопроса:

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

Однозначных ответов нет, но вот несколько возможных объяснений того, почему настройки могут "внезапно" измениться:

  1. Вы обновили PHP до более новой версии, которая может иметь другие значения по умолчанию для error_reporting, display_errors или других соответствующих настроек.

  2. Вы удалили или введен некоторый код (возможно, в зависимости), который устанавливает соответствующие параметры во время выполнения с помощью ini_set() или error_reporting() (найдите их в коде)

  3. Вы изменили конфигурацию веб-сервера (предполагая, что здесь используется apache): .htaccess файлы и конфигурации vhost также могут управлять настройками php.

  4. Обычно уведомления не отображаются /не сообщаются (см. Руководство по PHP) таким образом, возможно, что при настройке сервера по какой-то причине не удалось загрузить файл php.ini (права доступа к файлам??) и у вас были настройки по умолчанию. Позже "ошибка" была устранена (случайно), и теперь она МОЖЕТ загрузить правильный файл php.ini с параметром error_reporting, установленным для отображения уведомлений.

 3
Author: Wouter de Winter, 2016-11-28 19:31:39

При работе с классами вам необходимо убедиться, что вы ссылаетесь на переменные-члены с помощью $this:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}
 2
Author: John Conde, 2017-07-20 11:44:13

Еще одна причина, по которой будет выдано уведомление о неопределенном индексе, заключается в том, что столбец был опущен из запроса базы данных.

Т.е.:

$query = "SELECT col1 FROM table WHERE col_x = ?";

Затем пытается получить доступ к большему количеству столбцов/строк внутри цикла.

Т.е.:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

Или в цикле while:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

Что-то еще, что необходимо отметить, так это то, что в ОС *NIX и Mac OS X все зависит от регистра.

Обратитесь к следующим вопросам и ответам в стеке:

 2
Author: Fred -ii-, 2017-10-25 10:15:26

Использование троичного является простым, читаемым и чистым:

Предварительно PHP 7
Присвойте переменной значение другой переменной, если оно установлено, иначе присвойте null (или любое другое значение по умолчанию , которое вам нужно):

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

PHP 7+
То же самое, за исключением использования Нулевого оператора объединения . Больше нет необходимости вызывать isset(), поскольку это встроено, и нет необходимости предоставлять переменную для возврата, поскольку предполагается, что она возвращается значение проверяемой переменной:

$newVariable = $thePotentialData ?? null;

Оба остановят уведомления от вопроса OP, и оба являются точным эквивалентом:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

 
Если вам не требуется устанавливать новую переменную, вы можете напрямую использовать возвращаемое значение тернарного числа, например, с помощью echo, аргументов функции и т. Д.:

Эхо:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

Функция:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}

Вышесказанное будет работать точно так же с массивами, включая сеансы и т.д., Заменяя проверяемую переменную, например,:
$_SESSION['checkMe']
или сколько бы уровней вам ни понадобилось, например:
$clients['personal']['address']['postcode']


 

Подавление:

Можно подавить уведомления PHP с помощью @ или снизить уровень отчетов об ошибках, но это не устраняет проблему, это просто останавливает ее сообщение в журнале ошибок. Это означает, что ваш код все еще пытался использовать переменную, которая не была установлена, что может или может не означать, что что-то не работает должным образом - в зависимости от того, насколько важно отсутствующее значение.

Вам действительно следует проверить наличие этой проблемы и обработать ее надлежащим образом, либо отправив другое сообщение, либо даже просто вернув нулевое значение для всего остального, чтобы определить точное состояние.

Если вы просто заботитесь о том, чтобы уведомление не было в журнале ошибок, то в качестве опции вы можете просто игнорировать журнал ошибок.

 1
Author: James, 2018-07-06 18:56:38

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

 0
Author: phvish, 2017-08-30 09:08:24

При работе с файлами требуется правильный тип кода и метод POST, который вызовет уведомление о неопределенном индексе, если они не включены в форму.

В руководстве указан следующий базовый синтаксис:

HTML

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

PHP

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

Ссылка:

 0
Author: Funk Forty Niner, 2017-10-07 12:21:51

Одной из распространенных причин отсутствия переменной после отправки HTML-формы является то, что элемент формы не содержится в теге <form>:

Пример: Элемент, не содержащийся в <form>

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

Пример: Элемент, который теперь содержится в <form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>
 0
Author: John Conde, 2018-07-05 20:46:04

Я задал вопрос по этому поводу, и меня сослали на этот пост с сообщением:

На этот вопрос уже есть ответ здесь:

"Уведомление: Неопределенная переменная", "Уведомление: Неопределенный индекс" и "Уведомление: Неопределенное смещение" с использованием PHP

Я делюсь своим вопросом и решением здесь:

Это ошибка:

enter image description here

Проблема в строке 154. Вот что у меня есть в строке 154:

153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

Я думаю, проблема в том, что я пишу условия if для переменной $city, которая является не ключом, а значением в $key => $city. Во-первых, не могли бы вы подтвердить, является ли это причиной предупреждения? Во-вторых, если в этом проблема, то почему я не могу написать условие, основанное на значении? Обязательно ли это должно быть с ключом, который мне нужен, чтобы написать условие?

ОБНОВЛЕНИЕ 1: Проблема в том, что при выполнении $citiesCounterArray[$key] иногда $key соответствует ключу, которого нет в массиве $citiesCounterArray, но это не всегда так, основываясь на данных моего цикла. Что мне нужно, так это установить условие, чтобы, если $key существует в массиве, затем запустите код, в противном случае пропустите его.

ОБНОВЛЕНИЕ 2: Вот как я исправил это с помощью array_key_exists():

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
 0
Author: Jaime Montoya, 2018-09-01 18:31:57

Эти уведомления вызваны тем, что у вас нет используемой переменной defined, а ключ my_index отсутствовал в переменной $my_array.

Эти уведомления срабатывали каждый раз, потому что ваш code неверен, но, вероятно, у вас не было сообщения об уведомлениях.

Устраните ошибки:

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}

Еще один способ выяснить это:

ini_set("error_reporting", false)
 -1
Author: Andrei Todorut, 2018-01-25 13:09:56

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

//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}

Простое Объяснение

//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}
 -1
Author: Manish Goswami, 2018-05-17 02:43:09