我面临以下代码中的以下错误:
错误:
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。