2014-01-19 3 views
0

Я пишу приложение для фотоальбома и столкнулся с любопытной проблемой, которая кажется очевидной только на моем рабочем сервере с 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 ("&gt; {$album ['album_name']} "); 
} 

или если я изменить код следующим образом:

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

Есть улики?

Я не оспариваю, что предварительная проверка наличия ключа - это хорошо (поэтому я рад оставить свои модификации в коде), но это первый раз, когда я сталкивался с этим типом ошибки.

+0

Общий совет: не помещайте пробелы в ссылки на массивы. '$ arr []' должен быть '$ arr []', чтобы предотвратить любые неоднозначности синтаксиса. –

+0

Имеет ли 'print_r' на' $ album' '' имя альбома''? Вы сказали, что он содержит '' album_key''. – Pang

+0

@MarcB - Я делал пробелы перед скобкой всю свою жизнь, поэтому вряд ли я скоро изменюсь. Можете ли вы дать демонстрацию, где могут возникнуть неоднозначности синтаксиса? – Philip

ответ

0

Это общая картина ошибок, которые я научился распознавать:

  • Функция делает то, что он должен делать
  • Функции бросает ошибку, что означает, что он должен быть в состоянии сделать что он должен делать

они запустить меня по кругу в прошлом, но они всегда сводятся к следующему:

  • Каким-то образом, я звоню функция больше раз, чем я думаю, что я

Go, хотя код и посмотреть на все места, которые вы называете функцию. Распечатайте аргументы прямо перед тем, как вы его вызовете. Скорее всего, вы обнаружите, что вы вызываете функцию больше времени, чем считаете себя, с аргументами, которые недействительны каким-то образом.

+0

Спасибо за ответ. Сначала я попробовал простое сообщение «echo» внутри самого метода, с входными параметрами, отправляемыми каждый раз при вызове метода. Никаких неожиданных звонков не было. – Philip

+0

Как было сказано выше, это может быть проблемой с вашими пространствами перед указательными скобками []. Попытайтесь избавиться от них. –

+0

Скобки не действуют. Комментарий имеет значение только для синтаксического анализа переменных средней строки, не окруженных '{}'. В моем тестировании изменилась выходная строка на '$ page-> bodyAppend (« > ». $ Album ['album_name']." ");', Которая произвела такое же уведомление. – Philip

Смежные вопросы