PHP“注意:未定义的索引”是无害还是真正的错误?

时间:2012-07-05 06:54:51

标签: php debugging

虽然我的网站工作没有任何问题但我突然开始在我的服务器上使用非常高的CPU使用率,所以我开始更仔细地检查代码并启用E_ALL错误报告。

然后我发现我有很多这样的“通知”:

Notice: Undefined index: userID in /var/www/vhosts/mydomain.com/httpdocs/header.php on line 8

大多数或他们引用未设置的cookie,例如:

$uid = $_COOKIE['userID'];

如果用户未登记,我会立即收到通知,并且每次使用$uid时都会收到通知。

我想知道的是:这些通知是否无害或者它们是否真的会导致我的网站出现任何问题? (速度问题,错误等)。

4 个答案:

答案 0 :(得分:10)

这只是一个通知,请尝试以下代码:

$uid = isset($_COOKIE['userID']) ? $_COOKIE['userID'] : 0;

它不是无腿的(取决于观点),您可以使用错误报告功能禁用此功能,否则,正确的方法是验证索引是否存在isset($_COOKIE['userID'])如果不存在,则定义默认值(例如null

$var = isset($foo) ? $foo : 'default';

如果您不知道变量是否存在,则需要验证变量是否存在。

$var = 'foo'
if($var == 'foo') { // I known $var is defined, because I have defined it.
    [..]
}

/** 
 * Above, I don't known if user go to mywebsite.com/index.php or
 * mywebsite.com/index.php?foo=bar, so, I need to verify if index is defined
 */
if(isset($_GET['foo']) && $_GET['foo'] == 'bar') {
    [...]
}

答案 1 :(得分:2)

这些通知会引起一些速度问题,因为提高通知会花费一些额外的努力。

但主要的问题是这是一个严重的错误。您正在尝试使用不存在的内容。这可能会或可能不会导致坏事发生,但这意味着您的程序不正确。由于您应始终使用全功率的错误报告来查看和解决实际问题,因此有关未定义索引或未定义变量的通知是严重的,需要解决。 PHP抱怨的任何是严肃的,需要解决。请参阅The Definitive Guide To PHP's isset And empty

答案 2 :(得分:1)

通知通常是无害的,但它们可能表明应用程序设计不佳。一般来说,利用可用的PHP工具(即isset($someVar))来确保业务逻辑正在适当地处理变量初始化总是一个好主意。当您在E_ALL错误报告设置中看不到此类通知时,它总是更好。

答案 3 :(得分:0)

“通知”警告在第一个观点上是无害的,但您应该记住,编程不正确,可能会导致以下行出错。

在您的示例中,最好使用

$uid = isset($_COOKIE['userID'])?$_COOKIE['userID']:0;

所以你可以肯定,$ uid总是有一个值,当值大于0时,你有一个愚蠢的userId ......