Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: выбор: многократные запросы к бд или один большой запрос?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: помогите определиться
kir55rus
Отправлено: 05 Марта, 2012 - 19:14:11
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Янв. 2012  
Откуда: Омск, Россия


Помог: 0 раз(а)




Вообщем суть в следующем. Мне нужно на странице вывести все данные из таблицы mysql.
Представим ее такой (categories):
поля: id, idParent, name, content
значения:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 1, 0, категория1, текст
  3. 2, 0, категория2, текст
  4. 3, 1, категория3, текст
  5. 4, 2, категория4, текст
  6.  


как мне это лучше сделать?
Вариант первый:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. //тут подключение к базе, $db_con
  3.  
  4. $res = mysql_query("SELECT id, name FROM categories WHERE idParent='0' ",$db_con);
  5.  
  6. while($myrow = mysql_fetch_assoc($res)) //выводим список категорий
  7. {
  8. echo '<h1>'. $myrow['name'] .'</h1>';
  9.  
  10. $res2 = mysql_query("SELECT id, name FROM categories WHERE idParent='". (int)$myrow['id'] ."' ",$db_con); //запрашиваем подкатегории
  11. while($myrow2 = mysql_fetch_assoc($res2)) //выводим список подкатегорий для данной категории
  12. {
  13. echo '<h2>'. $myrow2['name'] .'</h2>';
  14.  
  15. $res3 = mysql_query("SELECT id, name FROM categories WHERE idParent='". (int)$myrow2['id'] ."' ",$db_con); //запрашиваем подкатегории 2го уровня
  16. while($myrow3 = mysql_fetch_assoc($res3)) //выводим список подкатегорий
  17. {
  18. echo '<h2>'. $myrow3['name'] .'</h2>';
  19.  
  20. //и так повторяется еще 1-2 раза
  21. }
  22. }
  23.  
  24. }//тут мы вывели все категории. При этом мы делал несколько запросов к базе
  25.  
  26. ?>

В этом варианте я делаю запросы к базе до тех пор, пока не будут выведены все строчки из базы

Вариант 2:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $res = mysql_query("SELECT id, name, idParent FROM categories ",$db_con); //запрашиваем все строчки
  3. $mass = array();
  4. for($i=0;$myrow = mysql_fetch_assoc($res);$i++) //создаем массив для последующего использования
  5. {
  6. $mass[$myrow['idParent']][$i]['id'] = $myrow['id'];
  7. $mass[$myrow['idParent']][$i]['name'] = $myrow['name'];
  8. } //на выходе мы получаем массив, в котором содержатся все строки
  9.  
  10. //теперь мы формируем список, но уже не просимся к базе каждый раз
  11. for($count=count($mass),$i=0; $i<$count; $i++) //повтор до тех пор, пока не переберем все категории
  12. {
  13. echo '<h1>'. $mass[0][$i]['name'] .'</h1>';
  14.  
  15. for($count2=count($mass[$i]),$j=0; $j<$count2; $j++) //повтор до тех пор, пока не переберем все подкатегории
  16. {
  17. echo '<h2>'. $mass[$i][$j]['name'] .'</h2>';
  18.  
  19. for($count3=count($mass[$j]),$k=0; $k<$count3; $k++) //повтор до тех пор, пока не переберем все подкатегории
  20. {
  21. echo '<h3>'. $mass[$j][$k]['name'] .'</h3>';
  22.  
  23. //и так еще 1-2 раза
  24. }
  25.  
  26. }
  27.  
  28. }
  29. ?>


В обоих случаях получится результат: (должен получиться, т.к. я не проверял данный код)
<h1>Категория1</h1>
<h2>категория3</h2>
<h1>Категория2</h1>
<h2>категория4</h2>


Думаю, что смысл работы скрипта я смог объяснить. Теперь к главному, вопрос: Какой из вариантов будет быстрее работать и меньше нагружать сервер?

Заранее благодарен за ответ
 
 Top
DeepVarvar Супермодератор
Отправлено: 05 Марта, 2012 - 19:17:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Все что вы написали - бред.
Вас спасут:
а) Процедуры на стороне сервера БД.
б) Рекурсия на стороне php.
 
 Top
DelphinPRO
Отправлено: 05 Марта, 2012 - 19:18:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




kir55rus пишет:
//теперь мы формируем список, но уже не просимся к базе каждый раз
for($count=count($mass),$i=0; $i<$count; $i++) //повтор до тех пор, пока не переберем все категории
{
echo '<h1>'. $mass[0][$i]['name'] .'</h1>';
for($count2=count($mass[$i]),$j=0; $j<$count2; $j++) //повтор до тех пор, пока не переберем все подкатегории
{
echo '<h2>'. $mass[$i][$j]['name'] .'</h2>';
for($count3=count($mass[$j]),$k=0; $k<$count3; $k++) //повтор до тех пор, пока не переберем все подкатегории
{
echo '<h3>'. $mass[$j][$k]['name'] .'</h3>';
//и так еще 1-2 раза
}
}


Это что? построение дерева катагорий?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 05 Марта, 2012 - 19:19:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DelphinPRO пишет:
построение дерева катагорий?
Именно )))
 
 Top
kir55rus
Отправлено: 11 Марта, 2012 - 09:25:23
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Янв. 2012  
Откуда: Омск, Россия


Помог: 0 раз(а)




DeepVarvar пишет:
б) Рекурсия на стороне php.
, спасибо. Решение нашел: http://biznesguide[dot]ru/coding/108[dot]html

Теперь вопрос в следующем. Как сделать так, чтобы в родительской категории показывались все посты с дочерних категорий?

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

(Отредактировано автором: 11 Марта, 2012 - 09:25:59)

 
 Top
caballero
Отправлено: 11 Марта, 2012 - 10:30:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
спасибо. Решение нашел

если бы это было решение - следующего вопроса у тебя бы не возникло


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB