2013-07-26 128 views
-1

我目前正在使用Zend 1.12(以前從未使用過)的語言模塊,並不斷使用以下代碼獲取標題錯誤。爲foreach提供的無效參數()與Zend的PHP

<?php if(count($this->getContent('languages')) == 0) : ?> 
     <tr><td>No languages were found.</td></tr> 
    <?php else : ?> 
     <?php foreach($this->getContent('languages') as $language) : ?> 
    <tr> 
     <td><?php echo $language['language_id']; ?></td> 
     <td><?php echo $language['name']; ?></td> 
     <td><?php echo $language['iso_shortcode']; ?></td> 

的的getContent()方法是這樣的:

public function getContent($key) { 
    if(isset($this->content[$key])) { 
     return $this->content[$key]; 
    } else { 
     return false; 
    } 
} 

一位同事做了一個地址模塊完全相同的方式成功,所以我不知道這會是一個數據庫的問題,也許?我檢查過數據庫,一切似乎都是相應的。

+1

你試過調試嗎?像:'var_dump($ this-> getContent('languages'));'?如果它是錯誤的,你有問題。 – Benz

+2

當錯誤提示「foreach」的參數無效時,最好檢查一下您傳遞給「foreach」的參數。也稱爲「調試」。 – Jon

+0

我跑了一個print_r並沒有返回。 – Ciaran

回答

0

如果指定的鍵不存在,則您的getContent()方法返回false;這裏有一些潛在的問題:

1)如果它對於內容成員變量中的條目有效值爲false會怎麼樣?如果您真的檢查結果,則無法區分鍵值的缺失和找到值爲false的鍵。指示缺少條目的更好選擇將爲空,或者可以拋出異常。

2)在使用getContent()時,您已經假設將會出現關鍵'語言'的結果,但未能在最終可能發生的情況下對可能發生的可能性進行防禦編碼這裏。最好是在調用getContent()之前檢查語言鍵是否存在,將結果賦給變量,然後僅當它具有期望值時才處理它(例如,不是null或在這種情況下是數組),或拋出異常。

3)緩解這些問題的一種方法是使用默認參數getContent()。如果預期的密鑰不存在,將返回默認值,確保調用代碼始終有效。這種情況下的默認值是array()。

4)因爲它可能指示某個鍵不存在的錯誤,所以最終的良好觸摸可以是getContent()的第3個參數,該參數指定該鍵是否存在,或者如果默認值對於默認參數是例如如果傳遞的默認值爲null並且未找到該鍵,則拋出異常。

0

只給你一個想法如何解決這個問題,或者至少採取這一問題的護理:

<?php if(count($this->getContent('languages')) == 0) : ?> 
    <tr><td>No languages were found.</td></tr> 
<?php else : ?> 
    <?php foreach($this->getContent('languages') as $language) : ?> 
<tr> 
    <td><?php echo $language['language_id']; ?></td> 
    <td><?php echo $language['name']; ?></td> 
    <td><?php echo $language['iso_shortcode']; ?></td> 

你可以做什麼,是刪除此行

if(count($this->getContent('languages')) == 0) 

和替換是通過

if (!$this->getContent('languages')) 

這只是檢查返回的值是否爲假,如果返回的數組是空的,foreach只是什麼都不做,所以這不會成爲問題。或者:

if (!is_array($this->getContent('languages'))) 

它檢查返回值是否不是數組。

相關問題