我正在运行一个PHP脚本,但不断收到如下错误:
Notice: Undefined variable: my_variable_name in C:wampwwwmypathindex.php on line 10
Notice: Undefined index: my_index C:wampwwwmypathindex.php on line 11
Warning: Undefined array key "my_index" in C:wampwwwmypathindex.php on line 11
第10行和第11行看起来是这样的:
echo "My variable value is: " . $my_variable_name; echo "My index value is: " . $my_array["my_index"];
这些错误信息的含义是什么?
为什么它们突然出现?我用这个脚本已经用了好几年了,以前从来没有出过任何问题。
如何修复这些错误?
P粉1166315912023-07-21 10:56:23
试一下这个
// 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);
P粉7225212042023-07-21 09:48:50
这个错误信息旨在帮助PHP程序员在访问不存在的变量(或数组元素)时发现拼写错误或错误。因此,一个优秀的程序员应该:
尽管PHP不要求变量声明,但建议进行声明,以避免一些安全漏洞或错误,其中一个人可能会忘记给一个变量赋值,而这个变量稍后会在脚本中使用。在未声明变量的情况下,PHP会发出一个E_WARNING级别的错误。
此警告帮助程序员发现拼写错误的变量名或类似的错误(例如,在条件求值为false时将变量赋值)。此外,未初始化变量可能存在其他可能的问题。正如PHP手册中所述,
这意味着变量可能从包含的文件中获取一个值,并且这个值将被用来替代访问未初始化变量时所期望的null值,这可能导致不可预测的结果。为了避免这种情况,最好在使用之前对PHP文件中的所有变量进行初始化。
处理这个问题的方法有以下几种:
推荐的方法是在使用之前声明每个变量。这样,只有在实际犯错尝试使用不存在的变量时,才会看到这个错误,这也是出现这个错误信息的原因。
//Initializing a variable $value = ""; //Initialization value; 0 for int, [] for array, etc. echo $value; // no error echo $vaule; // an error pinpoints a misspelled variable name
一个特殊情况是当一个变量被定义但在函数中不可见。在PHP中,函数有自己的变量作用域,如果你需要在函数中使用外部的变量,它的值必须作为函数的参数传递进来:
function test($param) { return $param + 1; } $var = 0; echo test($var); // now $var's value is accessible inside through $param
使用空值合并运算符来抑制错误。但请记住,这样PHP将无法通知您使用了错误的变量名。
// Null coalescing operator echo $value ?? '';
For the ancient PHP versions (< 7.0) isset() with ternary can be used
echo isset($value) ? $value : '';
请注意,尽管这本质上是一种错误抑制,但仅适用于特定的错误。因此,它可能会阻止PHP通过标记未初始化的变量来帮助您。
使用@运算符来抑制错误。这里为了历史原因而保留,但严肃地说,这种情况本不应发生。
注意:强烈建议只实施第一点。
当您(或PHP)尝试访问数组的未定义索引时,会出现此提示/警告。
在处理内部数组时,即在您的代码中定义的数组,应采取完全相同的态度:在使用之前初始化所有键。这样,这个错误就能够完成其预期的工作:通知程序员代码中的错误。因此,处理方法是相同的:
建议:声明数组元素:
//Initializing a variable $array['value'] = ""; //Initialization value; 0 for int, [] for array, etc. echo $array['value']; // no error echo $array['vaule']; // an error indicates a misspelled key
特殊情况是当某个函数返回数组或其他值(如null或false)时。在尝试访问数组元素之前,必须进行测试,例如:
$row = $stmt->fetch(); if ($row) { // the record was found and can be worked with echo $row['name']; }
对于外部数组(如$_POST / $_GET / $_SESSION或JSON输入),情况有所不同,因为程序员无法控制这些数组的内容。因此,检查某个键是否存在,甚至为缺失的键分配默认值是合理的。
当一个PHP脚本包含一个HTML表单时,很自然地,在第一次加载时没有表单内容。因此,这样的脚本应该检查是否提交了表单。
// for POST forms check the request method if ($_SERVER['REQUEST_METHOD'] === 'POST') { // process the form } // for GET forms / links check the important field if (isset($_GET['search'])) { // process the form }
一些HTML表单元素,比如复选框,如果未被选中,则不会发送到服务器。在这种情况下,使用空合并运算符分配默认值是合理的。
$agreed = $_POST['terms'] ?? false;
可选的查询字符串元素或cookie应该以相同的方式处理。
$limit = $_GET['limit'] ?? 20; $theme = $_COOKIE['theme'] ?? 'light';
但是赋值应该在脚本的最开始进行。验证所有的输入,将其赋值给本地变量,并在代码中一直使用它们。这样,你要访问的每个变量都会有意地存在。