2014-01-19 38 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']} "); 

執行的$album可變的print_r表明索引'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

'$ album'上的'print_r'是否包含''album_name''?你說它包含「album_key」。 – Pang

+0

@MarcB - 我已經完成了我的整個生活中的空間之前的事情,所以它不太可能會很快改變。你能舉一個演示語法歧義可能出現嗎? – Philip

回答

0

這是我已經學會了承認錯誤的一個常見的模式:

  • 功能是做什麼是應該做的
  • 功能是拋出這意味着它應該能夠做一個錯誤什麼是應該做的

這些在過去奔波我在圈子裏,但他們總是歸結爲以下幾點:

  • 不知怎的,我打電話的功能更多的時間比我想我是

圍棋雖然你的代碼,並期待在所有你調用函數的地方。在你打電話之前打印出來的參數。最有可能的是,你會發現你更多次地調用了函數,然後你認爲自己是這樣,並且有些參數無論如何都是無效的。

+0

感謝您的回覆。我首先在方法本身內部使用了一個簡單的'echo'消息,並在每次調用方法時發送輸入參數。沒有意外的電話。 – Philip

+0

如上所述,這可能是索引括號[]之前的空格問題。嘗試擺脫這些。 –

+0

括號不起作用。該評論僅與解析未被'{}'包圍的中間字符串變量相關。在我的測試中,將輸出行更改爲'$ page-> bodyAppend(「>」。$ album ['album_name']。「」);'產生了相同的通知。 – Philip