Мой код не работает, пожалуйста, помогите мне в его решении. Я постоянно получаю undefined index eroor: image [duplicate]

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

Что означают эти ошибки?

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

Что мне нужно сделать, чтобы исправить их?

Примечание: неопределенная переменная: my_variable_name в C: \ wamp \ www \ mypath \ index.php в строке 10

Связанное мета-обсуждение: что можно сделать по повторяющимся вопросам? Имеют ли смысл «справочные вопросы»?
954
задан 20 March 2017 в 14:29

23 ответа

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

class Person
{
    protected $firstName;
    protected $lastName;

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

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}
36
ответ дан 15 August 2018 в 14:39

Это потому, что переменная '$ 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;
24
ответ дан 15 August 2018 в 14:39

Как правило, из-за «плохого программирования» и возможности ошибок сейчас или позже.

Если это ошибка, сначала сделайте правильное назначение переменной: $ varname = 0; Если это действительно определяется только иногда, протестируйте его: if (isset($varname)), прежде чем использовать его. Если это из-за того, что вы ошиблись, просто исправьте, что, возможно, даже включите предупреждения в PHP-настройках
33
ответ дан 15 August 2018 в 14:39

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

<?php 

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

?>

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

<?php print_r($myvar); ?>

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

php> echo array_key_exists(1, $myarray);
5
ответ дан 15 August 2018 в 14:39

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

Ie:

$query = "SELECT col1 FROM table WHERE col_x = ?";

Затем попытаемся получить доступ к большему количеству столбцы / строки внутри цикла.

Ie:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

или в цикле while:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

Что-то еще, что должно быть что на ОС * NIX и Mac OS X все зависит от регистра.

Обратитесь к следующему Q & amp; A's Stack:

Являются ли имена таблиц в регистре MySQL чувствительными к регистру? mysql case case имена таблиц в запросах MySql - Case Чувствительная проблема с таблицами на разных серверах
2
ответ дан 15 August 2018 в 14:39

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

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(); требуется разместить во всех файлах с помощью сеансов. http://php.net/manual/en/features.sessions.php
110
ответ дан 15 August 2018 в 14:39

Эти уведомления вызваны тем, что в переменной $my_array не было использованной переменной defined и my_index.

Эти уведомления запускались каждый раз, потому что ваш 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)
-1
ответ дан 15 August 2018 в 14:39

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

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

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')?>
31
ответ дан 15 August 2018 в 14:39

При работе с файлами требуется надлежащий enctype и POST-метод, который вызывает неопределенное уведомление индекса, если они не включены в форму.

В руководстве указан следующий базовый синтаксис: [ ! d1]

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>

HTML

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

?>

Ссылка:

http: // php. net / manual / en / features.file-upload.post-method.php
0
ответ дан 15 August 2018 в 14:39

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

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

?>
7
ответ дан 15 August 2018 в 14:39

Использование тернарности является простым, понятным и чистым:

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

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

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

$newVariable = $thePotentialData ?? null;

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

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

& nbsp; Если вам не требуется устанавливать новую переменную, вы можете напрямую использовать возвращаемое значение ternary, например, с 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']

& nbsp;

Функция:

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

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

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

1
ответ дан 15 August 2018 в 14:39

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

Пример: Элемент, не содержащийся в <form> [ ! d1]

<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
ответ дан 15 August 2018 в 14:39

В PHP 7.0 теперь можно использовать Null-коалесцирующий оператор:

echo "My index value is: " . ($my_array["my_index"] ?? '');

Равно:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

PHP-руководство PHP 7.0

12
ответ дан 15 August 2018 в 14:39

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

//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}

Простое объяснение

//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}
-1
ответ дан 15 August 2018 в 14:39

Альтернативой A (часто обескуражен) является оператор подавления ошибок @. Это конкретная языковая конструкция, которая закрывает нежелательные уведомления и предупреждения, но должна использоваться с осторожностью.

Во-первых, это накладывает штраф за микроэффективность с использованием isset. Это не поддается измерению в приложениях реального мира, но их следует учитывать при сильных итерациях данных. Во-вторых, это может затруднить отладку, но в то же время подавленные ошибки фактически передаются настраиваемым обработчикам ошибок (в отличие от выраженных выражений).

47
ответ дан 15 August 2018 в 14:39

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

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

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

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

Если вы абсолютно хотите строку [ ! d1], как:

$value = (string)filter_input(INPUT_POST, 'value');
25
ответ дан 15 August 2018 в 14:39

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

0
ответ дан 15 August 2018 в 14:39

