Я запускаю 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
Связанное мета-обсуждение: что можно сделать по повторяющимся вопросам? Имеют ли смысл «справочные вопросы»?Если вы работаете с классами, вам нужно убедиться, что вы ссылаетесь на переменные-члены, используя $this:
class Person
{
protected $firstName;
protected $lastName;
public function setFullName($first, $last)
{
// Correct
$this->firstName = $first;
// Incorrect
$lastName = $last;
// Incorrect
$this->$lastName = $last;
}
}
Это потому, что переменная '$ 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;
Как правило, из-за «плохого программирования» и возможности ошибок сейчас или позже.
Если это ошибка, сначала сделайте правильное назначение переменной: $ varname = 0; Если это действительно определяется только иногда, протестируйте его: if (isset($varname)), прежде чем использовать его. Если это из-за того, что вы ошиблись, просто исправьте, что, возможно, даже включите предупреждения в PHP-настройках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);
Другая причина, по которой будет вызываться уведомление неопределенного индекса, будет заключаться в том, что столбец был опущен из запроса базы данных.
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 Чувствительная проблема с таблицами на разных серверахПопробуйте эти
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Эти уведомления вызваны тем, что в переменной $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)
Я не хотел отключать уведомление, потому что это полезно, но хотелось избежать слишком большого количества ввода.
Мое решение было этой функцией:
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')?>
При работе с файлами требуется надлежащий 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почему бы не держать вещи простыми?
<?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
?>
Использование тернарности является простым, понятным и чистым:
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-уведомления с помощью @ или уменьшить уровень сообщений об ошибках, но это не устраняет проблему, он просто останавливает его, как сообщается в журнале ошибок. Это означает, что ваш код по-прежнему пытался использовать переменную, которая не была установлена, что может или не означает, что что-то не работает должным образом - в зависимости от того, насколько важно недостающее значение.
Вы действительно должны проверять эту проблему и обрабатывать ее надлежащим образом, либо обслуживать другое сообщение, либо даже просто возвращать нулевое значение для всего остального, чтобы определить точное состояние.
Если вам просто нужно, чтобы уведомление не было в журнале ошибок, а затем в качестве опции вы могли просто проигнорировать журнал ошибок.
Одна общая причина переменной, не существующей после формы 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>
В 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
В 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";
}
Альтернативой A (часто обескуражен) является оператор подавления ошибок @. Это конкретная языковая конструкция, которая закрывает нежелательные уведомления и предупреждения, но должна использоваться с осторожностью.
Во-первых, это накладывает штраф за микроэффективность с использованием isset. Это не поддается измерению в приложениях реального мира, но их следует учитывать при сильных итерациях данных. Во-вторых, это может затруднить отладку, но в то же время подавленные ошибки фактически передаются настраиваемым обработчикам ошибок (в отличие от выраженных выражений).
Лучший способ получить входную строку:
$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');
Возможно, вы использовали старую версию PHP до тех пор, пока не обновили PHP, поэтому причина, по которой она работала без каких-либо ошибок, с годами. до тех пор, пока PHP4 не будет ошибки, если вы используете переменную без ее определения, но начиная с PHP5 она выдает ошибки для таких кодов, как упомянуто в вопросе.
На очень простом языке. Ошибка в том, что вы используете переменную $user_location, которая ранее не указана вами, и она не имеет никакого значения. Поэтому я рекомендую вам, пожалуйста, объявить эту переменную перед ее использованием. Например: $user_location = ''; Или $user_location = 'Los Angles'; это очень распространенная ошибка, с которой вы можете столкнуться. Так что не волнуйтесь, просто объявите переменную и наслаждайтесь кодированием.
В ответ на «Почему они появляются внезапно? Я использовал этот скрипт в течение многих лет, и у меня никогда не было проблем ».
Для большинства сайтов очень часто работает под сообщением об ошибке« по умолчанию »« Показать все ошибки, «уведомления» и «устаревшие» .Это будет установлено в 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-кодеЯ пытался проклинать эту ошибку, но может быть полезно напомнить вам, чтобы избежать ввода пользователя.
Например, если вы считаете, что это был умный, сокращенный код:
// Echo whatever the hell this is
<?=$_POST['something']?>
... Подумайте еще раз! Лучшее решение:
// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>
(я использую пользовательскую функцию html() для выхода символов, ваш пробег может меняться)
быстрое исправление заключается в том, чтобы назначить вашу переменную нулевым в верхней части вашего кода
$user_location = null;
С течением времени 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.
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';
Относительно этой части вопроса:
Почему они появляются внезапно? Я использовал этот скрипт много лет, и у меня никогда не было проблем.Нет определенных ответов, но вот некоторые возможные объяснения, почему настройки могут «внезапно» меняться:
Вы обновили PHP до более новой версии, которая может иметь другие значения по умолчанию для error_reporting, display_errors или другие соответствующие настройки. Вы удалили или внесли какой-либо код (возможно, в зависимости), который устанавливает соответствующие параметры во время выполнения, используя ini_set() или error_reporting() (их поиск в коде). Вы изменили конфигурацию веб-сервера (предполагая здесь apache): .htaccess файлы и конфигурации vhost также могут управлять настройками php. Обычно уведомления не отображаются / не сообщаются (см. Руководство по PHP), поэтому возможно, что при настройке сервера файл php.ini не может быть загружен по какой-либо причине (разрешения на файлы?), И вы были в настройках по умолчанию , Позже «ошибка» была решена (случайно), и теперь он может загрузить правильный файл php.ini с набором error_reporting, чтобы показывать уведомления.