"Уведомление: Неопределенная переменная", "Уведомление: Неопределенный индекс" и "Уведомление: Неопределенное смещение" с использованием 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"];
В чем смысл этих сообщений об ошибках?
Почему они появляются так внезапно? Я использовал этот сценарий в течение многих лет, и у меня никогда не было проблема.
Как мне их исправить?
Это общий справочный вопрос, на который люди могут ссылаться как на дубликат, вместо того, чтобы объяснять проблему снова и снова. Я чувствую, что это необходимо, потому что большинство реальных ответов на этот вопрос очень конкретны.
Соответствующее мета-обсуждение:
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
, о которой даже не сообщается по умолчанию, но Руководство советует разрешить во время разработки.
Способы решения этой проблемы:
-
Рекомендуется: Объявляйте свои переменные, например, когда вы пытаетесь добавить строку к неопределенной переменной. Или использовать
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'] ?? '';
-
Установите пользовательский обработчик ошибок для E_NOTICE и перенаправьте сообщения из стандартного вывода (возможно, в файл журнала):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
-
Отключите E_NOTICE от отчетов. Быстрый способ исключить просто
E_NOTICE
является:error_reporting( error_reporting() & ~E_NOTICE )
Подавите ошибку с помощью оператора @.
Примечание: Настоятельно рекомендуется реализовать только пункт 1.
Примечание: Неопределенный индекс /Неопределенное смещение
Это уведомление появляется, когда вы (или PHP) пытаетесь получить доступ к неопределенному индексу массива.
Способы решения этой проблемы:
-
Проверьте, существует ли индекс, прежде чем обращаться к нему. Для этого вы можете использовать
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'] : '';
-
Языковая конструкция
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();
необходимо поместить во все файлы, используя сессий.
Отображение ошибок @
оператор
Для нежелательных и избыточных уведомлений можно использовать выделенный @
оператор для " скрыть " неопределенные сообщения переменной/индекса.
$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) и проверьте вкладку сеть на наличие запросов и параметров:
Параметры публикации и ввода будут показаны отдельно.
-
Для параметров
$_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-запросе. - Кроме того, время их действия истекло, они могут быть ограничены поддоменами или отдельными путями, и пользователь и браузер могут просто отклонить или удалить их.
Это означает, что вы тестируете, оцениваете или печатаете переменную, которой вы еще ничего не назначили. Это означает, что у вас либо опечатка, либо вам нужно сначала проверить, была ли переменная инициализирована чем-то. Проверьте свои логические пути, они могут быть установлены в одном пути, но не в другом.
Как правило, из-за "плохого программирования" и возможности ошибок сейчас или позже.
- Если это ошибка, сначала выполните правильное присвоение переменной: $varname=0;
- Если он действительно определен только иногда, проверьте его:
if (isset($varname))
, прежде чем использовать его - Если это потому, что вы неправильно написали, просто исправьте это
- Возможно, даже в вас появятся предупреждения 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['имя']:
<?=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');
Это потому, что переменная '$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
установлено значение "выключено" или "системный журнал").
Что произойдет в этом случае, так это то, что либо 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.
Быстрое решение состоит в том, чтобы присвоить вашей переменной значение 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']) : ''?>
(Я использую пользовательскую функцию html()
для экранирования символов, ваш пробег может отличаться)
Я все время использую собственную полезную функцию 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:
echo "My index value is: " . ($my_array["my_index"] ?? '');
Равно:
echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');
Почему бы не упростить ситуацию?
<?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, по умолчанию 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, поэтому у меня есть нет проверил это на других дистрибутивах.
Чтобы ответить на ваш вопрос, однако, эта ошибка появляется сейчас, когда она не появлялась раньше, потому что:
Вы установили PHP и новые настройки по умолчанию несколько плохо документированы, но не исключают
E_NOTICE
.E_NOTICE
предупреждения, такие как неопределенные переменные и неопределенные индексы, на самом деле помогают сделать ваш код более чистым и безопасным. Я могу сказать вам, что много лет назад сохранениеE_NOTICE
включенным вынудило меня объявить свои переменные. Это значительно облегчило изучение языка Си, где отсутствие объявления переменных является гораздо большей помехой.
ЧТО Я МОГУ С ЭТИМ ПОДЕЛАТЬ?
Выключите
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 и т. Д. Это не рекомендуемый метод, но если у вас есть устаревший код, который будет чрезвычайно сложно редактировать, то это может быть вашим лучшим решением ставка.Отключите
E_NOTICE
на уровне файла или папки. Это может быть предпочтительнее, если у вас есть какой-то устаревший код, но в противном случае вы хотите делать все "правильно". Для этого вам следует проконсультироваться с Apache2, nginx или любым другим выбранным вами сервером. В Apache вы бы использовалиphp_value
внутри<Directory>
.Перепишите свой код, чтобы он был чище. Если вам нужно сделать это при переходе в производственную среду или вы не хотите, чтобы кто-то видел ваши ошибки, убедитесь, что вы отключение любого отображения ошибок и только регистрация ваших ошибок (см.
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
человека:).
Неопределенный индекс означает в массиве, который вы запросили для недоступного индекса массива, например
<?php
$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);
?>
Неопределенная переменная означает, что вы использовали полностью несуществующую переменную или которая не определена или не инициализирована этим именем, например
<?php print_r($myvar); ?>
Неопределенное смещение означает, что в массиве вы запросили несуществующий ключ. И решение для этого состоит в том, чтобы проверить перед использованием
php> echo array_key_exists(1, $myarray);
Что касается этой части вопроса:
Почему они появляются так внезапно? Я использовал этот скрипт в течение многих лет, и у меня никогда не было никаких проблем.
Однозначных ответов нет, но вот несколько возможных объяснений того, почему настройки могут "внезапно" измениться:
Вы обновили PHP до более новой версии, которая может иметь другие значения по умолчанию для error_reporting, display_errors или других соответствующих настроек.
Вы удалили или введен некоторый код (возможно, в зависимости), который устанавливает соответствующие параметры во время выполнения с помощью
ini_set()
илиerror_reporting()
(найдите их в коде)Вы изменили конфигурацию веб-сервера (предполагая, что здесь используется apache):
.htaccess
файлы и конфигурации vhost также могут управлять настройками php.Обычно уведомления не отображаются /не сообщаются (см. Руководство по 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 и Mac OS X все зависит от регистра.
Обратитесь к следующим вопросам и ответам в стеке:
Использование троичного является простым, читаемым и чистым:
Предварительно 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 с помощью @
или снизить уровень отчетов об ошибках, но это не устраняет проблему, это просто останавливает ее сообщение в журнале ошибок. Это означает, что ваш код все еще пытался использовать переменную, которая не была установлена, что может или может не означать, что что-то не работает должным образом - в зависимости от того, насколько важно отсутствующее значение.
Вам действительно следует проверить наличие этой проблемы и обработать ее надлежащим образом, либо отправив другое сообщение, либо даже просто вернув нулевое значение для всего остального, чтобы определить точное состояние.
Если вы просто заботитесь о том, чтобы уведомление не было в журнале ошибок, то в качестве опции вы можете просто игнорировать журнал ошибок.
Вероятно, вы использовали старую версию PHP до и теперь обновили PHP, поэтому он работал без каких-либо ошибок до сих пор с годами. до PHP4 не было ошибки, если вы используете переменную без ее определения, но начиная с PHP5 и далее она выдает ошибки для кодов, подобных упомянутым в вопросе.
При работе с файлами требуется правильный тип кода и метод 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>
:
Пример: Элемент, не содержащийся в <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
Я делюсь своим вопросом и решением здесь:
Это ошибка:
Проблема в строке 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)){
Эти уведомления вызваны тем, что у вас нет используемой переменной 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";
}