php: невозможно выполнить итерацию для каждого цикла

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 auto-completer для поиска во многих столбцах, но возвращает только сопоставленный столбец.

Пожалуйста, помогите мне решить эту проблему.

Теги:
autocomplete

5 ответов

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?
            }
        }
    } 
  • 0
    Но одна проблема, при использовании while, это показывать один вывод несколько раз.
  • 0
    Как я знаю, это не так. Вы вставили бы вывод в свой вопрос?
Показать ещё 4 комментария
0

Опять же, но теперь как ответ:

Измените свой первый foreach на цикл while. См. Руководство по mysql_fetch_array

0

Всегда проверяйте, что параметр для 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.

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;
  • 0
    пожалуйста, добавьте текст в ваш ответ ...
  • 0
    Почему я не могу использовать для каждого цикла ... почему он работает, когда я держал в while ?
Показать ещё 1 комментарий
0
while ($row = mysql_fetch_array($res)) {

Ещё вопросы

Сообщество Overcoder
Наверх
Меню