我遇到以下代码中的跟随错误:
错误:
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编写的,用于搜索许多列字段,但它只会返回匹配的列。
请帮我解决这个问题..
答案 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。