我正在运行一个PHP脚本,并继续收到错误,如:

注意:未定义变量my_variable_name在C:\wamp\www\mypath\index.php第10行 注意:第11行未定义索引:my_index C:\wamp\www\mypath\index.php 警告:在C:\wamp\www\mypath\index.php第11行未定义数组键“my_index”

第10和11行是这样的:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

这些错误消息的含义是什么?

为什么他们会突然出现?我曾经使用这个脚本多年,从来没有任何问题。

我该如何修复它们?


这是一个一般参考问题,供人们链接作为副本,而不是需要一遍又一遍地解释这个问题。我觉得这很有必要,因为现实世界中关于这个问题的答案都非常具体。 相关元讨论: 如何应对重复的问题? “参考问题”有意义吗?


当前回答

我不想禁用通知功能,因为它很有帮助,但我想避免太多的输入。

我的解是这个函数:

function ifexists($varname)
{
  return(isset($$varname) ? $varname : null);
}

因此,如果我想引用$name和echo if存在,我简单地写:

<?= ifexists('name') ?>

对于数组元素:

function ifexistsidx($var,$index)
{
  return(isset($var[$index]) ? $var[$index] : null);
}

在一个页面中,如果我想引用$_REQUEST['name']:

<?= ifexistsidx($_REQUEST, 'name') ?>

其他回答

这意味着您正在测试、求值或打印一个尚未赋值的变量。这意味着你要么有一个拼写错误,要么你需要检查变量是否被初始化为其他东西。检查您的逻辑路径,它可能设置在一个路径,但不是在另一个路径。

当我们使用一个未设置的变量时,就会发生这些错误。

处理这些问题的最佳方法是在开发时设置错误报告。

设置错误报告:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

在生产服务器上,错误报告是关闭的,因此,我们不会得到这些错误。

但是,在开发服务器上,我们可以设置错误报告。

为了消除这个错误,我们看到下面的例子:

if ($my == 9) {
 $test = 'yes';  // Will produce an error as $my is not 9.
}
echo $test;

在赋值或使用变量之前,可以将变量初始化为NULL。

因此,我们可以将代码修改为:

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce an error as $my is not 9.
}
echo $test;

这不会干扰任何程序逻辑,即使$test没有值,也不会产生Notice。

因此,基本上,在开发时将错误报告设置为ON总是更好的。

并修复所有的错误。

在生产中,错误报告应该设置为关闭。

通常是因为“糟糕的编程”,以及现在或以后出现错误的可能性。

如果这是一个错误,首先对变量进行适当的赋值:$varname=0; 如果它确实只是偶尔定义,在使用它之前测试它:If (isset($varname)) 如果是因为你拼写错了,那就改正 甚至可以在你的php设置中打开警告

使用三元运算符简单、易读、干净:

Pre PHP 7

将一个变量赋给另一个变量的值,否则赋null(或任何你需要的默认值):

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

PHP 7 +。

除了使用空合并运算符外,都是一样的。不再需要调用isset(),因为它是内置的,也不需要提供要返回的变量,因为它假设返回正在检查的变量的值:

$newVariable = $thePotentialData ?? null;

这两者都将阻止OP的问题的通知,并且两者都完全等价于:

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

如果你不需要设置一个新变量,那么你可以直接使用三元操作符的返回值,例如使用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”)

或者取决于你需要多少层深度,例如:

美元的客户(“个人”)(“地址”)(“邮政编码”)


抑制:

可以用@屏蔽PHP通知或降低错误报告级别,但这并不能解决问题。它只是停止在错误日志中报告它。这意味着您的代码仍然试图使用一个未设置的变量,这可能意味着某些事情没有按照预期的方式工作——这取决于缺少的值有多重要。

您确实应该检查这个问题并适当地处理它,或者提供不同的消息,或者甚至只是为其他所有内容返回一个空值,以确定准确的状态。

如果您只关心通知不在错误日志中,那么可以选择忽略错误日志。

这些注意是因为您没有定义used变量,并且my_index键没有出现在$my_array变量中。

这些通知每次都会被触发,因为您的代码不正确,但可能您没有通知的报告。

解决bug:

$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)