Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: While-цикл и его нестабильность

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
vidal
Отправлено: 01 Августа, 2010 - 00:32:27
Post Id



Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Апр. 2010  
Откуда: The Republic of Belarus


Помог: 0 раз(а)




Здравствуйте!
Программирую меню сайта PHP/MySQL. Пришлось применить два While-цикла один в другом. Первый находит первую директорию и перестает работать после работы другого. Второй исправно находит все поддиректории. Уже мучаюсь пол дня. Может кто подскажет мою ошибку?
CODE (php):
скопировать код в буфер обмена
  1. $query = "select * from main";
  2. $query1 = $query;
  3. $categoryes = mysql_db_query($dbname, $query, $link);
  4. $categoryes1 = $categoryes;
  5. while($stroka=mysql_fetch_array($categoryes)) // перебор строк таблицы с начала до конца с целью поиска категорий (["type"] == "0")
  6. {
  7.    if ($stroka["type"] == "0"){
  8.      echo $stroka["name"]; // Вывод на экран категорий
  9.      echo "<br>";
  10.        while($stroka1=mysql_fetch_array($categoryes1)) // перебор строк таблицы с начала до конца с целью поиска подкатегорий данной категории (["type"] == "1")
  11.        {
  12.        if (($stroka1["type"] == "1") and ($stroka1["subtype"] == $stroka["N"])){
  13.        echo $stroka1["name"]; // Вывод на экран подкатегорий данной категории
  14.        echo "<br>";
  15. }
  16. }
  17. }
  18. }

Когда убираю второй цикл (начиная с while и включая две фигурные скобки), первый цикл проигрывается до конца.
 
 Top
DeepVarvar Супермодератор
Отправлено: 01 Августа, 2010 - 00:49:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Структуру таблицы дай
 
 Top
JustUserR
Отправлено: 01 Августа, 2010 - 02:57:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




vidal По идее ваш PHP-скрипт должен выводить информацию об используемых категориях и подкатегориях первого уровня путем составления соответствующего SQL-запроса - тем не менее у вас не происходит выбора дополнительной информации в цикле по каждой подкатегории поскольку используется только один SQL-запроса - в принципе такой метод не был бы оправдан по эффективности но тем не менее если вы выбираете категории всех уровней сразу то должны построить из них дерево для последующего рекурсивного вывода


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Реф
Отправлено: 01 Августа, 2010 - 05:26:30
Post Id



Частый гость


Покинул форум
Сообщений всего: 159
Дата рег-ции: Июль 2010  
Откуда: Реутов, Россия


Помог: 0 раз(а)





Что лежит в $link до вызова функции? Если ничего, то рекомендую обратить внимание на следующее
Цитата:
Если опциональный параметр указателя на соединение не указан, функция будет использовать последнее открытое соединение.

DeepVarvar пишет:
Может кто подскажет мою ошибку?

Не правильная работа с указателями на результат работы функции mysql_db_query().
А по существу, выдам следующее предположение:
PHP:
скопировать код в буфер обмена
  1. $query = "select * from main";
  2. $categoryes = mysql_db_query($dbname, $query, $link);
  3.  
  4. $stroki = array();
  5. while($stroka=mysql_fetch_array($categoryes))
  6.     $stroki[] = $stroka;
  7.  
  8. foreach ($stroki as $stroka)
  9. {
  10.    if ($stroka["type"] == "0")
  11.    {
  12.         echo $stroka['name']."<br>";
  13.         foreach ($stroki as $stroka1)
  14.         {
  15.             if (($stroka1["type"] == "1") and ($stroka1["subtype"] == $stroka["N"]))
  16.                 echo $stroka1['name']."<br>";
  17.         }
  18.     }
  19. }


ПС: А лучше сделать нормальный запрос к базе.

(Отредактировано автором: 01 Августа, 2010 - 05:48:25)



-----
Думать надо головой, а не головкой!
 
 Top
Champion Супермодератор
Отправлено: 01 Августа, 2010 - 09:25:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




vidal пишет:
$categoryes1 = $categoryes;
После этого в обоих переменных лежит ссылка на одно и то же место. И mysql_fetch_array($categoryes) передвинет и указатель $categoryes1 на следующую строку выборки.

А по реализации меню есть полно всего в обширных просторах рунета и на этом формуе тоже неоднократно. Пробуй, а если не получится, спрашивай. И не забудь тогда структуру таблица. Только не картинкой! А то бывает иногда...
 
 Top
vidal
Отправлено: 01 Августа, 2010 - 09:50:02
Post Id



Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Апр. 2010  
Откуда: The Republic of Belarus


Помог: 0 раз(а)




Спасибо всем за небезразличие. Проблема решена следующим способом:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. $query = "select * from main";
  3. $query1 = $query;
  4. $categoryes = mysql_db_query($dbname, $query, $link);
  5. while($stroka=mysql_fetch_array($categoryes)) // перебор строк таблицы с начала до конца с целью поиска категорий (["type"] == "0")
  6. {
  7.    if ($stroka["type"] == "0"){
  8.      echo $stroka["name"]; // Вывод на экран категорий
  9.      echo "<br>";
  10.        $categoryes1 = mysql_db_query($dbname, $query, $link);
  11.        while($stroka1=mysql_fetch_array($categoryes1)) // перебор строк таблицы с начала до конца с целью поиска подкатегорий данной категории (["type"] == "1")
  12.        {
  13.        if (($stroka1["type"] == "1") and ($stroka1["subtype"] == $stroka["N"])){
  14.        echo $stroka1["name"]; // Вывод на экран подкатегорий данной категории
  15.        echo "<br>";
  16. }
  17. }
  18. }
  19. }

