Я пишу приложение для фотоальбома и столкнулся с любопытной проблемой, которая кажется очевидной только на моем рабочем сервере с PHP 5.5.6, а не на моей машине разработки, которая имеет PHP 5.4.7. Мне интересно, возникает ли эта проблема из-за новой версии PHP (либо не знакомы с какой-либо функцией, либо с ошибкой), причем конфигурация двух серверов различна или их комбинация.Любопытное поведение массивов 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 ("> {$album ['album_name']} ");
}
или если я изменить код следующим образом:
$album = Data::getAlbum ($_REQUEST ['key']);
if (count ($album) > 0)
{
$page->bodyAppend ("> {$album ['album_name']} ");
}
Есть улики?
Я не оспариваю, что предварительная проверка наличия ключа - это хорошо (поэтому я рад оставить свои модификации в коде), но это первый раз, когда я сталкивался с этим типом ошибки.
Общий совет: не помещайте пробелы в ссылки на массивы. '$ arr []' должен быть '$ arr []', чтобы предотвратить любые неоднозначности синтаксиса. –
Имеет ли 'print_r' на' $ album' '' имя альбома''? Вы сказали, что он содержит '' album_key''. – Pang
@MarcB - Я делал пробелы перед скобкой всю свою жизнь, поэтому вряд ли я скоро изменюсь. Можете ли вы дать демонстрацию, где могут возникнуть неоднозначности синтаксиса? – Philip