На очень простом языке. Ошибка в том, что вы используете переменную $user_location, которая ранее не указана вами, и она не имеет никакого значения. Поэтому я рекомендую вам, пожалуйста, объявить эту переменную перед ее использованием. Например: $user_location = ''; Или $user_location = 'Los Angles'; это очень распространенная ошибка, с которой вы можете столкнуться. Так что не волнуйтесь, просто объявите переменную и наслаждайтесь кодированием.

13
ответ дан 15 August 2018 в 14:39

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

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

Сводка

.htconf (конфигурация веб-сервера, включая vhosts и подконфигурации) * Проверить error_reporting и display_errors директивы php в .htconf (или vhosts и т. Д.) Не изменились .htaccess Если у вас есть директива в .htaccess, проверьте, разрешены ли они в файле .htconf fil e в самом php-коде
24
ответ дан 15 August 2018 в 14:39

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

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

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

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

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

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

15
ответ дан 15 August 2018 в 14:39

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

$user_location = null;
17
ответ дан 15 August 2018 в 14:39

ПОЧЕМУ ЭТО ПРОДОЛЖИТЬ?

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

Кроме того, согласно документации PHP, defualt, E_NOTICE отключен в php.ini. PHP docs рекомендует PHP 5.4.0 . Однако, когда я загружаю 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, где не объявление переменных намного больше неприятностей.

ЧТО Я МОГУ СДЕЛАТЬ ЭТО?

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

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

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

Отключите E_NOTICE на уровне файла или папки. Это может быть предпочтительнее, если у вас есть какой-то унаследованный код, но в противном случае вы хотите сделать что-то «правильным». Для этого вам следует обратиться к Apache2, nginx или независимо от вашего сервера. В Apache вы использовали бы php_value внутри <Directory>.

ЧТО ОШИБКИ ОЗНАЧАЛИ?

Чтобы развернуть по опции 3: Это идеальный вариант. Если вы можете пойти по этому маршруту, вам нужно. Если вы не собираетесь на этом маршруте изначально, подумайте о том, чтобы переместить этот маршрут в конце концов, протестировав свой код в среде разработки. Пока вы на это, избавитесь от ~E_STRICT и ~E_DEPRECATED, чтобы увидеть, что может пойти не так в будущем. Вы увидите много незнакомых ошибок, но это остановит вас от каких-либо неприятных проблем, когда вам нужно обновить PHP в будущем.

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

Undefined variable: my_variable_name - Это происходит, когда перед использованием переменная не была определена. Когда скрипт PHP выполняется, он внутренне принимает только нулевое значение. Однако, в каком сценарии вам нужно было бы проверить переменную до ее определения? В конечном счете, это аргумент для «неаккуратного кода». Как разработчик, я могу сказать вам, что мне это нравится, когда я вижу проект с открытым исходным кодом, где переменные определены как высоко в своих областях, которые могут быть определены. Это облегчает определение того, какие переменные будут появляться в будущем, и облегчит чтение / изучение кода.

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

Undefined index: my_index - Это происходит, когда вы пытаетесь получить доступ к значение в массиве и его не существует. Чтобы предотвратить эту ошибку, выполните условную проверку.

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

(дополнительная подсказка)

Когда я сталкивался с этими и другими проблемами, я использовал IDE NetBeans (бесплатно), и это дало мне множество предупреждений и уведомлений. Некоторые из них предлагают очень полезные советы. Это не является обязательным требованием, и я больше не использую IDE, кроме крупных проектов. В наши дни я больше человек vim :).
7
ответ дан 15 August 2018 в 14:39

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

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

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

Вы обновили PHP до более новой версии, которая может иметь другие значения по умолчанию для error_reporting, display_errors или другие соответствующие настройки. Вы удалили или внесли какой-либо код (возможно, в зависимости), который устанавливает соответствующие параметры во время выполнения, используя ini_set() или error_reporting() (их поиск в коде). Вы изменили конфигурацию веб-сервера (предполагая здесь apache): .htaccess файлы и конфигурации vhost также могут управлять настройками php. Обычно уведомления не отображаются / не сообщаются (см. Руководство по PHP), поэтому возможно, что при настройке сервера файл php.ini не может быть загружен по какой-либо причине (разрешения на файлы?), И вы были в настройках по умолчанию , Позже «ошибка» была решена (случайно), и теперь он может загрузить правильный файл php.ini с набором error_reporting, чтобы показывать уведомления.
3
ответ дан 15 August 2018 в 14:39

Другие вопросы по тегам:

Похожие вопросы: