"Notice: Undefined variable", "Notice: Undefined index" и "Notice: Undefined offset" с использованием PHP

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

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

краткое описание: my_index C:\wamp\www\mypath\index.php on line 11

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

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

что означают эти сообщения об ошибках?

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

как их исправить?

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

мета обсуждения:

27 ответов


заметьте: неопределенная переменная

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

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

С PHP документации:

предупреждение не генерируется, если переменная не существует. Те средства пустая() по существу является кратким эквивалентом !использования isset($VAR) как || $ВАР = = false.

это означает, что вы можете использовать только 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:

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

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  3. отключить E_NOTICE из отчетов. Быстрый способ исключить just 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 переменные являются суперглобальные переменные и в верхнем регистре.

по теме:


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

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

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

  • при использовании сессий, session_start(); необходимо поместить внутри всех файлов используя проведение сессий.

  • http://php.net/manual/en/features.sessions.php


ошибка @ оператор

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

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

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

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

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

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

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

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

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

  • Alternativey или дополнительно использовать ваш браузер devtools (F12) и проверьте вкладку Сеть для запросов и параметров:

    browser developer tools / network tab

    параметры и Вход GET будет показан отдельно.

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

    print_r($_SERVER);
    

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

  • более очевидно, посмотрите на свой адрес браузера бар для GET-параметры:

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

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

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

    • обеспечить каждого входного <input name=FOO>
    • на id= или title= атрибута недостаточно.
    • A 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-запросу.
  • кроме того, их время действия истекло, они могут быть ограничением для поддоменов или отдельных путей, а пользователь и браузер могут просто отклонить или удалить их.

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


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

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

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

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

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

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

<?=ifexists('name')?>

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

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

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

<?=ifexistsidx($_REQUEST,'name')?>

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

$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');

Its, потому что переменная '$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;

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

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

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

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

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

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

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

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

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

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

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

резюме

  • Регистрация error_reporting и display_errors директивы php в php.ini не изменился или что вы не используете другой php.Ини от до.
  • Регистрация error_reporting и display_errors директивы php .htconf (или vhosts и т. д.) не изменились
  • Регистрация error_reporting и display_errors директивы php .htaccess не изменились
  • если у вас есть директивы .htaccess, проверьте, все ли они еще разрешено .htconf файл
  • наконец, проверьте свой код; возможно, несвязанная библиотека; чтобы увидеть, если error_reporting и display_errors там были установлены директивы php.

быстрое исправление заключается в присвоении переменной null в верхней части кода

$user_location = null;

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

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

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

...Подумай еще раз! Лучшее решение:

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

(Я использую пользовательский


Я использую все время собственную полезную функцию 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;
}

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


$user_location = '';
или
$user_location = 'Los Angles';
Это очень распространенная ошибка, с которой вы можете столкнуться.Так что не волнуйтесь, просто объявите переменную и наслаждайтесь Кодирование.

в PHP 7.0 теперь можно использовать оператор null coalescing:

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


почему бы не держать вещи простыми?

<?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

?>

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

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

кроме того, согласно документации PHP, defualt,E_NOTICE отключен в php.ini. PHP docs рекомендует включение в целях отладки. Однако, когда Я загружаю 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 фактически установлено значение production по умолчанию, а не значение" default " по умолчанию. Это несколько запутанно и не документировано за пределами php.ini, так что у меня не проверено на других дистрибутивах.

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

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

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

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

  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 (бесплатно) и это дало мне хост предупреждений и уведомлений. Некоторые из них предлагают очень полезные советы. Это не требование, и я больше не использую IDEs, за исключением больших проектов. Я больше vim человек в эти дни :).

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

<?php 

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

?>

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

<?php print_r($myvar); ?>

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

php> echo array_key_exists(1, $myarray);

относительно этой части вопроса:

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

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

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

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

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

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


Если вы работаете с классами, вам нужно убедиться, что вы ссылаетесь на переменные-члены, используя $this:

class Person
{
    protected $firstName;
    protected $lastName;

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

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}

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

то есть:

$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 OS и Mac OS X, вещи чувствительны к регистру.

обратитесь к followning вопросы и ответы на Стек:


С помощью троичная является простым, читаемым и чистым:

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

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

PHP 7+
То же самое, кроме использования Оператор Объединения Null. Больше нет необходимости звонить 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 с помощью @ или уменьшить уровень отчетности об ошибках, но это не помогло, он просто перестает сообщать об этом в журнале ошибок. Это означает, что ваш код все еще пытался использовать переменную, которая не была установлена, что может означать или не означать, что что - то не работает должным образом-в зависимости от того, насколько важно отсутствующее значение.

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

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


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


при работе с файлами требуется правильный тип enctype и метод 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>";

?>

ссылки:


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

пример: элемент, не содержащийся в <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>

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

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

"заметьте: неопределенная переменная", "удачи" и "уведомление: Неопределенное смещение " с использованием PHP

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

это ошибка:

enter image description here

проблема в строке 154. Это то, что я в строке 154:

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

Я думаю, проблема в том, что я пишу, если условия для переменной $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)){

эти уведомления потому, что у вас нет используемой переменной 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)

в 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";
}