Я столкнулся с следующей ошибкой из приведенного ниже кода:
Ошибка:
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 для поиска во многих столбцах, но возвращает только сопоставленный столбец.
Пожалуйста, помогите мне решить эту проблему.
Если переменная:
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?
}
}
}
Опять же, но теперь как ответ:
Измените свой первый foreach на цикл while. См. Руководство по mysql_fetch_array
Всегда проверяйте, что параметр для foreach - это массив. Ваш запрос SQL может возвращать FALSE, если нет строки, соответствующей вашим условиям, а foreach на FALSE не работает :)
Итак, после вашего кода
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.
Пожалуйста, попробуйте это. Использовать 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
?
while ($row = mysql_fetch_array($res)) {