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-цикл и его нестабильность
Покинул форум
Сообщений всего: 28
Дата рег-ции: Апр. 2010 Откуда: The Republic of Belarus
Помог: 0 раз(а)
Здравствуйте!
Программирую меню сайта PHP/MySQL. Пришлось применить два While-цикла один в другом. Первый находит первую директорию и перестает работать после работы другого. Второй исправно находит все поддиректории. Уже мучаюсь пол дня. Может кто подскажет мою ошибку?
while($stroka=mysql_fetch_array($categoryes))// перебор строк таблицы с начала до конца с целью поиска категорий (["type"] == "0")
{
if($stroka["type"]=="0"){
echo$stroka["name"];// Вывод на экран категорий
echo"<br>";
while($stroka1=mysql_fetch_array($categoryes1))// перебор строк таблицы с начала до конца с целью поиска подкатегорий данной категории (["type"] == "1")
{
if(($stroka1["type"]=="1") and ($stroka1["subtype"]==$stroka["N"])){
echo$stroka1["name"];// Вывод на экран подкатегорий данной категории
echo"<br>";
}
}
}
}
Когда убираю второй цикл (начиная с while и включая две фигурные скобки), первый цикл проигрывается до конца.
DeepVarvar
Отправлено: 01 Августа, 2010 - 00:49:47
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
vidal По идее ваш PHP-скрипт должен выводить информацию об используемых категориях и подкатегориях первого уровня путем составления соответствующего SQL-запроса - тем не менее у вас не происходит выбора дополнительной информации в цикле по каждой подкатегории поскольку используется только один SQL-запроса - в принципе такой метод не был бы оправдан по эффективности но тем не менее если вы выбираете категории всех уровней сразу то должны построить из них дерево для последующего рекурсивного вывода
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Реф
Отправлено: 01 Августа, 2010 - 05:26:30
Частый гость
Покинул форум
Сообщений всего: 159
Дата рег-ции: Июль 2010 Откуда: Реутов, Россия
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
vidal пишет:
$categoryes1 = $categoryes;
После этого в обоих переменных лежит ссылка на одно и то же место. И mysql_fetch_array($categoryes) передвинет и указатель $categoryes1 на следующую строку выборки.
А по реализации меню есть полно всего в обширных просторах рунета и на этом формуе тоже неоднократно. Пробуй, а если не получится, спрашивай. И не забудь тогда структуру таблица. Только не картинкой! А то бывает иногда...
vidal
Отправлено: 01 Августа, 2010 - 09:50:02
Новичок
Покинул форум
Сообщений всего: 28
Дата рег-ции: Апр. 2010 Откуда: The Republic of Belarus
Помог: 0 раз(а)
Спасибо всем за небезразличие. Проблема решена следующим способом:
while($stroka1=mysql_fetch_array($categoryes1)) // перебор строк таблицы с начала до конца с целью поиска подкатегорий данной категории (["type"] == "1")
{
if (($stroka1["type"] == "1") and ($stroka1["subtype"] == $stroka["N"])){
echo $stroka1["name"]; // Вывод на экран подкатегорий данной категории
echo "<br>";
}
}
}
}
Champion, спасибо! Вы открыли мне глаза! $categoryes1 = $categoryes -этого не стоило делать, а получить данные самостоятельно для $categoryes1.
Champion
Отправлено: 01 Августа, 2010 - 09:57:30
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
vidal пишет:
а получить данные самостоятельно для $categoryes1
Этого тоже не стоило делать) Стоило продумать структуру данных и запрос для их выборки и ограничится одним запросом и более простым циклом. Ну, возможно, чуть-чуть рекурсии.
JustUserR
Отправлено: 01 Августа, 2010 - 13:43:37
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
vidal пишет:
Проблема решена следующим способом
Способ является рабочим и даже предлагался ранее в качетсве проверочного решения - но для более эффективной реализации необходимо использовать минимальное возможное число или один SQL-запрос в котором будет запрашиваться все нужные данные - а потом обрабаываться в PHP-скрипте и составляться дерево категорий
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
vidal
Отправлено: 01 Августа, 2010 - 22:21:32
Новичок
Покинул форум
Сообщений всего: 28
Дата рег-ции: Апр. 2010 Откуда: The Republic of Belarus
Помог: 0 раз(а)
Вы правы, но я начинающий 'писатель' и меня пока это устраивает. Возможно, в будущем мозги будут думать глобальнее. Еще раз спасибо!
Покинул форум
Сообщений всего: 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/
Arch-Web
Отправлено: 02 Августа, 2010 - 14:47:23
Частый гость
Покинул форум
Сообщений всего: 177
Дата рег-ции: Июль 2010 Откуда: Ukraine::Kiev
Помог: 1 раз(а)
а мне понравилось название темы "нестабильность while"
vidal
Отправлено: 02 Августа, 2010 - 19:38:19
Новичок
Покинул форум
Сообщений всего: 28
Дата рег-ции: Апр. 2010 Откуда: The Republic of Belarus
Помог: 0 раз(а)
Цитата:
Если вам интересно то можете для примера посмотреть реализацию которая подразумевалась при использовании схемы с одним SQL-запросом - информацию по ней вы можете посмотреть здесь http://forum.php.su/topic.php?fo...26993#1271326993
Отличная реализация!
Цитата:
а мне понравилось название темы "нестабильность while"
Сразу на миг так показалось, но развеев первые впечатления, включив логику, понял, что где-то ошибся. А название темы оставил.
JustUserR
Отправлено: 03 Августа, 2010 - 02:40:28
Активный участник
Покинул форум
Сообщений всего: 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/
Pingvin
Отправлено: 08 Октября, 2011 - 20:09:00
Новичок
Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011 Откуда: Пенза
Помог: 0 раз(а)
Я столкнулся с аналогичной проблемой был запрос UPDATE... . Решил. vidal спасибо за топик и за решение.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.