«Примечание: неопределенная переменная», «Примечание: неопределенный индекс» и «Примечание: неопределенное смещение» с использованием PHP - PullRequest
1096 голосов
/ 24 ноября 2010

Я запускаю 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"];

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

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

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

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

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

Ответы [ 28 ]

2 голосов
/ 06 июля 2018

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

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

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

PHP 7 +
То же самое, за исключением использования Null Coalescing Operator . Больше нет необходимости вызывать isset(), поскольку он встроен, и нет необходимости предоставлять переменную для возврата, поскольку предполагается, что она возвращает значение проверяемой переменной:

$newVariable = $thePotentialData ?? null;

Оба остановят Уведомления от вопроса ОП, а оба являются точным эквивалентом:

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']
или сколько вам нужно глубоких уровней, например ::1049* $clients['personal']['address']['postcode']


Подавление:

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

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

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

0 голосов
/ 23 апреля 2019

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

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

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

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 голосов
/ 01 сентября 2018

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

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

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

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

Это ошибка:

enter image description here

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

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

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

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

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

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
0 голосов
/ 05 июля 2018

Одной из распространенных причин того, что переменная не существует после отправки 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 голосов
/ 17 мая 2018

В 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";
}
0 голосов
/ 25 января 2018

Эти уведомления вызваны тем, что у вас нет используемой переменной 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)
0 голосов
/ 07 октября 2017

При работе с файлами требуются надлежащий 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

<code><?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 "
"; ?>

Справка:

0 голосов
/ 30 августа 2017

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

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