Я запускаю сценарий 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"];
В чем смысл этих сообщений об ошибках?
Почему они появляются внезапно? Я использовал этот скрипт в течение многих лет, и у меня никогда не было проблем.
Как мне их исправить?
Это вопрос общего характера, на который люди могут ссылаться как дубликаты, вместо того, чтобы объяснять проблему снова и снова. Я чувствую, что это необходимо, потому что большинство реальных ответов на этот вопрос очень специфичны.
Связанная мета-дискуссия:
and-notice-undef
, просто предложение, чтобы URL не обрезался. Возможно, даже удаляя (слишком много) кавычек. ИлиPHP: “Undefined variable/index/offset” notices
and-notice-undef
. Это было всего лишь (несколько) предложений. Это просто повторяет себя и бытьNotice: Undefined
.Ответы:
Примечание: неопределенная переменная
Из огромной мудрости руководства по PHP :
Из документации PHP :
Это означает , что вы могли бы использовать только
empty()
для определения , если переменная установлена, и кроме того , он проверяет переменную на следующих,0
,0.0
,""
,"0"
,null
,false
или[]
.Пример:
Проверьте приведенный выше фрагмент в онлайн-редакторе PHP 3v4l.org.
Хотя PHP не требует объявления переменных, он рекомендует его для того, чтобы избежать некоторых уязвимостей или ошибок, из-за которых можно забыть присвоить значение переменной, которая будет использоваться позже в сценарии. Что PHP делает в случае необъявленных переменных, так это выдаёт ошибку очень низкого уровня,
E_NOTICE
о которой даже не сообщается по умолчанию, но Руководство рекомендует разрешить это во время разработки.Способы решения проблемы:
Рекомендуется: объявите переменные, например, когда вы пытаетесь добавить строку в неопределенную переменную. Или используйте
isset()
/,!empty()
чтобы проверить, объявлены ли они, прежде чем ссылаться на них, как в:Начиная с PHP 7.0, это стало намного чище, теперь вы можете использовать оператор null coalesce :
Установите собственный обработчик ошибок для E_NOTICE и перенаправьте сообщения из стандартного вывода (возможно, в файл журнала):
Отключить E_NOTICE от отчетов. Быстрый способ исключить только
E_NOTICE
что:Подавить ошибку с помощью оператора @ .
Примечание: настоятельно рекомендуется реализовать только пункт 1.
Примечание: неопределенный индекс / неопределенное смещение
Это уведомление появляется, когда вы (или PHP) пытаетесь получить доступ к неопределенному индексу массива.
Способы решения проблемы:
Проверьте, существует ли индекс, прежде чем получить к нему доступ. Для этого вы можете использовать
isset()
илиarray_key_exists()
:Языковая конструкция
list()
может генерировать это, когда она пытается получить доступ к индексу массива, который не существует:Две переменные используются для доступа к двум элементам массива, однако существует только один элемент массива, индекс
0
, поэтому будет сгенерировано:$_POST
/$_GET
/$_SESSION
ПеременнаяИзвещения выше появляются часто при работе с
$_POST
,$_GET
или$_SESSION
. Для$_POST
и$_GET
вам просто нужно проверить, существует ли индекс, прежде чем использовать их. Поскольку$_SESSION
вы должны убедиться, что сессия началасьsession_start()
и индекс также существует.Также обратите внимание, что все 3 переменные являются суперглобальными и имеют прописные буквы.
Связанные с:
источник
@
) есть некоторые проблемы с производительностью. Кроме того, поскольку он подавляет все ошибки в определенной области, его использование без осторожности может маскировать сообщения, которые вы хотели бы видеть.$var = @$_GET['nonexisting'];
все еще вызывает уведомление ..$value = isset($_POST['value']) ? $_POST['value'] : '';
вместо 4.$value = @$_POST['value'];
?Попробуйте это
Или как быстрое и грязное решение:
Примечание о сессиях:
При использовании сессий,
session_start();
требуется размещать внутри всех файлов с использованием сессий.http://php.net/manual/en/features.sessions.php
источник
E_NOTICE
изphp.ini
файла конфигурации, сделайтеerror_reporting = (E_ALL & ~E_NOTICE)
Ошибка отображения
@
оператораДля нежелательных и избыточных уведомлений можно использовать выделенный
@
оператор, чтобы « скрыть» неопределенные сообщения переменных / индексов.isset?:
или??
супрессия. Уведомления все еще могут быть зарегистрированы. И можно воскресить@
скрытые уведомления:set_error_handler("var_dump");
if (isset($_POST["shubmit"]))
в своем исходном коде.@
илиisset
только после проверки работоспособности.@
в основном приемлемо для$_GET
/$_POST
входных параметров, особенно если они необязательны .И поскольку это охватывает большинство таких вопросов, давайте рассмотрим наиболее распространенные причины:
$_GET
/$_POST
/$_REQUEST
Неопределенный вводПервое, что вы делаете при обнаружении неопределенного индекса / смещения, это проверка на опечатки:
$count = $_GET["whatnow?"];
Во-вторых, если в уведомлении нет явной причины, используйте
var_dump
илиprint_r
для проверки всех входных массивов для их текущего содержимого:Оба покажут, был ли ваш скрипт вызван с правильными или какими-либо параметрами вообще.
В качестве альтернативы или дополнительно используйте ваш браузер devtools ( F12) и проверьте вкладку сети на наличие запросов и параметров:
Параметры POST и вход GET будут показаны отдельно.
Для
$_GET
параметров вы также можете посмотретьQUERY_STRING
вВ 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=
атрибут не хватает.method=POST
Форма должна заполнить$_POST
.method=GET
(или опуская это) приведет к$_GET
переменным.action=script.php?get=param
через $ _GET и оставшиесяmethod=POST
поля в $ _POST.$_REQUEST['vars']
снова, что смешивает параметры GET и POST.Если вы используете mod_rewrite, то вы должны проверить оба параметра,
access.log
а также включить,RewriteLog
чтобы выяснить отсутствующие параметры.$_FILES
$_FILES["formname"]
.enctype=multipart/form-data
method=POST
в вашей<form>
декларации.$_COOKIE
$_COOKIE
Массив никогда не заполняется сразу послеsetcookie()
, но только на любой запрос HTTP Followup.источник
Вообще из-за «плохого программирования» и возможности ошибок сейчас или позже.
if (isset($varname))
перед использованиемисточник
Это означает, что вы тестируете, оцениваете или печатаете переменную, которой вы еще ничего не присвоили. Это означает, что у вас либо опечатка, либо вам нужно сначала проверить, что переменная была инициализирована. Проверьте ваши логические пути, они могут быть установлены в одном пути, но не в другом.
источник
Я не хотел отключать уведомление, потому что это полезно, но хотел избежать слишком большого количества печатания.
Мое решение было этой функцией:
Поэтому, если я хочу сослаться на $ name и echo, если существует, я просто пишу:
Для элементов массива:
На странице, если я хочу сослаться на $ _REQUEST ['name']:
источник
$foo = "BABAR"; ifexists('foo');
в общем случае будет возвращать ноль. (Курсивом являются главы php.net.)if( !empty($user) and !empty($location) ) echo "hello $user ..."
Лучший способ получить входную строку :
Этот однострочник почти эквивалентен:
Если вам абсолютно необходимо строковое значение, например:
источник
Это потому, что переменная '$ user_location' не определена. Если вы используете какой-либо цикл if, внутри которого вы объявляете переменную $ user_location, то вы также должны иметь цикл else и определять его. Например:
Приведенный выше код создаст ошибку, поскольку цикл If не выполняется, а в цикле else «$ user_location» не был определен. Тем не менее, PHP попросили отобразить переменную. Таким образом, чтобы изменить код, вы должны сделать следующее:
источник
В ответ на "" Почему они появляются внезапно? Я использовал этот сценарий в течение многих лет, и у меня никогда не было проблем ».
Для большинства сайтов очень распространено использование отчетов об ошибках «по умолчанию» «Показать все ошибки, но не« уведомления »и« не рекомендуется »». Это будет установлено в php.ini и применимо ко всем сайтам на сервере. Это означает, что те «уведомления», которые используются в примерах, будут подавлены (скрыты), а другие ошибки, считающиеся более важными, будут показаны / записаны.
Другая критическая настройка - ошибки могут быть скрыты (т.е.
display_errors
Установлены на «off» или «syslog»)Что произойдет в этом случае, так это то, что либо
error_reporting
было изменено, чтобы показать уведомления (в соответствии с примерами), и / или что настройки были изменены наdisplay_errors
на экране (в отличие от их подавления / регистрации).Почему они изменились?
Очевидный / самый простой ответ заключается в том, что кто-то изменил эти настройки в php.ini, или обновленная версия PHP теперь использует другой php.ini, чем раньше. Это первое место, чтобы посмотреть.
Однако также возможно переопределить эти настройки в
и любой из них также мог быть изменен.
Существует также дополнительное осложнение, заключающееся в том, что конфигурация веб-сервера может включать / отключать директивы .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 не изменилисьerror_reporting
иdisplay_errors
директивы PHP были установлены там.источник
быстрое решение состоит в том, чтобы присвоить вашей переменной значение null в верхней части кода
источник
Раньше я проклинал эту ошибку, но это может быть полезно напомнить вам, чтобы избежать пользовательского ввода.
Например, если вы думали, что это умный, сокращенный код:
... подумай еще раз! Лучшее решение:
(Я использую пользовательскую
html()
функцию для экранирования символов, ваш пробег может отличаться)источник
В PHP 7.0 теперь можно использовать оператор объединения нулей:
Равно:
Руководство по PHP PHP 7.0
источник
if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }
isset()
, если вы передадитеis_array()
- что является логическим значением, последует неожиданное поведение.Я все время использую собственную полезную функцию exst (), которая автоматически объявляет переменные.
Ваш код будет -
источник
На очень простом языке .
Ошибка в том, что вы используете переменную,
$user_location
которая не была определена ранее и не имеет никакого значения. Поэтому я рекомендую вам объявить эту переменную перед ее использованием , например:$user_location = '';
Или
$user_location = 'Los Angles';
Это очень распространенная ошибка, с которой вы можете столкнуться. Так что не волнуйтесь, просто объявите переменную и наслаждайтесь кодированием .
источник
почему бы не сделать вещи простыми?
источник
ПОЧЕМУ ЭТО ПРОИСХОДИТ?
Со временем PHP стал более ориентированным на безопасность языком. Настройки, которые раньше были отключены по умолчанию, теперь включены по умолчанию. Прекрасный пример этого
E_STRICT
, который стал включенным по умолчанию с PHP 5.4.0 .Кроме того, согласно документации PHP, по умолчанию
E_NOTICE
отключен в php.ini. Документы PHP рекомендуют включать его в целях отладки . Однако, когда я загружаю PHP из репозитория Ubuntu - и из стека Windows BitNami - я вижу что-то еще.Обратите внимание, что
error_reporting
по умолчанию установлено производственное значение, а не значение по умолчанию. Это несколько сбивает с толку и не документировано за пределами php.ini, поэтому я не проверял это в других дистрибутивах.Чтобы ответить на ваш вопрос, однако, эта ошибка появляется сейчас, когда она не появлялась раньше, потому что:
Вы установили PHP, и новые настройки по умолчанию несколько плохо документированы, но не исключают
E_NOTICE
.E_NOTICE
предупреждения, такие как неопределенные переменные и неопределенные индексы, на самом деле помогают сделать ваш код чище и безопаснее. Я могу вам сказать, что несколько лет назадE_NOTICE
включение было вынуждено объявить мои переменные. Это значительно облегчило изучение языка C, если не объявлять переменные, это намного больше неприятностей.Что я могу сделать об этом?
Выключите
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 выполняется, он просто принимает нулевое значение. Однако в каком сценарии вам нужно проверить переменную, прежде чем она будет определена? В конечном счете, это аргумент в пользу «небрежного кода». Как разработчик, я могу сказать вам, что мне нравится, когда я вижу проект с открытым исходным кодом, где переменные определены настолько высоко, насколько это возможно. Это облегчает определение переменных, которые появятся в будущем, и облегчает чтение / изучение кода.Undefined index: my_index
- Это происходит, когда вы пытаетесь получить доступ к значению в массиве, а оно не существует. Чтобы предотвратить эту ошибку, выполните условную проверку.Другой вариант - объявить пустой массив в верхней части вашей функции. Это не всегда возможно.
(дополнительный совет)
vim
человек в эти дни :).источник
неопределенный индекс означает в массиве, который вы запросили, например, недоступный индекс массива
неопределенная переменная означает, что вы использовали полностью несуществующую переменную или которая не определена или инициализирована этим именем, например
неопределенное смещение означает, что в массиве вы запросили несуществующий ключ. И решение для этого, чтобы проверить перед использованием
источник
Относительно этой части вопроса:
Определенных ответов нет, но вот некоторые возможные объяснения того, почему настройки могут «внезапно» измениться:
Вы обновили PHP до более новой версии, которая может иметь другие значения по умолчанию для error_reporting, display_errors или других соответствующих настроек.
Вы удалили или ввели некоторый код (возможно, в зависимости), который устанавливает соответствующие параметры во время выполнения, используя
ini_set()
илиerror_reporting()
(ищите их в коде)Вы изменили конфигурацию веб-сервера (при условии, что здесь используется apache):
.htaccess
файлы и конфигурации vhost также могут управлять настройками php.Обычно уведомления не отображаются / не отображаются (см. Руководство по PHP ), поэтому возможно, что при настройке сервера файл php.ini не мог быть загружен по какой-то причине (права доступа к файлам ??), и вы были по умолчанию , Позднее «ошибка» была устранена (случайно), и теперь она МОЖЕТ загрузить правильный файл php.ini с установленным значением error_reporting для отображения уведомлений.
источник
При работе с классами вы должны убедиться, что вы ссылаетесь на переменные-члены, используя
$this
:источник
Другая причина, по которой будет выдано уведомление с неопределенным индексом, заключается в том, что столбец был опущен в запросе к базе данных.
То есть:
Затем пытаемся получить доступ к большему количеству столбцов / строк внутри цикла.
То есть:
или в
while
цикле:Следует также отметить, что в * NIX OS и Mac OS X все зависит от регистра.
Консультируйтесь со следующими вопросами и ответами на стеке:
Являются ли имена таблиц в MySQL чувствительными к регистру?
MySQL чувствительные к регистру имена таблиц в запросах
MySql - чувствительный к регистру вопрос таблиц на разных серверах
источник
Использование троичного проста, читабельна и чиста:
до PHP 7
Назначьте переменную значению другой переменной, если она установлена, иначе назначьте
null
(или любое другое значение по умолчанию, которое вам нужно):PHP 7+
То же самое, за исключением использования оператора объединения нулей . Больше нет необходимости вызывать,
isset()
поскольку это встроено, и нет необходимости предоставлять переменную для возврата, поскольку предполагается, что она возвращает значение проверяемой переменной:Оба остановят Уведомления от вопроса OP, и оба являются точным эквивалентом:
Если вам не требуется устанавливать новую переменную, вы можете напрямую использовать возвращаемое значение троичной переменной, например, с помощью
echo
аргументов функции и т.д .:Echo:
Функция:
Вышеприведенное будет работать точно так же с массивами, включая сеансы и т. Д., Заменив проверяемую переменную, например:
$_SESSION['checkMe']
или сколько угодно глубоких уровней, например:
$clients['personal']['address']['postcode']
Подавление:
Можно подавить уведомления PHP с помощью
@
или уменьшить уровень сообщений об ошибках, но это не решает проблему , а просто останавливает сообщение в журнале ошибок. Это означает, что ваш код все еще пытался использовать переменную, которая не была установлена, что может означать или не означать, что что-то не работает должным образом - в зависимости от того, насколько важным является отсутствующее значение.Вы действительно должны проверять эту проблему и обрабатывать ее соответствующим образом, либо отправляя другое сообщение, либо даже просто возвращая нулевое значение для всего остального, чтобы определить точное состояние.
Если вы просто заботитесь о том, чтобы Уведомление не было в журнале ошибок, то в качестве опции вы можете просто проигнорировать журнал ошибок.
источник
Одна распространенная причина того, что переменная не существует после отправки HTML- формы, заключается в том, что элемент формы не содержится в
<form>
теге:Пример: элемент не содержится в
<form>
Пример: элемент теперь содержится в
<form>
источник
Вероятно, вы использовали старую версию PHP до и теперь обновили PHP, поэтому он работал без каких-либо ошибок до сих пор от лет. до PHP4 не было никакой ошибки, если вы используете переменную без ее определения, но начиная с PHP5 она выдает ошибки для кодов, подобных упомянутым в вопросе.
источник
При работе с файлами требуются правильный enctype и метод POST, который вызовет неопределенное уведомление об индексе, если оба из них не включены в форму.
В руководстве изложен следующий основной синтаксис:
HTML
PHP
Ссылка:
источник
Я задал вопрос по этому поводу, и меня отправили на этот пост с сообщением:
Я делюсь своим вопросом и решением здесь:
Это ошибка:
Строка 154 является проблемой. Вот что я имею в строке 154:
Я думаю, что проблема в том, что я пишу, если условия для переменной
$city
, которая является не ключом, а значением в$key => $city
. Во-первых, не могли бы вы подтвердить, является ли это причиной предупреждения? Во-вторых, если это проблема, почему я не могу написать условие, основанное на значении? Это должно быть с ключом, что мне нужно написать условие?ОБНОВЛЕНИЕ 1: Проблема в том, что при выполнении
$citiesCounterArray[$key]
иногда$key
соответствует ключу, который не существует в$citiesCounterArray
массиве, но это не всегда так, основываясь на данных моего цикла. Что мне нужно, это установить условие, чтобы, если$key
существует в массиве, затем запустить код, в противном случае пропустите его.ОБНОВЛЕНИЕ 2: Вот как я это исправил, используя
array_key_exists()
:источник
Эти ошибки возникают всякий раз, когда мы используем переменную, которая не установлена.
Лучший способ справиться с этим - установить отчеты об ошибках во время разработки.
Чтобы настроить отчеты об ошибках:
На производственных серверах отчеты об ошибках отключены, поэтому мы не получаем эти ошибки.
Однако на сервере разработки мы можем установить отчеты об ошибках.
Чтобы избавиться от этой ошибки, мы видим следующий пример:
Мы можем инициализировать переменные,
NULL
прежде чем присваивать их значения или использовать их.Итак, мы можем изменить код как:
Это не будет нарушать логику программы и не будет создавать Уведомление, даже если
$test
оно не имеет значения.Так что, в принципе, всегда лучше устанавливать ON для создания отчетов об ошибках.
И исправить все ошибки.
На производстве отчет об ошибках должен быть отключен.
источник
Эти уведомления вызваны тем, что у вас нет используемой переменной,
defined
аmy_index
ключ отсутствует в$my_array
переменной.Эти уведомления были вызваны каждый раз, потому что ваш
code
не правы, но, вероятно, вы не сообщали о них.Решить ошибки:
Еще один способ получить это:
источник
В PHP вам нужно fist, чтобы определить переменную, после чего вы можете использовать ее.
Мы можем проверить, что переменная определена или не очень эффективно!
Простое объяснение
источник