Today, I have started to learn PHP. And, I have created my first PHP file to test different variables. You can see my file as follows.
<?php
$x = 5; // Global scope
function myTest()
{
$y = 10; // Local scope
echo "<p>Test variables inside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
}
myTest();
echo "<p>Test variables outside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
?>
I have found the following errors when I have run this file in the browser.
Notice: Undefined variable: x in /opt/lampp/htdocs/anand/php/index.php on line 19
Notice: Undefined variable: y in /opt/lampp/htdocs/anand/php/index.php on line 29
How can I fix the issue regarding it?
asked Dec 5, 2013 at 4:59
1
The first error ($x
is undefined) is because globals are not imported into functions by default (as opposed to «super globals», which are).
You need to tell your function you’re referencing the global variable $x
:
function myTest()
{
global $x; // $x refers to the global variable
$y=10; // local scope
echo "<p>Test variables inside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
}
Otherwise, PHP cannot tell whether you are shadowing the global variable with a local variable of the same name.
The second error ($y
is undefined), is because local scope is just that, local. The whole point of it is that $y
doesn’t «leak» out of the function. Of course you cannot access $y
later in your code, outside the function in which it is defined. If you could, it would be no different than a global.
answered Dec 5, 2013 at 5:01
user229044♦user229044
232k40 gold badges328 silver badges336 bronze badges
<?php
$a = 1; /* Global scope */
function test()
{
echo $a; /* Reference to local scope variable */
}
test();
?>
You are getting the first error because the variable $a can’t access the global variable’s value unless you explicitly declare global $a
inside the function.
Example #1 Using a global
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b; // If you want to access a global variable,
// you have to use the 'global' keyword
$b = $a + $b;
}
Sum();
echo $b;
?>
And the last error you are getting because $y is defined inside the function mytest()
so its scope will be limited to that function only.
For a detailed explanation, read Variable scope.
answered Dec 5, 2013 at 5:01
R RR R
3,0012 gold badges24 silver badges42 bronze badges
Set $x as a global, like
global $x;
Or try this:
<?php
$x = 5; // Global scope
function myTest($x)
{
$y=10; // Local scope
echo "<p>Test variables inside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
}
myTest($x);
echo "<p>Test variables outside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
?>
answered Dec 5, 2013 at 5:03
There are two cases of using a variable globally:
- Using a single copy of that variable and modify it from anywhere i.e. modification from within a function or outside i.e. in the global scope. In that case you need a declaration in the allowed set of function in the form
global $x;
. - In case you need local variables for individual functions with the same identifier used for the global variable (i.e. variables outside all functions); in that case you have two variables with the same name i.e. one local and one global for that function. Then you need to use a superglobal variable
$GLOBALS
i.e. an array of all the global variables. I personally prefer this approach to make efficient code;
The following are the code for the two.
Code 1 (using global declaration)
<?php
$x = 5; // Global scope
function myTest()
{
$y = 10; // Local scope
global $x;
echo "<p>Test variables inside the function:<p>";
echo "Variable x in global scope is: $x";
echo "<br>";
echo "Variable y is: $y";
}
myTest();
echo "<p>Test variables outside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
?>
Code 2 (using the $GLOBALS[] array)
<?php
$x = 5; // Global scope
function myTest()
{
$y = 10; // Local scope
$x = 23;
echo "<p>Test variables inside the function:<p>";
echo "Variable x in global scope is: " . $GLOBALS['x'];
echo "<br>Variable x in local scope is: $x";
echo "<br>";
echo "Variable y is: $y";
}
myTest();
echo "<p>Test variables outside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
?>
For REFERENCE.
answered Dec 5, 2013 at 5:09
Rajesh PaulRajesh Paul
6,7336 gold badges40 silver badges56 bronze badges
The code is behaving as expected, but if you want to use both the variables across the script use this:
<?php
$x = 5; // Global scope
function myTest(){
global $x;
global $y;
$y = 10;
echo "<p>Test variables inside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
}
myTest();
echo "<p>Test variables outside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
?>
answered Dec 5, 2013 at 5:14
In PHP, global variables must be declared global inside a function if they are going to be used in that function.
function myTest()
{
$y = 10; // Local scope
global $x;
.....
}
By declaring $x global within the function, it will refer to the global version of the variable.
answered Dec 5, 2013 at 5:03
LingaLinga
10.3k10 gold badges52 silver badges104 bronze badges
You have to learn the scope of a variable in PHP. See Variable scope.
In your code, $x is a global one, so in order to access that variable inside the function use global $x;
at the beginning of the function, that is,
function myTest()
{
global $x;
$y = 10; // Local scope
echo "<p>Test variables inside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
}
For $y, either you skip that output by checking isset($y) or else assign a default value at the global scope.
answered Dec 5, 2013 at 5:04
gvgvgvijayangvgvgvijayan
1,83118 silver badges34 bronze badges
put $x outside the»» in code like echo» Variable $x is:».$x;
answered Sep 4, 2021 at 10:08
Почему они появляются внезапно? Я использовал этот скрипт много лет, и у меня никогда не было проблем.
Примечание. Неопределенная переменная
Из обширной мудрости руководства 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"; });
Протестируйте приведенный выше фрагмент в онлайн-редакторе 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 $user_name = $_SESSION['user_name']; if (empty($user_name)) $user_name = ''; OR // just define at the top of the script index.php $user_name = ''; $user_name = $_SESSION['user_name']; OR $user_name = $_SESSION['user_name']; if (!isset($user_name)) $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
A (часто обескураженный) вариант – это оператор подавления ошибок @
. Это конкретная языковая конструкция, которая закрывает нежелательные уведомления и предупреждения, но должна использоваться с осторожностью.
Во-первых, это требует штрафа за isset
за использование isset
. Это не поддается измерению в приложениях реального мира, но их следует учитывать при сильных итерациях данных. Во-вторых, это может препятствовать отладке, но в то же время подавленные ошибки фактически передаются настраиваемым обработчикам ошибок (в отличие от выраженных выражений isset).
Это означает, что вы тестируете, оцениваете или печатаете переменную, которой еще не присвоили. Это означает, что у вас либо есть опечатка, либо вам нужно проверить, что переменная была сначала инициализирована. Проверьте логические пути, он может быть установлен в один путь, но не в другом.
Вообще из-за «плохого программирования» и возможности для ошибок сейчас или позже.
- Если это ошибка, сначала сделайте правильное назначение переменной: $ 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
установлен на «off» или «syslog»).
Что произойдет в этом случае, так это то, что либо error_reporting
был изменен, чтобы также показывать уведомления (как в примерах), и / или параметры были изменены на display_errors
на экране (в отличие от их подавления / регистрации).
Почему они изменились?
Очевидным / простым ответом является то, что кто-то настроил любой из этих параметров в php.ini, или обновленная версия PHP теперь использует другой php.ini из ранее. Это первое место для просмотра.
Однако также можно переопределить эти параметры в
- .htconf (конфигурация веб-сервера, включая vhosts и подконфигурации) *
- .htaccess
- в самом php-коде
и любой из них также мог быть изменен.
Существует также дополнительное усложнение того, что конфигурация веб-сервера может включать / отключать директивы .htaccess, поэтому, если у вас есть директивы в .htaccess, которые внезапно запускают / останавливают работу, вам необходимо это проверить.
(.htconf / .htaccess предположим, что вы работаете как apache.Если запущена командная строка, это не будет применяться, если вы используете IIS или другой веб-сервер, тогда вам нужно будет проверить эти конфиги соответственно)
Резюме
- Проверьте, что директивы php.ini
error_reporting
иdisplay_errors
php в файле php.ini не изменились или что вы еще не используете другой php.ini. - Проверить директивы
error_reporting
иdisplay_errors
php в .htconf (или vhosts и т. Д.) Не изменились - Проверить директивы
error_reporting
иdisplay_errors
php в .htaccess не изменились - Если у вас есть директива в .htaccess, проверьте, разрешены ли они в файле .htconf
- Наконец, проверьте свой код; возможно, несвязанная библиотека; чтобы проверить, установлены ли там директивы php
error_reporting
иdisplay_errors
php.
быстрое исправление заключается в том, чтобы назначить вашу переменную нулевым в верхней части кода
$user_location = null;
Я проклинал эту ошибку, но может быть полезно напомнить вам, чтобы избежать ввода пользователя.
Например, если вы считаете, что это умный, сокращенный код:
// Echo whatever the hell this is <?=$_POST['something']?>
… Подумайте еще раз! Лучшее решение:
// If this is set, echo a filtered version <?=isset($_POST['something']) ? html($_POST['something']) : ''?>
(Я использую пользовательскую функцию html()
для запуска символов, ваш пробег может отличаться)
Я использую всю свою собственную полезную функцию 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 = '';
Или
$user_location = 'Los Angles';
Это очень распространенная ошибка, с которой вы можете столкнуться. Так что не волнуйтесь, просто объявите переменную и наслаждайтесь кодированием .
В 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 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 стал более ориентированным на безопасность языком. Настройки, которые по умолчанию были отключены по умолчанию, теперь включены по умолчанию. Прекрасным примером этого является E_STRICT
, который по умолчанию включается с PHP 5.4.0 .
Кроме того, согласно документации PHP, defualt, 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>
. -
Перезапишите свой код, чтобы быть чище. Если вам нужно сделать это при переходе в производственную среду или не хотите, чтобы кто-то видел ваши ошибки, убедитесь, что вы отключите отображение ошибок и только регистрируете свои ошибки (см.
log_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 (бесплатно), и он дал мне множество предупреждений и уведомлений. Некоторые из них предлагают очень полезные советы. Это не является обязательным требованием, и я больше не использую IDE, кроме крупных проектов. В наши дни я больше
vim
человек :).
undefined index означает в массиве, который вы запросили для недоступного индекса массива, например
<?php $newArray[] = {1,2,3,4,5}; print_r($newArray[5]); ?>
undefined variable означает, что вы использовали полностью не существующую переменную или которая не определена или не инициализирована этим именем, например
<?php print_r($myvar); ?>
undefined offset в массиве, который вы запросили для не существующего ключа. И решение для этого – проверить перед использованием
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, чтобы показывать уведомления.
Другая причина, по которой будет вызываться неопределенное уведомление индекса, будет заключаться в том, что столбец был исключен из запроса базы данных.
То есть:
$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 и Mac OS X все зависит от регистра.
Проконсультируйтесь со следующими вопросами и ответами на Stack:
-
Являются ли имена таблиц в регистре MySQL чувствительными к регистру?
-
Имена таблиц, чувствительных к mysql в запросах
-
MySql – Случайная проблема с таблицами на разных серверах
Если вы работаете с классами, вам нужно убедиться, что вы ссылаетесь на переменные-члены, используя $this
:
class Person { protected $firstName; protected $lastName; public function setFullName($first, $last) { // Correct $this->firstName = $first; // Incorrect $lastName = $last; // Incorrect $this->$lastName = $last; } }
Вероятно, вы использовали старую версию PHP до и теперь обновили PHP, поэтому причина, по которой она работала без каких-либо ошибок, с годами. пока PHP4 не возникнет ошибки, если вы используете переменную без ее определения, но начиная с PHP5 она вызывает ошибки для таких кодов, как упомянутые в вопросе.
При работе с файлами требуется надлежащий 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>"; ?>
Справка:
- http://php.net/manual/en/features.file-upload.post-method.php
если вы хотите остановить некоторое уведомление, используйте @ выше переменной, как
@$abc
выше метод не является хорошим, но решение проблем.
Используйте isset, например:
if(isset($abc)){ }
Я запускаю PHP-скрипт и получаю ошибки типа:
Примечание: Неопределенная переменная: my_variable_name в C:wampwwwmypathindex.php на строке 10
Примечание: Неопределенный индекс: my_index C:wampwwwmypathindex.php в строке 11
Строки 10 и 11 выглядят следующим образом:
echo «My variable value is: » . $my_variable_name;
echo «My index value is: » . $my_array[«my_index»];
В чем смысл этих сообщений об ошибках? Почему они вдруг стали появляться? Я использовал этот скрипт в течение многих лет, и у меня никогда не было никаких проблем. Как мне их устранить?
Ответ 1
Уведомление: Неопределенная переменная
Из руководства по 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»;
});
Хотя PHP не требует объявления переменных, он рекомендует это делать, чтобы избежать некоторых уязвимостей безопасности или ошибок, когда человек забывает задать значение переменной, которая будет использоваться позже в скрипте. В случае необъявленных переменных PHP выдает ошибку очень низкого уровня, E_NOTICE, даже не устанавливается по умолчанию, но руководство советует разрешить ее во время разработки.
Способы решения проблемы:
Объявляйте свои переменные, например, когда вы пытаетесь добавить строку к неопределенной переменной. Или используйте isset()/!empty(), чтобы проверить, объявлены ли они, прежде чем ссылаться на них, как в примере:
// инициализация переменной
$value = «»; // инициализация значения
// «» Когда вы хотите добавить материал позже
// 0 Когда вы хотите добавить числа позже//isset()
$value = isset($_POST[‘value’]) ? $_POST[‘value’] : »;
//empty()
$value = !empty($_POST[‘value’]) ? $_POST[‘value’] : »;
Начиная с PHP 7.0 это стало намного проще, теперь вы можете использовать оператор null coalesce:
// Оператор Null coalesce — Нет необходимости явно инициализировать переменную.
$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’);
//или
list($one, $two) = explode(‘,’, ‘test string’);
Две переменные используются для доступа к двум элементам массива, однако существует только один элемент массива, индекс 0, поэтому будет сгенерировано следующее:
Примечание: Неопределенное смещение: 1
Переменные $_POST/$_GET/$_SESSION
Приведенные выше уведомления часто появляются при работе с $_POST, $_GET или $_SESSION. Для $_POST и $_GET нужно просто проверить, существует ли индекс или нет, прежде чем использовать их. Для $_SESSION необходимо убедиться, что сессия запущена с помощью session_start() и что индекс также существует. Также обратите внимание, что все три переменные являются суперглобалами и написаны в верхнем регистре.
Ответ 2
Попробуйте следующее:
Q1: это уведомление означает, что $varname не определена в текущей области видимости скрипта.
Q2: использование условий isset(), empty() перед использованием любой подозрительной переменной работает хорошо.
// рекомендуемое решение для последних версий PHP
$user_name = $_SESSION[‘user_name’] ?? »;
// до 7 версии PHP
$user_name = »;
if (!empty($_SESSION[‘user_name’])) {
$user_name = $_SESSION[‘user_name’];
}
Или, как быстрое и простое решение:
// не лучшее решение, но работает
// в ваших настройках php, это помогает скрыть уведомления по всему сайту
error_reporting(E_ALL ^ E_NOTICE);
Примечание о сессиях:
При использовании сессий, session_start(); необходимо размещать внутри всех файлов, использующих сессии.
См. http://php.net/manual/en/features.sessions.php
Ответ 3
Оператор «@» для отображения ошибок.
Для нежелательных и избыточных уведомлений можно использовать специальный оператор «@», чтобы «скрыть» сообщения о неопределенных переменных/индексах.
$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) и просмотрите вкладку network на предмет запросов и параметров
Для параметров $_GET вы также можете заглянуть в QUERY_STRING в разделе
print_r($_SERVER);
PHP имеет некоторые правила для объединения нестандартных имен параметров в суперглобалы. Apache также может переписать некоторые имена. Вы также можете посмотреть на необработанные $_COOKIES и другие заголовки HTTP-запросов.
Более очевидный способ – посмотреть в адресной строке браузера параметры GET:
http://example.org/script.php?id=5&sort=desc
Пары имя=значение после вопросительного знака «?» являются параметрами вашего запроса (GET). Таким образом, этот URL может дать только $_GET[«id»] и $_GET[«sort»].
Наконец, проверьте декларации <form> и <input>, если вы ожидаете параметр, но не получаете его.
Убедитесь, что каждый требуемый вход имеет <input name=FOO>.
Атрибута id= или title= недостаточно.
Форма method=POST должна заполнять $_POST.
В то время как метод=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-запросе.
Кроме того, их срок действия истекает, они могут быть ограничены поддоменами или отдельными путями, и пользователь, и браузер могут просто отклонить или удалить их.
Ответ 4
Это происходит потому, что переменная ‘$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;
11.03.2021
Марат
29
0
php | php_error |
undefined variable или как исправить ошибку «undefined variable» -я даже и забыл, что такой вид ошибки существует!
Подробно об ошибке «undefined variable«
- undefined variable
- Как выключить ошибку undefined variable
Notice undefined variable
Что означает «Notice undefined variable» — начнем с перевода… Когда вы встречаете разного рода ошибки — просто переведите данную ошибку — потому, что ошибка она на то и ошибка, что в смысле этой ошибки и есть ответ.
Notice — переводится как :
уведомление, внимание, объявление, нотис сущ
замечать, уведомлять, обращать внимание гл
undefined — переводится как :
неопределенный прил
variable — переводится как :
переменная сущ
изменчивый прил
регулируемый, изменяющийся прич
Итого, если суммировать и перевести с русского на русский:
«Notice undefined variable» — внимание! Неопределенная переменная…
Т.е. вы выводите переменную, которая не существует! Вообще — это очень неудобная ошибка, я её просто выключил!
Пример возникновения «undefined variable»
Самый простой пример… возникновения ошибки «undefined variable«. Переменная ранее не была создана и выводим таким образом с помощью echo:
echo $example_var;
Для предотвращения такого рода ошибки, выше echo нужно создать данную переменную:
$example_var = »;
echo $example_var;
Как выключить ошибку undefined variable
Почему я написал выше, что я забыл, что вообще существует такой вид ошибки, как «» — да просто потому, что я каждый день не покупаю новый хостинг, а нахожусь уже на одном хостинге ruweb — 10 лет
И у меня с самого начала, данная ошибка была отключена.
Но если у вас не так.
Стоит ли отключать вывод ошибки undefined variable.
По этому поводу — всегда будут два мнения за и против.
Я отключаю, потому, что мне не нужна именно эта ошибка.
Смотри как отключить ошибки, или как показывать ошибки, только админу.
Не благодарите, но ссылкой можете поделиться!
COMMENTS+
BBcode
By default:
Change it to:
Now your PHP compiler will show all errors except ‘Notice.’
2. Disable Display Notice in PHP Code
If you don’t have access to make changes in the php.ini file, In this case, you need to disable the notice by adding the following code on the top of your PHP page.
Now your PHP compiler will show all errors except ‘Notice.’
Источник
[Solved]: Notice: Undefined variable in PHP
This error, as it suggests, occurs when you try to use a variable that has not been defined in PHP.
Example 1
Notice: Undefined variable: name in /path/to/file/file.php on line 2.
Example 2
Notice: Undefined variable: num2 in /path/to/file/file.php on line 3.
In our above two examples, we have used a total of 4 variables which include $name , $num1 , $num2 , and $answer .
But out of all, only two ($name and $num2) have resulted in the «undefined variable» error. This is because we are trying to use them before defining them (ie. assigning values to them).
In example 1, we are trying to print/display the value of the variable $name, but we had not yet assigned any value to it.
In example 2, we are trying to add the value of $num1 to the value of $num2 and assign their sum to $answer. However, we have not set any value for $num2.
To check whether a variable has been set (ie. assigned a value), we use the in-built isset() PHP function.
Syntax
We pass the variable name as the only argument to the function, where it returns true if the variable has been set, or false if the variable has not been set.
Example
In our first example above, we have defined a variable ($name) by creating it and assigning it a value (Raju Rastogi) and thus the isset() function returns true.
In our second example, we had not defined our variable ($profession) before passing to the isset() function and thus the response is false.
The Fix for Undefined variable error
Here are some ways in which you can get rid of this error in your PHP program.
1. Define your variables before using them
Since the error originates from using a variable that you have not defined (assigned a value to), the best solution is to assign a value to the variable before using it anywhere in your program.
For instance, in our first example, the solution is to assign a value to the variable $name before printing it.
The above code works without any error.
2. Validating variables with isset() function
Another way to go about this is to validate whether the variables have been set before using them.
The addition operation will not take place because one of the required variables ($num2) has not been set.
The addition this time will take place because the two variables required have been set.
3. Setting the undefined variable to a default value
You can also check whether the variables have been defined using the isset() function and if not, assign them a default value.
For instance, you can set a blank «» value for variables expected to hold a string value, and a for those values expect to hold a numeric value.
Example
4. Disabling Notice error reporting
This is always a good practice to hide errors from the website visitor. In case these errors are visible on the website to the web viewers, then this solution will be very useful in hiding these errors.
This option does not prevent the error from happening, it just hides it.
Open the php.ini file in a text editor, and find the line below:
Replace it with:
Now the ‘NOTICE’ type of errors won’t be shown again. However, the other types of errors will be shown.
Another way of disabling these errors is to add the line of code below on the top of your PHP code.
error_reporting (E_ALL ^ E_NOTICE);
That’s all for this article. It’s my hope that it has helped you solve the error.
Источник
PHP: Ошибки при работе с переменными
Главное правило: переменная должна быть объявлена до её использования. Если сделать это позже, то программа просто не заработает.
Запуск программы выше завершается с ошибкой PHP Notice: Undefined variable: greeting. Undefined variable — это ошибка обращения. Она означает, что в коде используется имя (говорят идентификатор), который не определен. Причём в самой ошибке явно указан индентификатор переменой: greeting. Кроме неправильного порядка определения, в PHP встречаются банальные опечатки — как при использовании переменной, так и во время её объявления.
Количество подобных ошибок уменьшается за счёт использования правильно настроенного редактора. Такой редактор подсвечивает имена, которые используются без объявления, и предупреждает о возможных проблемах.
Задание
Найдите в программе необъявленную переменную и объявите её, присвоив ей значение ‘Dragon’ .
После выполнения программы результат на экране должен выглядеть так:
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Источник