[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: While-цикл и его нестабильность
vidal
Здравствуйте!
Программирую меню сайта PHP/MySQL. Пришлось применить два While-цикла один в другом. Первый находит первую директорию и перестает работать после работы другого. Второй исправно находит все поддиректории. Уже мучаюсь пол дня. Может кто подскажет мою ошибку?

$query = "select * from main";
$query1 = $query;
$categoryes = mysql_db_query($dbname, $query, $link);
$categoryes1 = $categoryes;
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 и включая две фигурные скобки), первый цикл проигрывается до конца.



Спустя 12 минут, 20 секунд (1.08.2010 - 00:40) Slays написал(а):
странная конструкция, напиши сам sql запрос

Спустя 45 минут, 45 секунд (1.08.2010 - 01:25) Rand написал(а):
Дело в том, что вот это "$categoryes1 = $categoryes" не копирует содержимое, а копирует ссылку на ещё не обработанный результат запроса. Вначале извлеки все данные в массив, а потом уже работай с ними как хочешь.

Спустя 1 час, 3 минуты, 10 секунд (1.08.2010 - 02:28) Ice написал(а):
Предлагаю решить проблему следующим образом, а именно, используя джойновый запрос:
РНР-часть

include('db.php');

$sql = "SELECT menu, submenu FROM menus m
INNER JOIN menussub sm
ON m.id=sm.parent_id"
;

$q = mysql_query( $sql );
$Data = array();
if( mysql_num_rows( $q ) > 0 ) {
while( $fetch = mysql_fetch_object( $q ) ) {
settype( $Data[$fetch->menu], 'array' );
settype( $Data[$fetch->menu]['sm'], 'array' );
$Data[$fetch->menu]['sm'][] = $fetch->submenu;
}
}


И, соответственно, HTML-часть

<html>
<head></head>
<body>
<?php
foreach( $Data as $menu=>$v):?>
<dt><strong><?php print
$menu?></strong></dt>
<?php
foreach( $v['sm'] as $submenu):?>
<dd><?php print
$submenu?></dd>
<?php
endforeach?>
<?php
endforeach?>
</body>
</html>


Что выведет данный листинг, думаю, представить не сложно.

Дампы используемых в решении таблиц:
menus
CREATE TABLE `menus` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`menu` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
)

COMMENT='менюшки'
ENGINE=InnoDB

menussub
CREATE TABLE `menussub` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`parent_id` INT(10) UNSIGNED NOT NULL,
`submenu` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
)

COMMENT='подменюшки'
ENGINE=InnoDB



Спустя 7 часов, 21 минута, 38 секунд (1.08.2010 - 09:50) vidal написал(а):
Спасибо всем за небезразличие. Проблема решена следующим способом:

$query = "select * from main";
$query1 = $query;
$categoryes = mysql_db_query($dbname, $query, $link);
while($stroka=mysql_fetch_array($categoryes)) // перебор строк таблицы с начала до конца с целью поиска категорий (["type"] == "0")
{
if ($stroka["type"] == "0"){
echo $stroka["name"]; // Вывод на экран категорий
echo "<br>";
$categoryes1 = mysql_db_query($dbname, $query, $link);
while($stroka1=mysql_fetch_array($categoryes1)) // перебор строк таблицы с начала до конца с целью поиска подкатегорий данной категории (["type"] == "1")
{
if (($stroka1["type"] == "1") and ($stroka1["subtype"] == $stroka["N"])){
echo $stroka1["name"]; // Вывод на экран подкатегорий данной категории
echo "<br>";
}
}
}
}

Rand, спасибо! Вы открыли мне глаза! $categoryes1 = $categoryes -этого не стоило делать, а получить данные самостоятельно для $categoryes1.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.