Champion, спасибо! Вы открыли мне глаза! $categoryes1 = $categoryes -этого не стоило делать, а получить данные самостоятельно для $categoryes1.
 
 Top
Champion Супермодератор
Отправлено: 01 Августа, 2010 - 09:57:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




vidal пишет:
а получить данные самостоятельно для $categoryes1
Этого тоже не стоило делать) Стоило продумать структуру данных и запрос для их выборки и ограничится одним запросом и более простым циклом. Ну, возможно, чуть-чуть рекурсии.
 
 Top
JustUserR
Отправлено: 01 Августа, 2010 - 13:43:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




vidal пишет:
Проблема решена следующим способом
Способ является рабочим и даже предлагался ранее в качетсве проверочного решения - но для более эффективной реализации необходимо использовать минимальное возможное число или один SQL-запрос в котором будет запрашиваться все нужные данные - а потом обрабаываться в PHP-скрипте и составляться дерево категорий


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
vidal
Отправлено: 01 Августа, 2010 - 22:21:32
Post Id



Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Апр. 2010  
Откуда: The Republic of Belarus


Помог: 0 раз(а)




Вы правы, но я начинающий 'писатель' и меня пока это устраивает. Возможно, в будущем мозги будут думать глобальнее. Еще раз спасибо!

(Отредактировано автором: 01 Августа, 2010 - 22:47:48)

 
 Top
JustUserR
Отправлено: 02 Августа, 2010 - 01:32:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




vidal Пожалуйтста! Если вам интересно то можете для примера посмотреть реализацию которая подразумевалась при использовании схемы с одним SQL-запросом - информацию по ней вы можете посмотреть здесь http://forum.php.su/topic.php?fo...26993#1271326993 В общих чертах смысл данной реализации заключается в том что вы совершаете один SQL-запрос - или же несколько SQL-запросов в случае большого объема данных для их постраничного получения причем вне зависимости от уровня вложенности категорий - и далее специальная функция по мере поступающих данных о существующих объектах динамически выстраивает искомое дерево категорий
Если же в вашем PHP-скрипте подразумевается вывод категорий с ограниченным уровнем вложенности - то имеет смысл добавить SQL-поле которое будет являться его индикаторов В таком случае для выбора всех категорий вплоть до требуемой вложенности нужно будет сделать всего один SQL-запрос - в соответствующей WHERE-части которого будут специфицирован список используемых уровни вложеннотси Конечно же возможно получить информацию о уровене вложенности той или иной категории динамически путем отслеживания цепочки ее родительских элементов - но передача значения для анализ на сервер приложений является достаточно ресурсоемкой - а создание и выполенение SQL-функций зависит от сервера БД


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Arch-Web
Отправлено: 02 Августа, 2010 - 14:47:23
Post Id



Частый гость


Покинул форум
Сообщений всего: 177
Дата рег-ции: Июль 2010  
Откуда: Ukraine::Kiev


Помог: 1 раз(а)




а мне понравилось название темы "нестабильность while" Голливудская улыбка
 
 Top
vidal
Отправлено: 02 Августа, 2010 - 19:38:19
Post Id



Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Апр. 2010  
Откуда: The Republic of Belarus


Помог: 0 раз(а)




Цитата:
Если вам интересно то можете для примера посмотреть реализацию которая подразумевалась при использовании схемы с одним SQL-запросом - информацию по ней вы можете посмотреть здесь http://forum.php.su/topic.php?fo...26993#1271326993

Отличная реализация!
Цитата:
а мне понравилось название темы "нестабильность while"

Сразу на миг так показалось, но развеев первые впечатления, включив логику, понял, что где-то ошибся. А название темы оставил.
 
 Top
JustUserR
Отправлено: 03 Августа, 2010 - 02:40:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




vidal пишет:
Отличная реализация!
Благодарю! Кстати существует еще один принципиально другой подход к системе получения списка вложенных категорий - при его использовании SQL-запись одной категории представляет собой такую же структуру но расчет происходит не на стороне сервера приложений а на самом сервере БД - при наличии большого числа категорий с достаточным уровнем вложенности и требования выбора только части из них такое решение будет достаточно эффективно
Некоторую информацию вы можете посмотреть здесь http://www[dot]firststeps[dot]ru/sql/oracle/r.php?89 - например SQL-функция может по определенному алгоритмы находить нужные категории и сохранять их уникальные ключи в локальный массив - и сервер приложений сразу будет получать готовый результат


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Pingvin
Отправлено: 08 Октября, 2011 - 20:09:00
Post Id



Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011  
Откуда: Пенза


Помог: 0 раз(а)




Я столкнулся с аналогичной проблемой был запрос UPDATE... . Решил. vidal спасибо за топик и за решение.

(Отредактировано автором: 09 Октября, 2011 - 09:14:56)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB