while & mysql

Kox

Guest
while & mysql

Слушайте народ.. Я уже совсем запутался...
Почему цикл безконечный получается?...



PHP:
$q=mysql_query("SELECT * FROM p_menue WHERE p_hide='on' order by p_nom ") or die(mysql_error());
		while ($menue=mysql_fetch_array($q)) {
			if ($menue['p_m']=="2") {
					echo "<tr><td align='top' valign='top' width='184' height='27' style='background: #A30001 url(images/bgm2.jpg) no-repeat'><a href='javascript:chhidElem(".$menue['p_id'].")'>";
				if($menue['p_img']!="0") { 
						echo "<img src='menue/".$menue['p_img']."' width='42' height='27'  border='0'>".$menue['p_order_name']."</a>";
				}
				else {
					echo "<img src='menue/bgm1.jpg' width='42' height='27' border='0'>".$menue['p_order_name']."</a>";
				}
				if (mysql_num_rows(mysql_query("SELECT * FROM p_menue WHERE p_order='".$menue['p_order']."' AND  p_cat<>'0' AND p_m='1'"))!=0) {
				echo "<tr align='top' valign='top'><td align='left' valign='left'><div id='".$menue['p_id']."' class='colelem'>";
					while ($catlist=mysql_fetch_array(mysql_query("SELECT * FROM p_menue WHERE p_order='".$menue['p_order']."' order by p_nom"))) {
						if ($catlist['p_cat']!="0" && $catlist['p_m'] == "1") {
							echo "<a class='menue' href='".$PHP_SELF."?act=tov&id=".$catlist['p_cat']."'>".$menue['p_cat_name']."</a><br>";
						}
						else {echo "Ой";}
					}
				echo "</div></td></tr><tr><td height='6' align='left'></td></tr>";
				}
			}
			if ($menue['p_m']=="1" && $menue['p_cat']=="0") { 
			echo "<tr><td align='top' valign='top' width='184' height='27' style='background: #A30001 url(images/bgm2.jpg) no-repeat'><a href='$PHP_SELF?act=tov&id=14'></a></td></tr><tr><td height='6' align='left'></td></tr>";
				
		}
	}
А в бд
p_id p_img p_cat p_order p_menue p_hide p_nom p_cat_name p_order_name p_m
4 0 1 2 1 on 1 бутылочные Домкраты 1
6 avator.jpg 0 2 1 on 1 0 Домкраты 2
5 0 7 2 1 on 3 ромбовые Домкраты 1

Только 3 записи и причём зависает на

if ($catlist['p_cat']!="0" && $catlist['p_m'] == "1") {
echo "<a class='menue' href='".$PHP_SELF."?act=tov&id=".$catlist['p_cat']."'>".$menue['p_cat_name']."</a><br>";

выводит в цикле постоянно <a href...
у меня уже мозг отрубаецца
}
 

Фанат

oncle terrible
Команда форума
чудовищно
while ($catlist=mysql_fetch_array(mysql_query("SELECT
это ты сам придумал такую гениальную конструкцию?
 

kruglov

Новичок
while ($catlist=mysql_fetch_array(mysql_query("SELECT * FROM p_menue WHERE p_order='".$menue['p_order']."' order by p_nom"))) - этот mysql_query исполняется каждый проход while и отбрасывает к началу.
 

Фанат

oncle terrible
Команда форума
если я првильно понимаю, твоя цель весьма благородная - сократить количество строчек в программе, правда?
 

SiMM

Новичок
> while ($catlist=mysql_fetch_array(mysql_query("SELECT * FROM p_menue WHERE p_order='".$menue['p_order']."' order by p_nom")))
Апаздал :)
 

Kox

Guest
Ну сэкономить на кучи переменных и сделать код более понятнм. А то получалось куча переменных типа $q или $query ... А ж путаешьтся...
Пробовал и спеременными творить .. выходит то же самое!
 

Kox

Guest
Ну лады.

А ты не использовал никогда mysql_fetch_array(mysql_query("...
?

Я часто пользую, когда например надо бобыстрому выбрать из другой таблицы зная точный id например... хотя в некоторых случаях и DISTING'а хватает...
 

kruglov

Новичок
Kox

Ну когда 1 раз - то можно, а в цикле... Все равно что сделать

for(i=0;i<10;i=0)
 

Kox

Guest
Фанат, а не мог бы ты рассказать чем плохо так делать?
Может это ещё больше нагружает систему?

-~{}~ 17.06.05 15:16:

kruglow
Да я просто за трое суток раз 40 уже переписывал эту функцию... и постоянно какой-то бред.. потом начал путаться... Ну и решил сократить так сказать что бы не путаться что да как. В этом и была ошибка.
Всё суть в тм что это меню сайта, состоит из одной таблицы.
Можно было сделать из 2 таблиц, Основная и подченённые подменю так сказать... Но это уже было бы точно неплохой нагрузкой на сервак.
 

kruglov

Новичок
Неплохой? А вы померьте.
microtime()

-~{}~ 17.06.05 15:22:

Хотя стоп - если пункты меню отличаются только уровнем вложенности, то нет никакого смысла класть их в разные таблицы.

p. s. А если потом понадобится 3-ий уровень? А если понадобится какой-то пункт перенести на другой уровень?
 

Фанат

oncle terrible
Команда форума
ты не использовал никогда mysql_fetch_array(mysql_query("...
нет.
я написал функцию, которая это делает.
написать две буквы имени функции мне гораздо быстрее, чем целую строчку.
а не мог бы ты рассказать чем плохо так делать?
полохо тем, что у тебя твой кеод не работает.
если ты, вдруг, не заметил.
а так - просто замечательный подход. никаких недостатков!
 

Kox

Guest
Автор оригинала: Фанат
нет.
я написал функцию, которая это делает.
написать две буквы имени функции мне гораздо быстрее, чем целую строчку.

полохо тем, что у тебя твой кеод не работает.
если ты, вдруг, не заметил.
а так - просто замечательный подход. никаких недостатков!
Ну молодец что написал.
Однако, пытался сделать более экономно и грамотно... А вышло наоборот. Однако теперь буду знать.
Спасибо большое хоть что помогли. А то ведь весь форум облазил и про это нигде не написано.. Все FAQ перечитал.
И не стесняюсь читать FAQ по несколько раз. Всё в голове не упомнишь... А жаль )

-~{}~ 17.06.05 15:50:

Автор оригинала: kruglov
Неплохой? А вы померьте.
microtime()

-~{}~ 17.06.05 15:22:

Хотя стоп - если пункты меню отличаются только уровнем вложенности, то нет никакого смысла класть их в разные таблицы.

p. s. А если потом понадобится 3-ий уровень? А если понадобится какой-то пункт перенести на другой уровень?
Всё это учтено и в самой таблице. Дальше только от if'ов :)
 
Сверху