За последние 24 часа нас посетили 17780 программистов и 1722 робота. Сейчас ищет 881 программист ...

Обход результата запроса вайлом в фориче

Тема в разделе "PHP для новичков", создана пользователем Hight, 10 мар 2008.

  1. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Решил тут с кодом поиграться и наткнулся на непонятку.

    Делаю примерно так:
    PHP:
    1. <?php
    2. $result = mysql_query("SELECT `category_id`, `category_type`, `category_name` FROM `table` ORDER BY `category_position` DESC");
    3.  
    4. $category_types = array(1 => 'Это раз',
    5.                         2 => 'Это два',
    6.                         3 => 'Это три');
    7.  
    8. foreach($category_types as $index => $value)
    9. {
    10.     $imp[] = '<option style="font-weight:bold;">&bull;&nbsp;'.$value.'</option>';
    11.  
    12.     while($row = mysql_fetch_assoc($result))
    13.     {
    14.         if($row['category_type'] == $index)
    15.         {
    16.             $imp[] = '<option value="'.$row['category_id'].'">&nbsp;&nbsp;&nbsp;-&nbsp;'.htmlspecialchars($row['category_name']).'</option>';
    17.         }
    18.     }
    19. }
    20.  
    21. $imp = implode('', $imp);
    И получаю список категорий только в 'Это раз'. Не понимаю, как будто в следующих двух итерациях форича цикл while не проходит или в $result уже ничего нет. И это доказывается, делая echo $row['category_type'] в теле цикла while. Должны отобразиться типы всех категорий по три раза, а выводится только один раз. Где меня глючит?

    p.s. Такие конструкции - это жесть. ИМХО не должно быть вайла в фориче, должно быть наоборот. Это я просто играюсь так.
     
  2. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    В конце while поставь:
    PHP:
    1. mysql_data_seek($result, 0);
    Возврат указателя на нулевой индекс в результате запроса.

    Хотя нет, я поторопился. Это зациклит скрипт. Но факт в том, что после использования mysql_fetch_assoc($result) индекс чтения результата смещается в конец. Сейчас думаю как лучше это сделать.
     
  3. dAllonE

    dAllonE Guest

    я чет не понимаю это прикол что ли?

    переменно $result в самом начале присваивается значение в первом же while мы выбираем все данные и дальше нам mysql_fetch_assoc($result) возвращает false...
     
  4. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    После вайла в фориче. Работает ;)
     
  5. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    Нашёл. Поставь
    PHP:
    1. mysql_data_seek($result, 0);
    перед закрывающей скобкой foreach.

    ОпоздалЪ. :oops:
     
  6. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Не, просто надо кофе поменьше пить и спать побольше =)
    Да я ещё 10 минут назад допёр до этого решения =) Просто тему не трогал 8)