PHP:无法为每个循环迭代


php: unable to iterate for each loop

我面临以下代码中的以下错误:

错误:

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自动完成器编写的,以便在许多列字段中搜索,但它只会返回匹配的列。

请帮我解决这个问题。

为什么:

如果变量:

  • 不是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?
            }
        }
    } 

请尝试此操作。使用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;
while ($row = mysql_fetch_array($res)) {

再次,但现在作为答案:

将第一个 foreach 更改为 while 循环。请参阅mysql_fetch_array手册

始终验证"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。