it-swarm.com.ru

«Примечание: неопределенная переменная», «Примечание: неопределенный индекс» и «Примечание: неопределенное смещение» с помощью 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"];

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

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

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

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

Связанная мета-дискуссия:

1085
Pekka 웃

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

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

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

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

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

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

Пример:

$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";
});

Протестируйте приведенный выше фрагмент в v4l.org online PHP редактор

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Связанные с:

990
Alin Purcaru

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

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

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

125
Ish

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

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

$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 , чтобы проверить all входные массивы для их текущего содержимого:

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

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

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

    browser developer tools / network tab

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

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

    print_r($_SERVER);
    

    В PHP есть несколько правил для coalesce нестандартных имен параметров в суперглобальные переменные. 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 params.
  • Если вы используете mod_rewrite, то вы должны проверить оба access.log, а также включить RewriteLog , чтобы определить отсутствующие параметры.

$_FILES

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

$_COOKIE

  • Массив $_COOKIE никогда не заполняется сразу после setcookie(), а только при любом последующем HTTP-запросе.
  • Кроме того, срок их действия истекает, они могут быть ограничены поддоменами или отдельными путями, и пользователь и браузер могут просто отклонить или удалить их.
58
mario

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

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

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

39
DGM

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

Мое решение было этой функцией:

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')?>
34
Ferenci Zoltán László

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

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

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

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

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

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

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

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

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

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

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

Summary

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

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

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

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

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

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

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

$value = (string)filter_input(INPUT_POST, 'value');
25
mpyw

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

$user_location = null;
20
Shahin Mammadzada

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

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

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

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

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

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

16
rybo111

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

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

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.

14
elpiel

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

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

Кроме того, согласно PHP документации, по умолчанию, 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 по умолчанию установлен на производственное значение, а не на значение по умолчанию. Это несколько сбивает с толку и не документировано за пределами php.ini, поэтому я не проверил это на других раздачах.

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

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

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

Что я могу сделать об этом?

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

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

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

?>
8
gts

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

<?php 

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

?>

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

<?php print_r($myvar); ?>

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

php> echo array_key_exists(1, $myarray);
6
Sinte

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

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

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

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

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

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

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

4
Wouter de Winter

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

class Person
{
    protected $firstName;
    protected $lastName;

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

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}
3
John Conde

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

Т.е .:

$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 все зависит от регистра.

Консультируйтесь со следующими вопросами и ответами на стеке:

3
Funk Forty Niner

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

Предварительно 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:

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

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

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

2
James

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

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

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

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

Это ошибка:

enter image description here

Строка 154 является проблемой. Вот что я имею в строке 154:

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

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

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

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

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
0
Jaime Montoya

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

Пример: элемент не содержится в <form>

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

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

Пример: элемент теперь содержится в <form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>
0
John Conde

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

?>

Ссылка:

0
Funk Forty Niner

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

Лучший способ справиться с этим - установить отчеты об ошибках во время разработки.

Чтобы настроить отчеты об ошибках:

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 для создания отчетов об ошибках.

И исправить все ошибки.

На производстве отчет об ошибках должен быть отключен.

0
Pupil

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

0
phvish