PHP数组的奇怪行为

时间:2014-01-19 06:08:02

标签: php arrays

我正在写一个相册应用程序并遇到了一个奇怪的问题,这个问题在我的生产服务器上看起来很明显,只有PHP 5.5.6而不是我的开发机器上有PHP 5.4.7。我想知道这个问题是由于PHP的新版本(不知道某项功能或错误),两台服务器的配置不同或两者兼而有之。

我在课程Data中定义了以下函数:

public static function getAlbum ($key)
{
    $stmt = self::$db->prepare ("SELECT * FROM `albums` WHERE `album_key` = ?;");
    $stmt->execute (array ($key));
    $rows = $stmt->fetchAll (PDO::FETCH_ASSOC);

    if (array_key_exists (0, $rows))
    {
        return $rows [0];
    }
    else
    {
        return array ();
    }
}

对于给定的$key,此功能已经过测试并且有效。

在调用代码中,我有以下内容:

$album = Data::getAlbum ($_REQUEST ['key']);
$page->bodyAppend ("> {$album ['album_name']} ");

执行print_r变量的$album表示数组中存在索引'album_name' ,从而暗示值$_REQUEST ['key']是一个有效的密钥,方法Data::getAlbum按预期工作。但是,此代码会在日志中生成通知:PHP Notice: Undefined index: album_name in <<filename>> on line <<line#>>

然而,奇怪的是,字符串通过bodyAppend方法正确附加,包括来自(显然)未定义索引的值。

如果我将代码修改为:

,则此通知消息将消失
$album = Data::getAlbum ($_REQUEST ['key']);
if (isset ($album ['album_name']))
{
    $page->bodyAppend ("&gt; {$album ['album_name']} ");
}

或者如果我按如下方式修改代码:

$album = Data::getAlbum ($_REQUEST ['key']);
if (count ($album) > 0)
{
    $page->bodyAppend ("&gt; {$album ['album_name']} ");
}

任何线索?

我并不怀疑对密钥存在的高级检查是一件好事(所以我很乐意在代码中留下我的修改) - 但这是我第一次遇到这种情况错误。

1 个答案:

答案 0 :(得分:0)

这是我学会识别的常见错误模式:

  • 功能正在做它应该做的事情
  • 函数抛出一个错误,意味着它应该能够做它应该做的事情

这些过去让我围成一圈,但总是归结为以下几点:

  • 不知何故,我打电话给这个功能的次数比我想象的要多

浏览您的代码并查看您调用该函数的所有位置。在调用之前打印出参数。最有可能的是,你会发现你调用函数的次数比你想象的要多,而且参数在某种程度上是无效的。