[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: такая менюшка большой тормоз ?
Vento
2->Профи в PHP & MySQL . Дайте совет,если не затруднит.Скриптик менюшки работает,но вот сомнение есть,не слишком ли тут я намудрил? Прошу сильно ногами не бить ,просто объясните ,будет ли проблема в дальнейшем ,или все же возможно на этой основе выстроить сайт ?

menu.php

Код
<script  type="text/javascript" >
<?php
require "function/f_con.php";

function stranitsa ($lang,$id)
        {
         $query="SELECT * FROM stranitsi WHERE id='".$id."' ";
         $result = mysql_query($query) or die("Query failed : " . mysql_error());
         $line = mysql_fetch_array($result, MYSQL_ASSOC);
         if(!$line)
           {
            ?>
            parent.document.getElementById('stranitsa').innerHTML="<h1 style=\"color:#FF0000\">   !!!</h1>"
            parent.document.getElementById('imenu').innerHTML=''
            
            <?php
            ;}
            else
                {
            
            ?>
            
            parent.document.getElementById('stranitsa').innerHTML='<?=$line[$lang]?>'
            parent.document.getElementById('imenu').innerHTML="<img width=\"70%\"  src=\"img/<?=$line['img']?>\" />"
            
    <?php if ($line['php']) include $line['php']; }
            }
            
            
        
        
function podmenu ($lang,$id)
        {
         $query="SELECT * FROM navi WHERE idverh='".$id."' ";
         $result = mysql_query($query) or die("Query failed : " . mysql_error());
        
    while ( $line = mysql_fetch_array($result, MYSQL_ASSOC))
         {
          ?><li><a href=\"php/menu.php?lang=<?=$lang?>&id=<?=$line['id']?>\" target=\"fr\"><?=$line[$lang]?></a></li><?php;
          }
        
        
          }
function menu ($idverh,$lang,$a)
        {
         $query="SELECT * FROM navi WHERE id='".$idverh."' ";
         $result = mysql_query($query) or die("Query failed : " . mysql_error());
         $line = mysql_fetch_array($result, MYSQL_ASSOC);
         $b='*<a href=\"php/menu.php?lang='.$lang.'&id='.$line['id'].'\"target=\"fr\" >'.$line[$lang].'</a>';
         $a=$b.$a;
         if ($line['idverh'])
            {
             $idverh=$line['idverh'];
             menu ($idverh,$lang,$a );
            }
        else
            {
        ?>  
        parent.document.getElementById('glavmenu').innerHTML='<a href=\"php/start.php?lang=<?=$lang?>\"target=\"fr\" ><img  src=\"img/home.jpg\" width=\"1%\"   /></a><?=$a ?>';
        
             <?php
        ; }
         }
    if(!isset($_GET['lang'])) exit;
    switch ($_GET['lang'])
            {
             case "ru" : $lang="ru"; break;
             case "en" : $lang="en"; break;
             case "ge" : $lang="ge"; break;
             default : $lang="ru";
             }
    if (!isset($_GET['id'])) exit;
    if (!is_numeric($_GET['id'])) exit;
    f_con ();
    $id=$_GET['id']    ;    
    $query="SELECT * FROM navi WHERE id='".$id."' ";
         $result = mysql_query($query) or die("Query failed : " . mysql_error());
         $line = mysql_fetch_array($result, MYSQL_ASSOC);
         $idverh=$line['idverh'];
         $a='~ <b style=\"color:#FF0000\">'.$line[$lang].'</b>';
         menu ($idverh,$lang,$a );
          
     ?>
    parent.document.getElementById('podmenu').innerHTML='<ol><?php
    podmenu ($lang,$id);?></ol>'
    <?php
    stranitsa ($lang,$id)
    ?>
    
    </script>


дамп таблицы:
CREATE TABLE `navi` (
`id` int(11) NOT NULL auto_increment,
`idverh` int(11) default '0',
`ru` varchar(128) collate utf8_unicode_ci NOT NULL,
`en` varchar(128) collate utf8_unicode_ci NOT NULL,
`ge` varchar(128) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=26 ;

--
-- Дамп данных таблицы `navi`
--

INSERT INTO `navi` VALUES (1, 0, 'О нас', 'Aboute us', 'ჩვენს შესახებ');
INSERT INTO `navi` VALUES (2, 0, 'Автомобили', 'Automobile', 'ავტომობილები');
INSERT INTO `navi` VALUES (3, 0, 'Запчасти', 'Parts', 'ნაწილები');
INSERT INTO `navi` VALUES (4, 0, 'Услуги', 'Service', 'მომსახურება');
INSERT INTO `navi` VALUES (5, 0, 'Условия', 'Conditions', 'პირობები');
INSERT INTO `navi` VALUES (6, 1, ' "Эмет группа"', '"AMET Group"', '„ემეთ ჯგუფი“');
INSERT INTO `navi` VALUES (7, 1, 'Как нас найти', 'Our coordinates', 'ჩვენი კოორდინატები');
INSERT INTO `navi` VALUES (8, 1, 'Наши контакты', 'Contact us', 'დაგვიკავშირდით');
INSERT INTO `navi` VALUES (9, 1, 'Сотрудники', 'Our staff', 'ჩვენი თანამშრომლები');
INSERT INTO `navi` VALUES (10, 9, 'Директор', 'Director', 'დირექტორი');
INSERT INTO `navi` VALUES (11, 2, 'Все автомобили', 'All cars', 'ყველა ავტომობილი');
INSERT INTO `navi` VALUES (12, 2, 'Нерастаможенные', 'Without a custom clearance', 'განუბაჟებელი');
INSERT INTO `navi` VALUES (13, 2, 'Распродажа автомобилей', 'Cars for sale', 'გასაყიდი მანქანები');
INSERT INTO `navi` VALUES (14, 2, 'Автомобили на разборку', 'Cars for dismantling', 'დასაჭრელი ავტომობილ&');
INSERT INTO `navi` VALUES (15, 3, 'Запчасти на складе', 'Autoparts of our stock', 'ნაწილები ჩვენი საწყო');
INSERT INTO `navi` VALUES (16, 3, 'Цены на запчасти', 'Parts prices', 'ფასები ავტონაწილებზ&');
INSERT INTO `navi` VALUES (17, 4, 'Поиск автомобиля ', 'Search the car', 'ავტომობილის ძებნა');
INSERT INTO `navi` VALUES (18, 4, 'Автомобили с аукциона', 'Cars from Auctions', 'ავტომობილები აუქციო&');
INSERT INTO `navi` VALUES (19, 4, 'Поиск автозапчастей', 'Autoparts search', 'ავტონაწილებმს ძებნა');
INSERT INTO `navi` VALUES (20, 4, 'Перенос руля', 'Steering transfer', 'საჭის გადატანა');
INSERT INTO `navi` VALUES (21, 5, 'Подбор автомобиля под заказ', 'Booking the car ', 'შეარჩიეთ მანქანა შეკ');
INSERT INTO `navi` VALUES (22, 5, 'Участие в аукционных торгах', 'Participating in Auctions', 'აუქციონში მონაწილეო&');
INSERT INTO `navi` VALUES (23, 0, 'Заказ', 'Booking', 'შეკვეთა');
INSERT INTO `navi` VALUES (24, 23, 'Заказ автомобиля', 'Car booking', 'მანქანის შეკვეთა');
INSERT INTO `navi` VALUES (25, 23, 'Заказ автозапчастей', 'Parts booking', ' ავტონაწილების შეკვე');




Спустя 1 день, 12 часов, 53 секунды (20.07.2008 - 11:22) redow написал(а):
я бы советовал в запросах

$query="SELECT * FROM navi WHERE id='".$idverh."' ";

выбирать не * , тоесть все, а только необходимые поля, перечислив их - будет меньшая нагрузка на базу и скорости прибавится

да и вывод я бы собирал в переменную, а потом все сразу вывел, говорят производительности тоже добавит

Спустя 2 часа, 32 минуты, 35 секунд (20.07.2008 - 13:54) Vento написал(а):
Цитата(redow @ 20.7.2008, 12:22) [snapback]43943[/snapback]
я бы советовал в запросах

$query="SELECT * FROM navi WHERE id='".$idverh."' ";

выбирать не * , тоесть все, а только необходимые поля, перечислив их - будет меньшая нагрузка на базу и скорости прибавится

да и вывод я бы собирал в переменную, а потом все сразу вывел, говорят производительности тоже добавит

Спасибо за замечание,действительно,притупил немного с запросом,конечно лучше вместо * поставить $lang,просто голова была забита вопросом: "Что оптимальнее,сразу при загрузке главной страницы вывести всё меню со всеми подменю и под-под меню,(подсоединится один раз к базе,вытащить все необходимое,загнать это все пользователю и при помощи JavaScript организовать переходы по страницам ,ведь тогда останется только один запрос к базе на вывод определённой страницы), или использовать выше приведенный вариант ?
Из недостатков приведенного выше скриптика ,вижу неоднократное обращение к базе ,при навигации по сайту,так что при большом количестве пользователей ,активно перемещающихся по различным страницам,этот вариант будет тормозить.
Если же загружать один раз все меню со всеми подменю,то при большом колличестве пунктов ,пользователю будет грузиться много лишнего,ведь не будет он пробегать по всем страницам сразу с одного захода на сайт,т.е. при большом колличестве пользователей,просматривающих одну-две страницы,будет перегонятся лишняя информация,что тоже не есть хорошо.

П.С. По поводу вывода,сохраняя все в переменную,а потом её вывод ,не совсем согласен.Конечно,читабельность скриптика будет выглядеть намного лучше,но зачем из-за этого расходовать дополнительно память?

Спустя 13 минут, 26 секунд (20.07.2008 - 14:08) vasa_c написал(а):
А не надо забивать себе голову всякими вопросами. Пишите так как вы на данный момент умеете. Пытайтесь оптимизировать там где это действительно нужно, а не в выводе менюшки. Не пытайтесь устраивать оптимизацию основанную на ваших предположениях, о том, как это работает внутри, всё равно там работает всё по другому. И уж тем более не делайте псевдооптимизационные извращения с JavaScript.

Цитата
Конечно,читабельность скриптика будет выглядеть намного лучше,но зачем из-за этого расходовать дополнительно память?

Вот пример предположения об оптимизации, основанного ни на чём.

Начнёт тормозить, тогда оптимизируйте

Спустя 1 час, 9 минут, 43 секунды (20.07.2008 - 15:18) Vento написал(а):
Цитата(vasa_c @ 20.7.2008, 15:08) [snapback]43949[/snapback]
Не пытайтесь устраивать оптимизацию основанную на ваших предположениях, о том, как это работает внутри, всё равно там работает всё по другому.

Так вопрос заключался в том,насколько правильны мои предположения.Я только месяца три как начал работать с PHP и MySQL, поэтому и возникают такие вопросы .Лет 20 назад занимался с Z80 и однокристалкой 1816,вот и осталось у меня бережное отношение к ресурсам.

Цитата(vasa_c @ 20.7.2008, 15:08) [snapback]43949[/snapback]
Цитата
Конечно,читабельность скриптика будет выглядеть намного лучше,но зачем из-за этого расходовать дополнительно память?

Вот пример предположения об оптимизации, основанного ни на чём.



Мое предпроложение основано на том,что по моему мнению,если появляется переменная,то ей будет выделена память,а зачем её расходовать по пустякам.Если я не прав в этом вопросе ,то буду весьма признателен за компетентный ответ.

Цитата(vasa_c @ 20.7.2008, 15:08) [snapback]43949[/snapback]
Начнёт тормозить, тогда оптимизируйте

Может так выйти,что будет поздно пить боржоми .
Первая же (и пока единственная моя работа ) потребовала кардинальной переделки,и только потому ,что я заранее не удосужился позаботиться о добавлении дополнительных языков,думал,что сделаю цмс-ку на русском,а потом подумаю (если понадобится ) как присоединить другие языки. Так понадобилось sad.gif .

Спустя 32 минуты, 32 секунды (20.07.2008 - 15:50) vasa_c написал(а):
Цитата
Так вопрос заключался в том,насколько правильны мои предположения

Объясните хотя бы, зачем там столько JavaScript и как вы вообще это меню выводите?

Цитата
Мое предпроложение основано на том,что по моему мнению,если появляется переменная,то ей будет выделена память,а зачем её расходовать по пустякам

1. Пых не тот язык, где нужно жертвовать чёткостью и простотой кода ради сотни байтов.
2. Пых предназначен для обработки и выдачи текста и для этих операций там намешаны таки алгоритмы, что далеко не сразу понятно, где что выделится и сколько.
3. Поток вывода тоже не в информационном поле земли хранится, а в той же памяти.

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

Так вот об этом и надо думать - о том, что понадобиться впоследствии, а так же о том, как оставить возможность подключения того, о чем пока не знаешь. А не о выделении памяти для переменной.

Спустя 4 часа, 9 минут, 18 секунд (20.07.2008 - 19:59) Vento написал(а):
Цитата(vasa_c @ 20.7.2008, 16:50) [snapback]43956[/snapback]
Цитата
Так вопрос заключался в том,насколько правильны мои предположения

Объясните хотя бы, зачем там столько JavaScript и как вы вообще это меню выводите?

На главной странице(можно сказать единственной) внедрил невидимый iframe, (под именем fr ),вот через него,посредством parent.document.getElementById('нужный блок').innerHTML и заменяю все что захочу на странице,не перегружая ее.Не знаю,насколько это правильно,но работает smile.gif .
При первой (и единственной) загрузке главной страницы,вывожу основное меню :
Код
<div style="background-color:#66FFFF " >*<?php
while($line1 = mysql_fetch_array($result1, MYSQL_ASSOC))
     {
      ?> <a target="fr" href="php/menu.php?id=<?=$line1['id']?>&lang=<?=$lang?>" > <b> <?=$line1[$lang]?> </b> </a>*
      <?php;}?>
    </div>


при клике по ссылке главного меню,открывается menu.php (код в самом начале темы показан)
с него и идет запись в iframe, через котрый и выводится меню с подподменю а также
менюшка навигации и обновление информационной части (по идее можно сделать любой части ) страницы

Цитата(vasa_c @ 20.7.2008, 16:50) [snapback]43956[/snapback]
3. Поток вывода тоже не в информационном поле земли хранится, а в той же памяти.

Согласен,но вот скажите,пожалуйста,ПЫХ обрабатывает что-либо после " ?>".Если нет,то значит ПЫХ не забирает дополнительно памяти под новую переменую.
Цитата(vasa_c @ 20.7.2008, 16:50) [snapback]43956[/snapback]
Так вот об этом и надо думать - о том, что понадобиться впоследствии, а так же о том, как оставить возможность подключения того, о чем пока не знаешь. А не о выделении памяти для переменной.

Интересный такой язык этот ПЫХ .Обычно самый наипервейший вопрос это выделение памяти под переменные.
Но тут Вы скорее правы ,язык PHP действительно не тот,с которым можно доводить быстродействие и потребление ресурсов до оптимального значения

Спустя 24 минуты (20.07.2008 - 20:23) vasa_c написал(а):
Со времён программирования Z80 появилось много языков программирования и областей их применения (а не только пых), где микросекунды и десятки байтов не являются главным.

То что вы пытаетесь придумать что-то своё, несомненно здорово и полезно. Но лучше не слишком в это углубляться и на начальном этапе делать по простому. Выводите нормально меню на странице, пусть она перезагружается каждый раз. Боитесь за теже ресурсы? Лёгкая вёрстка и вынос стилей в CSS-файлы дадут гораздо больший эффект, чем этот ифрейм.

Спустя 35 минут, 10 секунд (20.07.2008 - 20:59) Vento написал(а):
Цитата(vasa_c @ 20.7.2008, 21:23) [snapback]43977[/snapback]
То что вы пытаетесь придумать что-то своё, несомненно здорово и полезно. Но лучше не слишком в это углубляться и на начальном этапе делать по простому. Выводите нормально меню на странице, пусть она перезагружается каждый раз. Боитесь за теже ресурсы? Лёгкая вёрстка и вынос стилей в CSS-файлы дадут гораздо больший эффект, чем этот ифрейм.

Вы попали в самую точку по поводу легкой верстки.Действительно занимает много времени sad.gif . Да и под старой оперой и мозилой не совсем правильно работает,однако можете посмотреть сами,насколько пользователю сайта удобно ,когда страница не перегружается полностью.Если не лень,то протестируйте плииз www.amet.ge а новая версия менюшки с поддержкой языков www.amet.ge/indexnov.php Если вдруг станет интересно,то готов выложить все коды ( GPL ) smile.gif


Спустя 11 часов, 36 минут, 52 секунды (21.07.2008 - 08:36) sergeiss написал(а):
В весь код я не вникал, но вот какие вопросы появились сразу же при беглом просмотре.

Автор пишет, что ему уже пришлось существенно переделывать один проект при добавлении языка, а тут те же грабли закладывает. Вот предположим, что в дополнение к русскому, английскому и грузинскому языкам понадобится добавить еще, например, немецкий язык (греческий, эстонский, французский...). Что надо будет делать? А надо будет добавлять еще одно поле в таблицу (для каждого языка) и переделывать весь (ВЕСЬ!!!) код.....

Вот тут и надо бы начать оптимизацию smile.gif До того момента, когда этот новый язык понадобится. Тут надо делать как минимум 2 таблицы. Одна с пунктами меню, а другая с языками. И связать их по индексу языка. Тогда текст будет всегда неизменными, после того, как ты его модифицируешь под новую структуру.

Спустя 6 часов, 31 минута, 25 секунд (21.07.2008 - 15:07) Vento написал(а):
Цитата(sergeiss @ 21.7.2008, 9:36) [snapback]43989[/snapback]
В весь код я не вникал, но вот какие вопросы появились сразу же при беглом просмотре.

Автор пишет, что ему уже пришлось существенно переделывать один проект при добавлении языка, а тут те же грабли закладывает. Вот предположим, что в дополнение к русскому, английскому и грузинскому языкам понадобится добавить еще, например, немецкий язык (греческий, эстонский, французский...). Что надо будет делать? А надо будет добавлять еще одно поле в таблицу (для каждого языка) и переделывать весь (ВЕСЬ!!!) код.....

Вот тут и надо бы начать оптимизацию smile.gif До того момента, когда этот новый язык понадобится. Тут надо делать как минимум 2 таблицы. Одна с пунктами меню, а другая с языками. И связать их по индексу языка. Тогда текст будет всегда неизменными, после того, как ты его модифицируешь под новую структуру.


Тык я об энтом в первую очередь подумал smile.gif
Добавить новый язык можно совершив всего три операции:
поставить ссылку на главной странице ,где указать ,lang='две первые буквы любого языка'
добавить новое поле в двух таблицах 'две первые буквы любого языка'
заполнить соответствующие строки на том языке ,который выставили.
(если будете пользоваться phpadminom то при заполнении будете видеть надписи на русском и других языках,которые уже прописаны ,так что процесс заполнения будет не сложен)

ПС
Ой ,еще и надо в switch case "две буквы " дополнение сделать в menu.php

Спустя 2 часа, 22 минуты, 38 секунд (21.07.2008 - 17:30) sergeiss написал(а):
Если честно говорить... То мне не кажется, что ты об этом подумал именно в первую очередь.
Обрати внимание на то, что ты указываешь как "всего" 3 операции. Первые 2 из них требуют квалифицированного (!!!) вмешательства в структуру БД.

Дело твоё, конечно. Но я бы сделал по-другому, так, чтобы ни в коем случае не приходилось менять структуру таблиц. Только добавлять данные!!! Не более того.
Например, в одной таблице делаем поля (id, idverh, textid), а в другой таблице - (textid, langid, text_). Эти таблицы (назовем их menu и menu_text) можно всегда легко связать запросом. Ну, и в третьей таблице language со структурой (langid, lang_short_name, lang_full_name) разместим список языков, откуда всегда легко будет достать имя языка или его идентификатор.
Сделаем запрос
Код
select id, idverh, text_ from menu, menu_text where menu.textid=menu_text.textid and langid=...

И получим полное описание меню (все строки) именно для указанного языка.
Естественно, вместо многоточия надо поставить идентификатор языка (либо числовой, либо буквенный).

Это вот мое видение данного процесса. Плюс его в том, что всё легко автоматизируется и, что более важно, структрура таблиц остается стабильной и неизменной.

Кстати, с твоего позволения, небольшое примечание насчёт switch smile.gif
Если написать всего одну строку
Код
$lang=isset($_GET['lang']) ? $_GET['lang'] : "ru";

вместо словоблудия
Код
    if(!isset($_GET['lang'])) exit;
    switch ($_GET['lang'])
            {
             case "ru" : $lang="ru"; break;
             case "en" : $lang="en"; break;
             case "ge" : $lang="ge"; break;
             default : $lang="ru";
             }

то это будет более "красиво" smile.gif

При этом: (1) полностью сохраняется функциональность, т.е. не пострадает алгоритм; (2) можно будет не выключать обработку (обойтись без exit), если не указан язык; (3) добавление любых других языков не потребует изменения кода в данном месте (а это весьма существенно, на самом деле!!!).

Спустя 1 час, 39 минут, 28 секунд (21.07.2008 - 19:09) Vento написал(а):
Цитата(sergeiss @ 21.7.2008, 18:30) [snapback]44031[/snapback]
Дело твоё, конечно. Но я бы сделал по-другому, так, чтобы ни в коем случае не приходилось менять структуру таблиц. Только добавлять данные!!! Не более того.
Например, в одной таблице делаем поля (id, idverh, textid), а в другой таблице - (textid, langid, text_). Эти таблицы (назовем их menu и menu_text) можно всегда легко связать запросом. Ну, и в третьей таблице language со структурой (langid, lang_short_name, lang_full_name) разместим список языков, откуда всегда легко будет достать имя языка или его идентификатор.
Сделаем запрос
Код
select id, idverh, text_ from menu, menu_text where menu.textid=menu_text.textid and langid=...

И получим полное описание меню (все строки) именно для указанного языка.
Естественно, вместо многоточия надо поставить идентификатор языка (либо числовой, либо буквенный).

Это вот мое видение данного процесса. Плюс его в том, что всё легко автоматизируется и, что более важно, структрура таблиц остается стабильной и неизменной.


Большое спасибо,Вы на 100% правы,так и буду делать.

Цитата(sergeiss @ 21.7.2008, 18:30) [snapback]44031[/snapback]
Кстати, с твоего позволения, небольшое примечание насчёт switch smile.gif
Если написать всего одну строку
Код
$lang=isset($_GET['lang']) ? $_GET['lang'] : "ru";

вместо словоблудия
Код
    if(!isset($_GET['lang'])) exit;
    switch ($_GET['lang'])
            {
             case "ru" : $lang="ru"; break;
             case "en" : $lang="en"; break;
             case "ge" : $lang="ge"; break;
             default : $lang="ru";
             }

то это будет более "красиво" smile.gif

никак не могу вспомнить,зачем мне понадобилось сделать так ,чтобы скрипт заканчивал работу если не установлен язык в GET['$lang'] wacko.gif
может боялся появления $lang ,без GET['$lang'] ,которая попадет в запрос?
да,наверно тормознул и тут.

Еще раз большое спасибо.


_____________
Быстрый ответ:

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