"Примечание: неопределенная переменная", "Примечание: неопределенный индекс" и "Примечание: неопределенное смещение" с использованием 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"];
В чем смысл этих сообщений об ошибках?
Почему они появляются внезапно? Я использовал этот скрипт в течение многих лет, и у меня никогда не было проблем.
Как мне их починить?
Это вопрос общего характера, на который люди могут ссылаться как на дубликаты, вместо того, чтобы объяснять проблему снова и снова. Я чувствую, что это необходимо, потому что большинство реальных ответов на этот вопрос очень специфичны.
Связанная мета-дискуссия:
30 ответов
Примечание: неопределенная переменная
Из обширной мудрости руководства по PHP:
Использование значения по умолчанию для неинициализированной переменной проблематично в случае включения одного файла в другой, который использует то же имя переменной. Это также серьезная угроза безопасности с включенным register_globals. Ошибка уровня E_NOTICE выдается в случае работы с неинициализированными переменными, но не в случае добавления элементов в неинициализированный массив. Языковая конструкция isset() может использоваться для определения, была ли переменная уже инициализирована. Дополнительно и более идеальным является решение empty(), поскольку оно не генерирует предупреждение или сообщение об ошибке, если переменная не инициализирована.
Из документации PHP:
Предупреждение не генерируется, если переменная не существует. Это означает, что empty() по сути является кратким эквивалентом ! Isset ($ var) || $ 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";
});
Протестируйте приведенный выше фрагмент в онлайн-редакторе PHP 3v4l.org.
Хотя 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"]))
в вашем исходном коде. - Новички не заметят такие опечатки. Это просто лишает вас уведомлений PHP для тех самых случаев. добавлять
@
или жеisset
только после проверки работоспособности. Сначала устраните причину. Не уведомления.
- Кроме того, вы не должны обычно использовать / рекомендовать
@
в основном приемлемо для$_GET
/$_POST
входные параметры, особенно если они необязательны.
И поскольку это покрывает большинство таких вопросов, давайте рассмотрим наиболее распространенные причины:
$_GET
/ $_POST
/ $_REQUEST
неопределенный ввод
Первое, что вы делаете при обнаружении неопределенного индекса / смещения, это проверка на опечатки:
$count = $_GET["whatnow?"];
- Это ожидаемое имя ключа и присутствует на каждом запросе страницы?
- Имена переменных и указатели массивов чувствительны к регистру в PHP.
Во-вторых, если уведомление не имеет явной причины, используйте
var_dump
или жеprint_r
проверить все входные массивы на предмет их текущего содержания:var_dump($_GET); var_dump($_POST); //print_r($_REQUEST);
Оба покажут, был ли ваш скрипт вызван с правильными или какими-либо параметрами вообще.
В качестве альтернативы или дополнительно используйте ваш браузер devtools (F12) и проверьте вкладку сети на наличие запросов и параметров:
Параметры POST и вход GET будут показаны отдельно.
За
$_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=
атрибута не хватает. -
method=POST
форма должна заселять$_POST
, - Принимая во внимание, что
method=GET
(или опуская это) даст$_GET
переменные. - Форма также может быть предоставлена
action=script.php?get=param
через $_GET и оставшиесяmethod=POST
поля в $_POST рядом. - В современных конфигурациях PHP (≥ 5.6) стало возможным (не модно) использовать
$_REQUEST['vars']
опять же, который смешивает параметры GET и POST.
- Убедитесь, что каждый необходимый вход имеет
Если вы используете 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['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');
Это потому, что переменная '$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 (конфигурация веб-сервера, включая vhosts и субконфигурации) *
- .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;
ПОЧЕМУ ЭТО ПРОИСХОДИТ?
Со временем 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
позволил мне объявить мои переменные. Это намного облегчило изучение 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 выполняется, он просто принимает нулевое значение. Однако, в каком сценарии вам нужно проверить переменную, прежде чем она будет определена? В конечном счете, это аргумент в пользу "небрежного кода". Как разработчик, я могу сказать вам, что мне нравится, когда я вижу проект с открытым исходным кодом, в котором переменные определены настолько высоко, насколько это возможно. Это облегчает определение переменных, которые будут появляться в будущем, и облегчает чтение / изучение кода.
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 (бесплатно), и он дал мне множество предупреждений и уведомлений. Некоторые из них предлагают очень полезные советы. Это не является обязательным требованием, и я больше не использую интегрированные среды разработки, за исключением крупных проектов. Я больше
vim
человек в эти дни:).
Раньше я проклинал эту ошибку, но может быть полезно напомнить вам, что нужно избегать ввода пользователя.
Например, если вы думали, что это умный, сокращенный код:
// Echo whatever the hell this is
<?=$_POST['something']?>
... подумай еще раз! Лучшее решение:
// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>
(Я использую кастом html()
функция экранирования персонажей, ваш пробег может отличаться)
В 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"] : '');
Я все время использую собственную полезную функцию 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
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
$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 для отображения уведомлений.
Использование троичного проста, читабельна и чиста:
До 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 с помощью @
или уменьшите уровень сообщений об ошибках, но это не решит проблему, а просто прекратит ее сообщение в журнале ошибок. Это означает, что ваш код все еще пытался использовать переменную, которая не была установлена, что может означать или не означать, что что-то не работает должным образом - в зависимости от того, насколько важно отсутствующее значение.
Вы действительно должны проверять эту проблему и обрабатывать ее соответствующим образом, либо отправляя другое сообщение, либо даже просто возвращая нулевое значение для всего остального, чтобы идентифицировать точное состояние.
Если вы просто заботитесь о том, чтобы Уведомление не было в журнале ошибок, то в качестве опции вы можете просто проигнорировать журнал ошибок.
При работе с классами вы должны убедиться, что вы ссылаетесь на переменные-члены, используя $this
:
class Person
{
protected $firstName;
protected $lastName;
public function setFullName($first, $last)
{
// Correct
$this->firstName = $first;
// Incorrect
$lastName = $last;
// Incorrect
$this->$lastName = $last;
}
}
Одной из распространенных причин того, что переменная не существует после отправки 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>
Другая причина, по которой будет выдано уведомление с неопределенным индексом, заключается в том, что столбец был опущен в запросе к базе данных.
То есть:
$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 все зависит от регистра.
Консультируйтесь со следующими вопросами и ответами на стеке:
Эти ошибки возникают всякий раз, когда мы используем переменную, которая не установлена.
Лучший способ справиться с этим - установить отчеты об ошибках во время разработки.
Чтобы настроить отчеты об ошибках:
ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);
На производственных серверах отчеты об ошибках отключены, поэтому мы не получаем эти ошибки.
Однако на сервере разработки мы можем установить отчеты об ошибках.
Чтобы избавиться от этой ошибки, мы видим следующий пример:
if ($my == 9) {
$test = 'yes'; // Will produce error as $my is not 9.
}
echo $test;
Мы можем инициализировать переменные в NULL
перед присвоением их значений или их использованием.
Итак, мы можем изменить код как:
$test = NULL;
if ($my == 9) {
$test = 'yes'; // Will produce error as $my is not 9.
}
echo $test;
Это не нарушит логику программы и не выдаст уведомление, даже если $test
не имеет значения.
Так что, в принципе, всегда лучше устанавливать ON для создания отчетов об ошибках.
И исправить все ошибки.
На производстве отчет об ошибках должен быть отключен.
Я задал вопрос по этому поводу, и меня отправили на этот пост с сообщением:
На этот вопрос уже есть ответ здесь:
"Примечание: неопределенная переменная", "Примечание: неопределенный индекс" и "Примечание: неопределенное смещение" с использованием PHP
Я делюсь своим вопросом и решением здесь:
Это ошибка:
Строка 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)){
Если вы отправляете данные в API, просто используйте isset()
if(isset($_POST['param'])){
$param = $_POST['param'];
} else {
#do something else
}
если это ошибка из-за сеанса, убедитесь, что вы правильно запустили сеанс.
Вероятно, вы использовали старую версию PHP до того момента, а теперь обновили PHP, поэтому он работал без ошибок до сих пор годами. до PHP4 не было никакой ошибки, если вы используете переменную без ее определения, но начиная с PHP5 она выдает ошибки для кодов, подобных упомянутым в вопросе.
Различный тип ошибок
1) Примечание: неопределенная переменная
Вы получите эту ошибку, если вы не определили переменную и пытаетесь получить доступ или использовать эту переменную.
Пример:
<?php
echo $a;
?>
Notice: Undefined variable: a
2) Примечание: неопределенный индекс и неопределенное смещение
Это означает, что вы ссылаетесь на ключ массива, который не существует. "Смещение"
относится к целочисленному ключу числового массива, а "индекс" относится к
строковый ключ ассоциативного массива.
<?php
$testArr=array("Test1", "Test2");
print $testArr[2]; //undefined offset
$myArr=array("val1"=>"1", "val2"=>"2");
print $myArr['val3']; //undefined index
?>
В PHP вам нужно fist, чтобы определить переменную, после чего вы можете использовать ее.
Мы можем проверить, что переменная определена или не очень эффективно!
//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";
}
При работе с файлами требуются правильный 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>";
?>
Ссылка:
Эти уведомления, потому что у вас нет используемой переменной 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)