На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Дополнения к правилам (только для данного раздела)
- Используйте подсветку синтаксиса при выделении исходного кода;
- В описании темы обязательно укажите язык программирования;
- Прежде чем задать вопрос, обязательно воспользуйтесь поиском и загляните в FAQ раздела.
- Если вопрос касается серверного ПО, указывайте ОС.
- Если вопрос касается ASP.NET то лучше будет задать его в соответствующем разделе. Там вы сможете получить ответ намного быстрее.

Модераторы: Serafim, fatalist
  
> sql_fetchrow
    Изучаю PHP и попутно дописываю движок phpBB. Возникла такая ситуация:
    ExpandedWrap disabled
      $sql = "some_query"; //не важно, какой запрос
       
      while ($arr1 = $db->sql_fetchrow($result) )
       {
        echo $arr1[1];
       }

    При первом "прогоне" while выводятся нужные данные. При повторении же цикла, ничего не выводится ($db->sql_fetchrow возвращает false).
    Как мне реализовать повтор этого цикла?
      Лучше всего в письменном виде и попросить его настойчиво - вот тогда пусть и реализовывается.
      А реально, вместо $var=$db->fetchrow_array в условие вставь true, тогда будет и повторный и третий уж раз и четвёртый... Не сосчитаешь.


      Что такое "$db"? Не знаю такого.
        Не совсем понятно, если не сказать - совсем непонятно. Результат содержит несколько строк с данными. while($arr = $db->sql_fetchrow($result)) выполняется до конца result set. Так что же не так? Можно поподробнее?

        Под повторением цикла имеется ввиду еще один такой же while()? Ну тогда все ясно! Нужно вызвать $result = $db->sql_query($sql) еще раз. Дело в том, что вызов sql_fetchrow() не работает с локальной PHP переменной result set, а производит обращение к самой базе. При этом данные результата удаляются. Поэтому запрос придется вызвать еще раз.
          Цитата
          Trustmaster, 11.09.04, 09:31
          Нужно вызвать $result = $db->sql_query($sql) еще раз.

          У меня была мысль об этом. Но всё же не хотелось ещё раз делать запрос к БД. Ну, раз
          Цитата
          Trustmaster, 11.09.04, 09:31
          sql_fetchrow()... производит обращение к самой базе

          тогда особой разницы, как я понимаю, нет?
            Тут хочешь - не хочешь, а все равно запрос придется еще раз вызывать, потому что result set хранится в памяти самой базы, и после прохода первого while() полностью удаляется. Есть альтернативное решение: копировать весь result set в локальный массив и проходить несколько раз уже по нему.
              Я бы делал так:

              ExpandedWrap disabled
                 
                mysql_connect("localhost","user","password");
                mysql_select_db("some_db");
                 
                $query="SELECT * FROM Sometable";
                $result=mysql_query($query);
                 
                // теперь две функции, первая считает кол-во строк, вторая перебирает весь массив
                 
                echo mysql_num_rows($result); // кол-во возвращаемых запросом строк
                 
                while ($line=mysql_fetch_array($result)) {
                  echo "ID: ".$line[0];  // обращаюсь к нулевой колонке, возвращаемой запросом
                }


              Я правильно понял задачу? :unsure:

              M
              Используем подсветку!
              Сообщение отредактировано: Song -
                :)
                :no: Не-а, неправильно. А теперь вызови while() еще раз и посмотри, что он тебе выдаст ;)
                  Точно.

                  Тогда массив

                  делаешь тоже самое, просто в while вормируешь вместо вывода $Arr[]=$line[0]

                  затем пресловутая конструкция foreach ($Arr as $Item) { .... }
                    Ага, а при больших выборках?
                    result, как параметр хранится в классе.
                    В конце вызываешь mysql_free_result.

                    Ещё можно поиграть с областью видимости, как в Perl или Python:
                    ExpandedWrap disabled
                      sub fibo
                      {
                         my($a, $b)=(1, 0);
                         +sub{
                      ###############################
                      #Вместо следующих вычислений могла бы быть mysql_fetch_array
                      ###############################
                               +${(\(($a, $b)=($b, $a)))[1]}+=$a
                      ###############################
                         }
                      }
                       
                      local$fibo=&fibo;
                      print &$fibo,"<br>\n" foreach 1..10;
                    Сообщение отредактировано: Tishaishii -
                      Цитата
                      Trustmaster, 11.09.04, 11:31
                      копировать весь result set в локальный массив и проходить несколько раз уже по нему.

                      Ну, с алгоритмами у меня вроде-бы неплохо (сказывается опыт в других языках), поэтому я сам так и сделал.

                      Но, всё равно огромное спасибо всем!
                        Запрос вызвали. Поля объекта БД проинициализировали результатами запроса.
                        Результаты взяли (store или use result). Поля результата объекта БД перенеслись в нашу переменную. Всё, там уже ничего нет! Поэтому придётся вызывать запрос ещё раз. Если нужно несколько, тогда нужно переносить в отдельный массив.
                          [оффтопик, но в тему]Спасибо, Song, что подтвердил мои слова :)[/оффтопик]
                            И тебе, Trustmuster, спасибо, что боролся за правое дело и победил-таки в большинстве состава сторонников своей идеи. Помог-таки и в этой задаче.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0648 ]   [ 15 queries used ]   [ Generated: 3.05.24, 02:50 GMT ]