quot;Notice: Undefined variablequot;, quot;Notice: Undefined indexquot;, and quot;Notice: Undefined offsetquot; using PHP(“注意:未定义的变量、“注意:未定义的索引和“注意:未定义的偏移量使用 PHP)
问题描述
I'm running a PHP script and continue to receive errors like:
Notice: Undefined variable: my_variable_name in C:wampwwwmypathindex.php on line 10
Notice: Undefined index: my_index C:wampwwwmypathindex.php on line 11
Line 10 and 11 looks like this:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
What is the meaning of these error messages?
Why do they appear all of a sudden? I used to use this script for years and I've never had any problem.
How do I fix them?
This is a General Reference question for people to link to as duplicate, instead of having to explain the issue over and over again. I feel this is necessary because most real-world answers on this issue are very specific.
Related Meta discussion:
- What can be done about repetitive questions?
- Do "reference questions" make sense?
Notice: Undefined variable
From the vast wisdom of the PHP Manual:
Relying on the default value of an uninitialized variable is problematic in the case of including one file into another which uses the same variable name. It is also a major security risk with register_globals turned on. E_NOTICE level error is issued in case of working with uninitialized variables, however not in the case of appending elements to the uninitialized array. isset() language construct can be used to detect if a variable has been already initialized. Additionally and more ideal is the solution of empty() since it does not generate a warning or error message if the variable is not initialized.
From PHP documentation:
No warning is generated if the variable does not exist. That means empty() is essentially the concise equivalent to !isset($var) || $var == false.
This means that you could use only empty()
to determine if the variable is set, and in addition it checks the variable against the following, 0
, 0.0
, ""
, "0"
, null
, false
or []
.
Example:
$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 "
";
});
Test the above snippet in the 3v4l.org online PHP editor
Although PHP does not require a variable declaration, it does recommend it in order to avoid some security vulnerabilities or bugs where one would forget to give a value to a variable that will be used later in the script. What PHP does in the case of undeclared variables is issue a very low level error, E_NOTICE
, one that is not even reported by default, but the Manual advises to allow during development.
Ways to deal with the issue:
Recommended: Declare your variables, for example when you try to append a string to an undefined variable. Or use
isset()
/!empty()
to check if they are declared before referencing them, as in://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'] : '';
This has become much cleaner as of PHP 7.0, now you can use the null coalesce operator:
// Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value'] ?? '';
Set a custom error handler for E_NOTICE and redirect the messages away from the standard output (maybe to a log file):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
Disable E_NOTICE from reporting. A quick way to exclude just
E_NOTICE
is:error_reporting( error_reporting() & ~E_NOTICE )
Suppress the error with the @ operator.
Note: It's strongly recommended to implement just point 1.
Notice: Undefined index / Undefined offset
This notice appears when you (or PHP) try to access an undefined index of an array.
Ways to deal with the issue:
Check if the index exists before you access it. For this you can use
isset()
orarray_key_exists()
://isset() $value = isset($array['my_index']) ? $array['my_index'] : ''; //array_key_exists() $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
The language construct
list()
may generate this when it attempts to access an array index that does not exist:list($a, $b) = array(0 => 'a'); //or list($one, $two) = explode(',', 'test string');
Two variables are used to access two array elements, however there is only one array element, index 0
, so this will generate:
Notice: Undefined offset: 1
$_POST
/ $_GET
/ $_SESSION
variable
The notices above appear often when working with $_POST
, $_GET
or $_SESSION
. For $_POST
and $_GET
you just have to check if the index exists or not before you use them. For $_SESSION
you have to make sure you have the session started with session_start()
and that the index also exists.
Also note that all 3 variables are superglobals and are uppercase.
Related:
- Notice: Undefined variable
- Notice: Undefined Index
这篇关于“注意:未定义的变量"、“注意:未定义的索引"和“注意:未定义的偏移量"使用 PHP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:“注意:未定义的变量"、“注意:未定义的索引"和“注意:未定义的偏移量"使用 PHP
基础教程推荐
- XAMPP 服务器不加载 CSS 文件 2022-01-01
- 在多维数组中查找最大值 2021-01-01
- WooCommerce 中选定产品类别的自定义产品价格后缀 2021-01-01
- 在 PHP 中强制下载文件 - 在 Joomla 框架内 2022-01-01
- Libpuzzle 索引数百万张图片? 2022-01-01
- 在 Woocommerce 中根据运输方式和付款方式添加费用 2021-01-01
- 超薄框架REST服务两次获得输出 2022-01-01
- 如何在 PHP 中的请求之间持久化对象 2022-01-01
- 通过 PHP SoapClient 请求发送原始 XML 2021-01-01
- mysqli_insert_id 是否有可能在高流量应用程序中返回 2021-01-01