Программирую меню сайта 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 написал(а):
Предлагаю решить проблему следующим образом, а именно, используя джойновый запрос:
РНР-часть
И, соответственно, HTML-часть
Что выведет данный листинг, думаю, представить не сложно.
Дампы используемых в решении таблиц:
menus
menussub
РНР-часть
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 написал(а):
Спасибо всем за небезразличие. Проблема решена следующим способом:
Rand, спасибо! Вы открыли мне глаза! $categoryes1 = $categoryes -этого не стоило делать, а получить данные самостоятельно для $categoryes1.
$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.