2013-09-25 145 views
0

我從下面的代碼面對後續的錯誤:PHP:無法遍歷每個循環

錯誤:

Warning: Invalid argument supplied for foreach() 

代碼:

//--------This is the code for jquery UI autocompleter------------- 

include "inc/connect.php"; 
$skeyword = $_GET["term"]; 
$req = "SELECT p.prm_title ,a.am_name, c.cm_name ,l.lm_name ,b.bm_name,r.pm_name " 
    . "FROM product_master p,author_master a,category_master c,language_master l,binding_master b ,publisher_master r " 
    . "WHERE p.prm_title LIKE '%$skeyword%' OR a.am_name LIKE '%$skeyword%' 
     OR c.cm_name LIKE '%$skeyword%' OR l.lm_name LIKE '%$skeyword%' OR b.bm_name LIKE '%$skeyword%' OR r.pm_name LIKE '%$skeyword%' 
     GROUP BY p.prm_id LIMIT 10"; 

$res = mysql_query($req); 
$ret = array(); 
foreach (mysql_fetch_array($res) as $row) { 
    foreach ($row as $val) //--Error: from this line, Why? 
    { 
     if (false !== stripos($val, $skeyword)) { 
      $ret[] = $val; 
      break; 
     } 
    } 
} 

$testme = json_encode($ret); 
echo $testme; 

上面的代碼是爲寫jquery自動完成器在許多列字段中搜索,但它只會返回匹配的列。

請幫我解決這個問題..

+2

把你的第一個foreach改成while循環。請參閱'mysql_fetch_array' [手冊](http://php.net/manual/en/function.mysql-fetch-array.php) –

回答

0

原因:

如果一個變量:

  • array
  • 沒有實現接口Iterator

,它是由foreach使用迭代器,這個錯誤會升高。


如何解決

mysql_fetch_array返回一個字符串數組,對應於提取行,或FALSE如果沒有更多的行,所以使用while循環來獲取結果:

while ($row = mysql_fetch_array($res)) 
{ 
    // if $row is false, the code will not hit here. 
    foreach ($row as $val) 
    { 
     if (FALSE !== stripos($val, $skeyword)) 
     { 
      $ret[] = $val; 
      break; 
     } 
    } 
} 


更新:

while ($row = mysql_fetch_array($res)) 
    { 
     // if $row is false, the code will not hit here. 
     foreach ($row as $val) 
     { 
      if (FALSE !== stripos($val, $skeyword) && !in_array($val, $ret)) 
      { 
       $ret[] = $val; 
       break; // what this break for? 
      } 
     } 
    } 
+0

但是一個問題,通過使用while,它顯示一個輸出多次。 – beginner

+0

據我所知,它不會。你會在你的問題中粘貼輸出嗎? – srain

+0

是它的重複,我搜索了一個關鍵字'ravi'作爲作者的名字,然後我得到了像'[「Ravi Belagere」,「Ravi Belagere」,「Ravi Belagere」,「Ravi Belagere」,「Ravi Belagere」,「Ravi Belagere「,」Ravi Belagere「,」Ravi Belagere「,」Ravi Belagere「,」Ravi Belagere「]'返回本作者所屬的所有書桌行 – beginner

0

請試試這個。 使用while而不是foreach

//--------This is the code for jquery UI autocompleter------------- 

include "inc/connect.php"; 
$skeyword = $_GET["term"]; 
$req = "SELECT p.prm_title ,a.am_name, c.cm_name ,l.lm_name ,b.bm_name,r.pm_name " 
     . "FROM product_master p,author_master a,category_master c,language_master l,binding_master b ,publisher_master r " 
     . "WHERE p.prm_title LIKE '%$skeyword%' OR a.am_name LIKE '%$skeyword%' 
         OR c.cm_name LIKE '%$skeyword%' OR l.lm_name LIKE '%$skeyword%' OR b.bm_name LIKE '%$skeyword%' OR r.pm_name LIKE '%$skeyword%' 
         GROUP BY p.prm_id LIMIT 10"; 

    $res = mysql_query($req); 
      $ret = array(); 
      while ($row = mysql_fetch_array($res)) 
      { 
       foreach ($row as $val) //--Error: from this line, Why? 
       { 
        if (FALSE !== stripos($val, $skeyword)) 
        { 
         $ret[] = $val; 
         break; 
        } 
       } 
      } 

$testme = json_encode($ret); 
echo $testme; 
+0

請在您的答案中添加一些文字... – beginner

+0

爲什麼我不能使用每個循環...爲什麼它在我保持'while'時有效? – beginner

+0

但是一個問題,通過使用while,它顯示一個輸出多次... – beginner

0
while ($row = mysql_fetch_array($res)) { 
0

再次,但現在作爲一個答案:

更改第一的foreach成while循環。見mysql_fetch_arraymanual

0

總是驗證「foreach」的參數是一個數組。 您的SQL請求可能返回FALSE如果沒有行符合條件,並在FALSE的foreach代碼後不能正常工作:)

所以

foreach (mysql_fetch_array($res) as $row) 

您必須驗證$行是一個數組在嘗試迭代它之前不是錯誤的。

if (is_array($row)) 

,或如果查詢返回一些行或不是你可能會更明確,使用mysql_num_rows,它告訴你:

if (mysql_num_rows($res) > 0) 
{ 
    $ret = array(); 
    foreach (mysql_fetch_array($res) as $row) 
    // ... 
} 

但正確的解決方案,如上述通過djot和阿莫爾暴露,是使用

while ($row = mysql_fetch_array($res)) 

這確保如果$行是FALSE,那麼你就不會進入塊,你會不會嘗試,反覆FALSE。