Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2010, 22:11   #1
Maktraher
 
Регистрация: 16.04.2010
Сообщений: 5
Восклицание Вывод рубрик и подрубрик

Доброго времени суток. Прошу вашей профессиональной помощи... Моя проблема заключается в том, что мне необходимо сделать вывод на страницу, некоторых рубрик сайта и подрубрик...

Выглядеть это должно так:
1. Рубрика1
2. Рубрика2
3. Рубрика3
1.Подрубрика1
2.Подрубрика2
3.Подрубрика3
4. Рубрика4
5. Рубрика5
и так далее...

Выводиться все записи должны из базы данных MySQL
Не могу составить правильную, рабочую структуру... Я так понимаю в этом случае необходимо использовать цикл в цикле... Но ничего не выходит.
Maktraher вне форума Ответить с цитированием
Старый 16.04.2010, 23:05   #2
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Ну напишите, как вы пробуете
motorway вне форума Ответить с цитированием
Старый 17.04.2010, 01:56   #3
Vertexxx
Заблокирован
 
Регистрация: 10.04.2010
Сообщений: 145
По умолчанию

Вы имеете ввиду запрос в цикле? Так делать ни в коем случае не стоит. У меня есть один похожий пример, думаю, как раз, то, что Вам нужно.

Данный подход к решению задачи позволил мне обойти "цикл-в-цикле", путём формирования двумерного основного массива, содержащего данные обо всех меню и подменю.
Итак, я имею: запрос - один. Данных в таблице N. А с циклом-в-цикле имел бы такое: Данных в таблице n и запросов было бы тоже n.

PHP код:
$sql "SELECT * FROM a_menu m
             LEFT JOIN a_submenu sm 
             ON m.`class`= sm.`wid`
             ORDER BY m.ord asc"
;

$q mysql_query($sql) or die(mysql_error());    

