php:无法迭代每个循环

时间:2013-09-25 07:43:03

标签: php jquery autocomplete

我遇到以下代码中的跟随错误:

错误:

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 auto-completer编写的,用于搜索许多列字段,但它只会返回匹配的列。

请帮我解决这个问题..

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

答案 2 :(得分:0)

再次,但现在作为答案:

将您的第一个foreach更改为while循环。请参阅mysql_fetch_array manual

答案 3 :(得分: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?
            }
        }
    } 

答案 4 :(得分:0)

始终验证“foreach”的参数是否为数组。 如果没有符合条件的行,您的SQL请求可能会返回FALSE,并且FALSE上的foreach不起作用:)

所以在你的代码之后

foreach (mysql_fetch_array($res) as $row)

在尝试迭代之前,你必须验证$ row是一个数组而不是false。

if (is_array($row))

或者您可能更明确并使用mysql_num_rows,它会告诉您查询是否返回某些行:

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

但正如djot和Amol所揭示的那样,正确的解决方案是使用

while ($row = mysql_fetch_array($res))

确保如果$ row为FALSE,那么你将不会进入该块,并且你不会尝试迭代FALSE。