|
|
![](flycatimages/misc/snbg.gif) |
![](flycatimages/misc/tl.gif) |
|
![](flycatimages/misc/tr.gif) |
|
|
|
Уменьшение Количества Запросов В Модуле Pages
| ![](flycatimages/misc/pcon.gif) |
#1 | ![](flycatimages/misc/postl.gif) |
|
21.03.2008, 18:08
Вот такая трабла: у меня модуль Pages с хаком от xRay т.е. неограниченная вложеность категорий.
У меня в одной категории 59 под категорий и соответственно в каждой под категории более 3 под-под категорий - небу увлекаться подсчетом. Вообщем в таблице nuke_rupages_categories 120 записей. и при выводе данных по функции list_pages_categories количество запросов к базе 116, соответственно при добавлении под категорий количество запросов будет увеличиваться. Помогите пожалуйста с оптимизацией єтой функции.
PHP код:
function list_pages_categories($cid, $nach) { global $prefix, $db, $sitename, $admin, $multilingual, $module_name, $description, $parentid, $module_title, $admin_file, $number, $show__all_docs, $subkatnumber, $show_signature, $show_date, $show_counter, $page_img, $cat_img, $subcat_img, $subcat_sub_img, $page_title; include("header.php"); if (! $nach): $nach=0; endif; title("$page_title"); OpenTable(); $sql = "SELECT title, description, parentid FROM ".$prefix."_rupages_categories WHERE cid='$cid'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $rtitle=getparentlink($parentid, $page_title); echo "<center><b>$row[rtitle]</b><br>$row[description]<hr size=\"1\"></center>"; //xRay $result21 = $db->sql_query("select cid, title, description from ".$prefix."_rupages_categories where parentid=$cid order by title"); $numrows0 = $db->sql_numrows($result21); while(list($cid1, $stitle1, $description1) = $db->sql_fetchrow($result21)) { echo "<font class=\"option\">$cat_img <a href=\"modules.php?name=$module_name&pa=list_pages_categories&cid=$cid1\">$stitle1</a>"; if ($subkatnumber == 1) { $result31 = $db->sql_query("select pid from ".$prefix."_rupages where cid=$cid1"); $numrows1 = $db->sql_numrows($result31); echo "($numrows1)"; } echo "</font><br>$description1<br>"; $result22 = $db->sql_query("select cid, title, description from ".$prefix."_rupages_categories where parentid=$cid1 order by title"); $numrows01 = $db->sql_numrows($result22); while(list($cid2, $stitle2, $description2) = $db->sql_fetchrow($result22)) { $result8 = $db->sql_query("select cid, title from ".$prefix."_rupages_categories where parentid=$cid2"); $numsubcat = $db->sql_numrows($result8); if ($numsubcat==0) { echo "<font class=\"content\"> $subcat_img <a href=\"modules.php?name=$module_name&pa=list_pages_categories&cid=$cid2\">$stitle2</a><br>"; } else { echo "<font class=\"content\"> $subcat_sub_img <a href=\"modules.php?name=$module_name&pa=list_pages_categories&cid=$cid2\">$stitle2</a><br>"; } if ($subkatnumber == 1) { $result31 = $db->sql_query("select pid from ".$prefix."_rupages where cid=$cid2"); $numrows2 = $db->sql_numrows($result31); echo "($numrows2)<br>"; } } } if ($numrows0!=0) echo "<br><hr size=\"1\">"; //xRay $sql1 = "SELECT pid, title, subtitle, clanguage, page_header FROM ".$prefix."_rupages WHERE active='1' AND cid='$cid' ORDER BY title"; $result1=$db->sql_query($sql1); $kolvo=mysql_affected_rows(); $kon=$nach+$number; $sql = "SELECT pid, title, subtitle, clanguage, page_header, signature, counter, date FROM ".$prefix."_rupages WHERE active='1' AND cid='$cid' ORDER BY title LIMIT $nach , $kon"; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $pid = $row[pid]; $title = $row[title]; $subtitle = $row[subtitle]; $clanguage = $row[clanguage]; $header = $row[page_header]; if ($multilingual == 1) { $the_lang = "<img src=\"images/language/flag-$clanguage.png\" hspace=\"3\" border=\"0\" height=\"10\" width=\"20\">"; } else { $the_lang = ""; } if ($subtitle != "") { $subtitle = "<br>$subtitle"; } else { $subtitle = ""; } if (is_admin($admin)) { echo "$page_img $the_lang <a href=\"modules.php?name=$module_name&pa=showpage&pid=$pid\"><b>$title</b></a>$subtitle<br>$header<br>"; if ($show_signature==1) echo "<font class='pagesdescr'>"._PAUTHOR.": ".$row[signature]."</font><br>"; if ($show_counter==1) echo "<font class='pagesdescr'>"._PCOUNTER.": <b>".$row[counter]."</b> </font>"; $dtp=explode(" ",$row[date]); $datepbl = $dtp[0]; if ($show_date==1) echo "<font class='pagesdescr'>"._PDATE.": ".$datepbl."</font>"; echo "<br>[ <a href=\"".$admin_file.".php?op=pages_edit&pid=$pid\">"._EDIT."</a> | <a href=\"".$admin_file.".php?op=pages_change_status&pid=$pid&active=1\">"._DEACTIVATE."</a> | <a href=\"".$admin_file.".php?op=pages_delete&pid=$pid\">"._DELETE."</a> ]"; echo "<br><br>"; } else { echo "$page_img $the_lang <a href=\"modules.php?name=$module_name&pa=showpage&pid=$pid\"><b>$title</b></a> $subtitle<br>$header<br>"; if ($show_signature==1) echo "<font class='pagesdescr'>"._PAUTHOR.": ".$row[signature]."</font><br>"; if ($show_counter==1) echo "<font class='pagesdescr'>"._PCOUNTER.": <b>".$row[counter]."</b> </font>"; $dtp=explode(" ",$row[date]); $datepbl = $dtp[0]; if ($show_date==1) echo "<font class='pagesdescr'>"._PDATE.": ".$datepbl."</font>"; echo "<br><br>"; } } $n=$kolvo/$number; if ($kolvo/$number){ $n++; } if ($n>=2) { $count=0; echo "<center><b>"._PAGEN."</b><br><br>|"; for ($i=1;$i<=$n;$i++){ echo " "; echo "<a href=\"modules.php?name=$module_name&pa=list_pages_categories&cid=$cid&nach=$count\">$i</a>"; echo " |"; $count=$count+$number; } } if ($show__all_docs==1) echo "</center><br>"._ALLDOCS." <b>$kolvo</b>"; if (is_admin($admin)) { $sql = "SELECT pid, title, subtitle, clanguage FROM ".$prefix."_rupages WHERE active='0' AND cid='$cid' ORDER BY date"; $result = $db->sql_query($sql); echo "<br><br><b>"._YOURADMINLIST."</b><br><br>"; echo "<blockquote>"; while ($row = $db->sql_fetchrow($result)) { $pid = $row[pid]; $title = $row[title]; $subtitle = $row[subtitle]; $clanguage = $row[clanguage]; if ($multilingual == 1) { $the_lang = "<img src=\"images/language/flag-$clanguage.png\" hspace=\"3\" border=\"0\" height=\"10\" width=\"20\">"; } else { $the_lang = ""; } if ($subtitle != "") { $subtitle = "<br>$subtitle"; } else { $subtitle = " "; } echo "<strong><big>·</big></strong> $the_lang <a href=\"modules.php?name=$module_name&pa=showpage&pid=$pid\"><b>$title</b></a>$subtitle<br>[ <a href=\"".$admin_file.".php?op=pages_edit&pid=$pid\">"._EDIT."</a> | <a href=\"".$admin_file.".php?op=pages_change_status&pid=$pid&active=0\">"._ACTIVATE."</a> | <a href=\"".$admin_file.".php?op=pages_delete&pid=$pid\">"._DELETE."</a> ]<br><br>"; } } echo "<center>[ <a href=\"java script:history.go(-1)\">"._PBACK."</a> | <a href=\"modules.php?name=$module_name\">"._PHOME."</a> ]</center>"; CloseTable(); include("footer.php"); }
Знаю что вся загвоздка в операторе while, но как изменить не знаю, опыта мало
Может можно както объеденить запросы?
Последний раз редактировалось Soniks, 26.03.2008 в 10:29.
|
|
|
|
![](flycatimages/misc/pbbg.gif) |
|
![](flycatimages/misc/gl.gif) |
|
![](flycatimages/misc/gr.gif) |
|
26.03.2008, 11:07
Работоспособность не проверял, но должно все работать:
PHP код:
function list_pages_categories($cid, $nach) { global $prefix, $db, $sitename, $admin, $multilingual, $module_name, $description, $parentid, $module_title, $admin_file, $number, $show__all_docs, $subkatnumber, $show_signature, $show_date, $show_counter, $page_img, $cat_img, $subcat_img, $subcat_sub_img, $page_title; include("header.php"); if (! $nach): $nach=0; endif; title("$page_title"); OpenTable(); ####### Начало оптимизации ####### // $cid - id категории $cid = intval($cid); // Загоняем весь список категорий в два массива: $cid_array = array(); // Массив с ключами по "cid" $parent_array = array(); // Массив с ключами по "parentid" и значениями "cid" $sql = "SELECT cat.cid, cat.title, cat.description, cat.parentid, COUNT(page.pid) AS count_pages FROM ".$prefix."_rupages_categories AS cat LEFT JOIN ".$prefix."_rupages AS page ON(page.cid=cat.cid AND page.active='1') WHERE cat.active='1' GROUP BY cat.cid ORDER BY cat.title ASC"; $all_result = $db->sql_query($sql); while($all_row = $db->sql_fetchrow($all_result)){ $cid_array[$all_row['cid']] = $all_row; $parent_array[$all_row['parentid']][] = $all_row['cid']; } //$rtitle=getparentlink($parentid, $page_title); echo "<center><b>".$cid_array[$cid]['title']."</b><br>".$cid_array[$cid]['description']."<hr size=\"1\"></center>"; // Выводим из маллива подкатегории нашей категори, если такие есть if($parent_array[$cid] and is_array($parent_array[$cid])){ foreach($parent_array[$cid] as $sub_sid){ echo "<font class=\"option\">$cat_img <a href=\"modules.php?name=$module_name&pa=list_pages_categories&cid=$sub_sid\">".$cid_array[$sub_sid]['title']."</a>"; if ($cid_array[$sub_sid]['count_pages'] >0) { echo "(".$cid_array[$sub_sid]['count_pages'].")"; } echo "</font><br>".$cid_array[$sub_sid]['description']."<br>"; // Если есть подкатегории то выводим их if($parent_array[$sub_sid] and is_array($parent_array[$sub_sid])){ foreach ($parent_array[$sub_sid] as $sub2_cid){ // Проверяем есть ли у еэтой подкатегории подкатегория if (!empty($parent_array[$sub2_cid])) { echo "<font class=\"content\"> $subcat_img <a href=\"modules.php?name=$module_name&pa=list_pages_categories&cid=$sub2_cid\">".$cid_array[$sub2_cid]['title']."</a><br>"; } else { echo "<font class=\"content\"> $subcat_sub_img <a href=\"modules.php?name=$module_name&pa=list_pages_categories&cid=$sub2_cid\">".$cid_array[$sub2_cid]['title']."</a><br>"; } if ($cid_array[$sub2_cid]['count_pages'] >0) { echo "(".$cid_array[$sub2_cid]['count_pages'].")<br>"; } } } } echo "<br><hr size=\"1\">"; } ####### Конец оптимизации ####### $sql1 = "SELECT pid, title, subtitle, clanguage, page_header FROM ".$prefix."_rupages WHERE active='1' AND cid='$cid' ORDER BY title"; $result1=$db->sql_query($sql1); $kolvo=mysql_affected_rows(); $kon=$nach+$number; $sql = "SELECT pid, title, subtitle, clanguage, page_header, signature, counter, date FROM ".$prefix."_rupages WHERE active='1' AND cid='$cid' ORDER BY title LIMIT $nach , $kon"; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $pid = $row[pid]; $title = $row[title]; $subtitle = $row[subtitle]; $clanguage = $row[clanguage]; $header = $row[page_header]; if ($multilingual == 1) { $the_lang = "<img src=\"images/language/flag-$clanguage.png\" hspace=\"3\" border=\"0\" height=\"10\" width=\"20\">"; } else { $the_lang = ""; } if ($subtitle != "") { $subtitle = "<br>$subtitle"; } else { $subtitle = ""; } if (is_admin($admin)) { echo "$page_img $the_lang <a href=\"modules.php?name=$module_name&pa=showpage&pid=$pid\"><b>$title</b></a>$subtitle<br>$header<br>"; if ($show_signature==1) echo "<font class='pagesdescr'>"._PAUTHOR.": ".$row[signature]."</font><br>"; if ($show_counter==1) echo "<font class='pagesdescr'>"._PCOUNTER.": <b>".$row[counter]."</b> </font>"; $dtp=explode(" ",$row[date]); $datepbl = $dtp[0]; if ($show_date==1) echo "<font class='pagesdescr'>"._PDATE.": ".$datepbl."</font>"; echo "<br>[ <a href=\"".$admin_file.".php?op=pages_edit&pid=$pid\">"._EDIT."</a> | <a href=\"".$admin_file.".php?op=pages_change_status&pid=$pid&active=1\">"._DEACTIVATE."</a> | <a href=\"".$admin_file.".php?op=pages_delete&pid=$pid\">"._DELETE."</a> ]"; echo "<br><br>"; } else { echo "$page_img $the_lang <a href=\"modules.php?name=$module_name&pa=showpage&pid=$pid\"><b>$title</b></a> $subtitle<br>$header<br>"; if ($show_signature==1) echo "<font class='pagesdescr'>"._PAUTHOR.": ".$row[signature]."</font><br>"; if ($show_counter==1) echo "<font class='pagesdescr'>"._PCOUNTER.": <b>".$row[counter]."</b> </font>"; $dtp=explode(" ",$row[date]); $datepbl = $dtp[0]; if ($show_date==1) echo "<font class='pagesdescr'>"._PDATE.": ".$datepbl."</font>"; echo "<br><br>"; } } $n=$kolvo/$number; if ($kolvo/$number){ $n++; } if ($n>=2) { $count=0; echo "<center><b>"._PAGEN."</b><br><br>|"; for ($i=1;$i<=$n;$i++){ echo " "; echo "<a href=\"modules.php?name=$module_name&pa=list_pages_categories&cid=$cid&nach=$count\">$i</a>"; echo " |"; $count=$count+$number; } } if ($show__all_docs==1) echo "</center><br>"._ALLDOCS." <b>$kolvo</b>"; if (is_admin($admin)) { $sql = "SELECT pid, title, subtitle, clanguage FROM ".$prefix."_rupages WHERE active='0' AND cid='$cid' ORDER BY date"; $result = $db->sql_query($sql); echo "<br><br><b>"._YOURADMINLIST."</b><br><br>"; echo "<blockquote>"; while ($row = $db->sql_fetchrow($result)) { $pid = $row[pid]; $title = $row[title]; $subtitle = $row[subtitle]; $clanguage = $row[clanguage]; if ($multilingual == 1) { $the_lang = "<img src=\"images/language/flag-$clanguage.png\" hspace=\"3\" border=\"0\" height=\"10\" width=\"20\">"; } else { $the_lang = ""; } if ($subtitle != "") { $subtitle = "<br>$subtitle"; } else { $subtitle = " "; } echo "<strong><big>·</big></strong> $the_lang <a href=\"modules.php?name=$module_name&pa=showpage&pid=$pid\"><b>$title</b></a>$subtitle<br>[ <a href=\"".$admin_file.".php?op=pages_edit&pid=$pid\">"._EDIT."</a> | <a href=\"".$admin_file.".php?op=pages_change_status&pid=$pid&active=0\">"._ACTIVATE."</a> | <a href=\"".$admin_file.".php?op=pages_delete&pid=$pid\">"._DELETE."</a> ]<br><br>"; } } echo "<center>[ <a href=\"java script:history.go(-1)\">"._PBACK."</a> | <a href=\"modules.php?name=$module_name\">"._PHOME."</a> ]</center>"; CloseTable(); include("footer.php"); }
|
|
|
|
|
|
"Если бы вам удалось надавать под зад человеку, виноватому в большинстве ваших неприятностей - вы бы неделю не смогли сидеть". |
|
|
|
|
|
|
![](flycatimages/misc/pbbg.gif) |
|
![](flycatimages/misc/gl.gif) |
|
![](flycatimages/misc/gr.gif) |
|
24.04.2008, 18:48
Soniks Спасибо большое!
|
|
|
|
![](flycatimages/misc/pbbg.gif) |
|
Опции темы |
Поиск в этой теме |
|
|
Опции просмотра |
Линейный вид
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:50.
|
![](flycatimages/misc/fl.gif) |
|
![](flycatimages/misc/fr.gif) |
|
![](flycatimages/misc/vbbg.gif) |
![](flycatimages/misc/botl.gif) |
|
![](flycatimages/misc/botr.gif) |
![](flycatimages/misc/botcp.gif) |
|
![](flycatimages/misc/botcp.gif) |
|