$arr = array();   // массив, хранящий допустимые значения GET
$item = array(); // главный массив
// формирование массивов данных
while($fetch mysql_fetch_assoc($q))
{
    
settype($item[$fetch['menu']]['href'], 'array');
    
array_push($item[$fetch['menu']]['href'],$fetch['href']);
    
    
settype($item[$fetch['menu']]['sm'], 'array');
    
array_push($item[$fetch['menu']]['sm'],$fetch['submenu']);    
   
    
settype($item[$fetch['menu']]['show'], 'array');
    
array_push($item[$fetch['menu']]['show'],$fetch['show']);
    
    
array_push($arr$fetch['href']); 
    
$item[$fetch['menu']]['ord'] = $fetch['ord'];

и дамп таблиц, участвующих в запросе, естественно:
a_menu
Код HTML:
CREATE TABLE `a_menu` (
	`id` INT(10) NOT NULL AUTO_INCREMENT,
	`ord` TINYINT(10) NULL DEFAULT NULL,
	`menu` TINYTEXT NULL,
	`class` VARCHAR(10) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
)
a_submenu
Код HTML:
CREATE TABLE `a_submenu` (
	`id` INT(10) NOT NULL AUTO_INCREMENT,
	`wid` VARCHAR(10) NULL DEFAULT NULL,
	`show` ENUM('0','1') NULL DEFAULT '1',
	`submenu` TINYTEXT NULL,
	`href` VARCHAR(20) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
На всякий еще запостю, что примерно получится, так сказать, внатуре:
Код:
Array
(
    [Настройки] => Array
        (
            [href] => Array
                (
                    [0] => config
                    [1] => metainfo
                )

            [sm] => Array
                (
                    [0] => Конфигурация
                    [1] => Мета-информация
                )

            [show] => Array
                (
                    [0] => 1
                    [1] => 1
                )

            [ord] => 1
        )
    ...
    ...
    ...
)
Появятся вопросы, задавайте

Последний раз редактировалось Vertexxx; 17.04.2010 в 02:08.
Vertexxx вне форума Ответить с цитированием
Старый 17.04.2010, 14:46   #4
Maktraher
 
Регистрация: 16.04.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Vertexxx Посмотреть сообщение
Вы имеете ввиду запрос в цикле? Так делать ни в коем случае не стоит. У меня есть один похожий пример, думаю, как раз, то, что Вам нужно.

Данный подход к решению задачи позволил мне обойти "цикл-в-цикле", путём формирования двумерного основного массива, содержащего данные обо всех меню и подменю.
Итак, я имею: запрос - один. Данных в таблице N. А с циклом-в-цикле имел бы такое: Данных в таблице n и запросов было бы тоже n.

PHP код:
$sql "SELECT * FROM a_menu m
             LEFT JOIN a_submenu sm 
             ON m.`class`= sm.`wid`
             ORDER BY m.ord asc"
;

$q mysql_query($sql) or die(mysql_error());    

$arr = array();   // массив, хранящий допустимые значения GET
$item = array(); // главный массив
// формирование массивов данных
while($fetch mysql_fetch_assoc($q))
{
    
settype($item[$fetch['menu']]['href'], 'array');
    
array_push($item[$fetch['menu']]['href'],$fetch['href']);
    
    
settype($item[$fetch['menu']]['sm'], 'array');
    
array_push($item[$fetch['menu']]['sm'],$fetch['submenu']);    
   
    
settype($item[$fetch['menu']]['show'], 'array');
    
array_push($item[$fetch['menu']]['show'],$fetch['show']);
    
    
array_push($arr$fetch['href']); 
    
$item[$fetch['menu']]['ord'] = $fetch['ord'];

и дамп таблиц, участвующих в запросе, естественно:
a_menu
Код HTML:
CREATE TABLE `a_menu` (
	`id` INT(10) NOT NULL AUTO_INCREMENT,
	`ord` TINYINT(10) NULL DEFAULT NULL,
	`menu` TINYTEXT NULL,
	`class` VARCHAR(10) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
)
a_submenu
Код HTML:
CREATE TABLE `a_submenu` (
	`id` INT(10) NOT NULL AUTO_INCREMENT,
	`wid` VARCHAR(10) NULL DEFAULT NULL,
	`show` ENUM('0','1') NULL DEFAULT '1',
	`submenu` TINYTEXT NULL,
	`href` VARCHAR(20) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
На всякий еще запостю, что примерно получится, так сказать, внатуре:
Код:
Array
(
    [Настройки] => Array
        (
            [href] => Array
                (
                    [0] => config
                    [1] => metainfo
                )

            [sm] => Array
                (
                    [0] => Конфигурация
                    [1] => Мета-информация
                )

            [show] => Array
                (
                    [0] => 1
                    [1] => 1
                )

            [ord] => 1
        )
    ...
    ...
    ...
)
Появятся вопросы, задавайте
Спасибо за решение, но все же я не понял, как вывести все это дело на страницу?
Maktraher вне форума Ответить с цитированием
Старый 17.04.2010, 14:48   #5
Vertexxx
Заблокирован
 
Регистрация: 10.04.2010
Сообщений: 145
По умолчанию

Цикл Foreach Вам знаком?
Vertexxx вне форума Ответить с цитированием
Старый 17.04.2010, 14:51   #6
Maktraher
 
Регистрация: 16.04.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Vertexxx Посмотреть сообщение
Цикл Foreach Вам знаком?
Нет, к сожалению, буду очень признателен, если объясните или дадите ссылочку на информацию...
Maktraher вне форума Ответить с цитированием
Старый 17.04.2010, 15:12   #7
Vertexxx
Заблокирован
 
Регистрация: 10.04.2010
Сообщений: 145
По умолчанию

Цикл Foreach() предназначен для работы с массивами, а именно для прямого перебора последних.
Вот ссылочка. Там в конце.
В моём решении он работал следующим образом:

PHP код:
$i=0$j=0;
foreach(
$item as $k => $v)
{   
#
    ## группировка на разделы
    #
    /*
    ** Если $j>1, то $hrbr='<hr>', иначе - '<br>';
    */
    
++ $j $hrbr "<hr>" $hrbr "<br>";
    
#
    ## меню
    #
    // это подключается файл шаблона разделов. ХТМЛ-файл, в котором описано отображение их. Просто расширение у него ТПЛ - для удобства            
    
require('../tpl/admin/m.tpl');

    echo 
"<ul>";
    
// здесь мы работаем уже с вложенным массивом href (см. структуру) и заводим цикл FOR.
    
for($i 0$i count($v['href']); $i ++)
    {   
        
/* в нем мы выдёргиваем значение $v['href'][$i] и смотрим является ли собранная конструкция файлом или нет, а так же, чему равно значение $v['show'][$i].*/
        
if(is_file($v['href'][$i].".php") && $v['show'][$i] > 0
            require(
'../tpl/admin/sm-ON.tpl');
       
// это частности... ---------------------------------
        
elseif($k != 'Дизайн'
            echo 
"<div id=sm><li class=n><a class=no href=\"?".$v['href'][$i]."\">".$v['sm'][$i]."</a></div></li>";
      
//---------------------------------------------------
    
}
    echo 
"</ul>";

А массив $arr, упоминавшийся в позапрошлом посте нужен вот здесь. Этот код идёт в файле на три строки ниже.
PHP код:
                <?php
// смысл такой. Если значение QUERY_STRING содержится в массиве, то тогда подключаем такой файл, а если нет, тогда выводим  exit($no_handentering);
                
if(! empty($_SERVER['QUERY_STRING'])){
                    if(!
in_array($_SERVER['QUERY_STRING'], $arr))
                        exit(
$no_handentering);
                    if(
preg_match('/(bin|perl|usr)/si',$_SERVER['QUERY_STRING']))    
                        exit(
$no_handentering);
                    elseif(
is_file($_SERVER['QUERY_STRING'].".php"))
                        include(
$_SERVER['QUERY_STRING'].".php");
                    else
                        echo(
"<h2>Файл $_SERVER[QUERY_STRING].php не существует</h2>");
                }
                unset(
$arr);
                unset(
$item);
                
?>
Vertexxx вне форума Ответить с цитированием
Старый 17.04.2010, 15:12   #8
Vertexxx
Заблокирован
 
Регистрация: 10.04.2010
Сообщений: 145
По умолчанию

Цикл Foreach() предназначен для работы с массивами, а именно для прямого перебора последних.
Вот h**p://www.php.su/learnphp/cs/?cycles. Там в конце.
В моём решении он работал следующим образом:

PHP код:
$i=0$j=0;
foreach(
$item as $k => $v)
{   
#
    ## группировка на разделы
    #
    /*
    ** Если $j>1, то $hrbr='<hr>', иначе - '<br>';
    */
    
++ $j $hrbr "<hr>" $hrbr "<br>";
    
#
    ## меню
    #
    // это подключается файл шаблона разделов. ХТМЛ-файл, в котором описано отображение их. Просто расширение у него ТПЛ - для удобства            
    
require('../tpl/admin/m.tpl');

    echo 
"<ul>";
    
// здесь мы работаем уже с вложенным массивом href (см. структуру) и заводим цикл FOR.
    
for($i 0$i count($v['href']); $i ++)
    {   
        
/* в нем мы выдёргиваем значение $v['href'][$i] и смотрим является ли собранная конструкция файлом или нет, а так же, чему равно значение $v['show'][$i].*/
        
if(is_file($v['href'][$i].".php") && $v['show'][$i] > 0
            require(
'../tpl/admin/sm-ON.tpl');
       
// это частности... ---------------------------------
        
elseif($k != 'Дизайн'
            echo 
"<div id=sm><li class=n><a class=no href=\"?".$v['href'][$i]."\">".$v['sm'][$i]."</a></div></li>";
      
//---------------------------------------------------
    
}
    echo 
"</ul>";

А массив $arr, упоминавшийся в позапрошлом посте нужен вот здесь. Этот код идёт в файле на три строки ниже.
PHP код:
                <?php
// смысл такой. Если значение QUERY_STRING содержится в массиве, то тогда подключаем такой файл, а если нет, тогда выводим  exit($no_handentering);
                
if(! empty($_SERVER['QUERY_STRING'])){
                    if(!
in_array($_SERVER['QUERY_STRING'], $arr))
                        exit(
$no_handentering);
                    if(
preg_match('/(bin|perl|usr)/si',$_SERVER['QUERY_STRING']))    
                        exit(
$no_handentering);
                    elseif(
is_file($_SERVER['QUERY_STRING'].".php"))
                        include(
$_SERVER['QUERY_STRING'].".php");
                    else
                        echo(
"<h2>Файл $_SERVER[QUERY_STRING].php не существует</h2>");
                }
                unset(
$arr);
                unset(
$item);
                
?>
Vertexxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод 2Е+10 Euforia_PZAS09_1 Общие вопросы C/C++ 6 21.02.2010 16:25
Вывод из таблицы. Faridik SQL, базы данных 4 04.02.2010 09:47
Вывод C heart Общие вопросы C/C++ 6 17.08.2009 11:29
вывод файлов hacknet Общие вопросы Delphi 0 20.03.2009 22:16
Ввод и вывод Mihael-Vlz Паскаль, Turbo Pascal, PascalABC.NET 3 19.01.2009 18:00