0

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

错误:

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

请帮我解决这个问题..

4

5 回答 5

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;
于 2013-09-25T07:44:34.367 回答
0
while ($row = mysql_fetch_array($res)) {
于 2013-09-25T07:45:16.553 回答
0

再次,但现在作为答案:

将您的第一个 foreach 更改为 while 循环。见mysql_fetch_array 手册

于 2013-09-25T07:49:50.793 回答
0

为什么:

如果是变量:

  • 不是array
  • 没有实现接口Iterator

并且它用于迭代 by 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?
            }
        }
    } 
于 2013-09-25T07:55:21.127 回答
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 上进行迭代。

于 2013-09-25T08:04:43.793 回答