Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрипт меню. Удаление элементов. Несколько вопросов. 
:(
    Опции темы
EasyTask
Дата 15.9.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 26.7.2010

Репутация: нет
Всего: нет



Всем привет. Мне было нужно написать небольшой скриптик который генерировал бы из таблицы меню навигации, причем по некоторым элементам создавал под-элементы меню.  Я долго думал как лучше это реализовать, о многомерных массивах и тд, но остановился на таком варианте:

Код

<?php
  Require "functions.php";  
  $cl = connect();
  
  $query = mysql_query("SELECT * FROM mainmenu");
  $rows = mysql_num_rows($query);
  
  for ($i = 1; $i < $rows+1; $i++)
  {
    $query = mysql_query("SELECT * FROM ctable WHERE cat = $i");
    $cat_rows = mysql_num_rows($query);
    
    
    // Заполняем категорию данными
    if ($cat_rows > 0)
    { 
      // Получаем название категории
      $menu_query = mysql_query("SELECT * FROM mainmenu WHERE catid = $i");
      echo "<b>".mysql_result($menu_query, 0, 'name')."</b><br>\n";
      
      for ($j = 0; $j < $cat_rows; $j++)
      {
      $title = mysql_result($query, $j, 'title');
      $url = mysql_result($query, $j, 'url');
      $id = mysql_result($query, $j, 'id');      
      $subcat = mysql_result($query, $j, 'subcat');
       
      $link = "<b>".$url.$title."</b></a><br>\n";
      echo $link;
        
        
        // Заполняем категорию под категориями
        if ($subcat == 1)
        {
        $sub_query = mysql_query("SELECT * FROM subtable WHERE parent = $id");
        $sub_rows = mysql_num_rows($sub_query);
          
          if ($sub_rows > 0)
          {
            for ($t = 0; $t < $sub_rows; $t++)
            {        
              $title = mysql_result($sub_query, $t, 'title');
              $url = mysql_result($sub_query, $t, 'url');        

              $link = $url.$title."</a><br>\n";    
              echo "*".$link;
            }
          }
        }
      }
    }
  }
?>



Вопрос 1.
Этот код имеет право на существование? Насколько корректно он написан?

Даже поверхностно глядя на него я вижу ОЧЕНЬ уязвимое место, с которым пока что не знаю как бороться. Этим запросом мы получаем элемент таблицы в которой храниться заголовок категории i:
Код

      $menu_query = mysql_query("SELECT * FROM mainmenu WHERE catid = $i");

И вот тут самое интересное. Если я например создам три категории 1 = abc 2 = cba 3 = cab, а затем удалю "2", то скрипт не будет видеть категорию "3", т.к индекс цикла в пером шаге будет равен = 1, во втором = 2. Отсюда вопрос:

Вопрос 2
Как преодолеть эту проблему? Со временем может образоваться очень много таких "дыр" в индексах и все будет выводиться не корректно.

И последнее что мне нужно сделать - возможность сортировки меню. интуитивно понимаю что нужно что то вроде поля таблицы "Pos" которому вручную забивать значение и потом при выводе делать сортировку по нему. Но как? У меня нигде нет прямого перебора, в начале таблицы я беру элемент по конкретному ID. Единственное что я придумал это - использовать данный скрипт в панели управлением меню, в которой уже вручную проставлять параметр "Pos" и использовать таблицу получившуюся в результате в качестве меню сайта.

Вопрос 3
Как можно произовольную сортировку элементов меню?

Заранее всем большое спасибо.
PM MAIL   Вверх
EasyTask
Дата 15.9.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 26.7.2010

Репутация: нет
Всего: нет



Похоже что сам нашел ответ на второй вопрос. Можно же создать массив с данными из таблицы, а после работать уже с ним. Насколько оправдан этот метод?
PM MAIL   Вверх
enoff
Дата 15.9.2010, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 30.6.2010
Где: Санкт-Петербург

Репутация: нет
Всего: 13



Код

$result = mysql_query("SELECT * FROM ctable");
while($row = mysql_fetch_assoc($result)) {
    var_dump($row);  //И все станет ясно, надеюсь :)
}

ttp://hphp.net/mysql_fetch_assoc
mysql_fetch_assoc возвращает массив, содержащий одну запись таблицы.
второй вызов функции возвращает вторую запись и т.д.

Это сообщение отредактировал(а) enoff - 15.9.2010, 18:20
PM MAIL ICQ Skype GTalk   Вверх
Muerto
Дата 16.9.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: нет
Всего: 4



А вы уверены что вам стоит меню через базу данных делать?
Не проще ли xml или ini?

Может и не проще, но нафиг базу грузить за зря


--------------------
user posted image
PM MAIL   Вверх
EasyTask
Дата 16.9.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 26.7.2010

Репутация: нет
Всего: нет



Такие технологии пока что мне не доступны smile Поэтому я думаю что нет выбора. Да и сайт не такой уж крупный что бы создать какие то серьезные тормоза базой на сервере. Если не трудно, скиньте ссылки как это реализовать в хмл или ини, буду благодарен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.