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
Форумы портала PHP.SU :: Версия для печати :: Вывод из БД в зависимости от URL
Форумы портала PHP.SU » » Вопросы новичков » Вывод из БД в зависимости от URL

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

1. kasphaus - 21 Июля, 2012 - 23:54:17 - перейти к сообщению
Здраствуйте, вот есть у меня на сайте url вида index.php?page=news&tag=sport&num=5

Мне соответственно нужно этот урл обрабатывать для того, чтобы подгружать нужные данные из БД.
Например, при ?page=news показывает первую страницу новостей, при ?page=news&num=2 показывает вторую страницу новостей,
при ?page=news&tag=sport&num=5 показывает пятую страницу спортивных новостей, надеюсь понятно объяснил.

Так вот, какой оптимальный вариант для обработки такой строки, чтобы формировать запрос к БД.
Пока я вижу только варианты с if-else, что-то типа:

PHP:
скопировать код в буфер обмена
  1.  
  2. if(isset($_GET['page'])){
  3.     $query = 'WHERE `type`='.mysql_real_escape($_GET['page']);
  4.    
  5.     if(isset($_GET['tag'])){
  6.         $query .= 'AND `tag` = '.mysql_real_escape($_GET['tag']).'';
  7.     }
  8.     mysql_query("SELECT * FROM `blabla` ".$query." ORDER BY `id`");
  9. }
  10.  
  11.    
  12.  



Но, мне не очень такое нравится, т.к. теоретически get переменных одновременно в урле может быть довольно много.
Может есть более лаконичные варианты?
2. LIME - 22 Июля, 2012 - 00:00:46 - перейти к сообщению
kasphaus выбрать из $_GET элемент 'news' и удалить его из массива
остальные элементы объеденить через ' AND '
(Добавление)
в цикле foreach($_GET as $key=>$value)
3. Hawkmoth - 22 Июля, 2012 - 00:10:07 - перейти к сообщению
Не относящееся к делу:
kasphaus пишет:
mysql_real_escape($_GET['page'])

Наверное, имелось в виду mysql_real_escape_string().
kasphaus пишет:
mysql_query("SELECT * FROM `blabla` ".$query." ORDER BY `id`")

Для постраничного вывода в запросе не мешало бы добавить
PHP:
скопировать код в буфер обмена
  1. "LIMIT ".$_GET['page']*10.", 10"

Это если Вы, допустим, хотите 10 новостей на странице выводить. Хотя LIMIT не всегда оптимальное решение, но на правах варианта сойдет, думаю.

Относящееся к делу:
А, уже появился пост выше.
4. KingStar - 22 Июля, 2012 - 00:12:15 - перейти к сообщению
я бы сделал так:

PHP:
скопировать код в буфер обмена
  1. if(!isset($_GET['page'])) { $_GET['page'] = 'news';} //  по умолчанию выводим news
  2.  
  3. $tag = '';
  4.  
  5. if(isset($_GET['tag']) && !empty($_GET['tag'])){
  6.     $tag .= 'AND `tag` = '.mysql_real_escape_string($_GET['tag']).'';
  7. }
  8.  
  9. if(isset($_GET['tag2']) && !empty($_GET['tag2']){
  10.     $tag .= 'AND `tag2` = '.mysql_real_escape_string($_GET['tag2']).'';
  11. }
  12.  
  13. // перечисляем далее все возможные теги с конкатенацией
  14.  
  15.  mysql_query("SELECT * FROM `blabla` WHERE `type`='".mysql_real_escape_string($_GET['page'])."' ".$tag." ORDER BY `id`");


поправил mysql_real_escape_string Улыбка
5. LIME - 22 Июля, 2012 - 00:13:13 - перейти к сообщению
кроме того надо параметр тримить и после проверять на пустоту
6. tuareg - 22 Июля, 2012 - 00:22:09 - перейти к сообщению
URL храните в таблице и не будете мучаться
7. LIME - 22 Июля, 2012 - 00:25:04 - перейти к сообщению
tuareg это как?))
8. KingStar - 22 Июля, 2012 - 00:26:42 - перейти к сообщению
вот и мне интересно???
9. tuareg - 22 Июля, 2012 - 00:31:10 - перейти к сообщению
Я не очень понимаю в чем проблема? Url строка. Ну и храните ее как строку. Поле varchar(255).
Т.е табличка будет что то типа id url name title ....
Первым запросом узнали есть ли такая страница вообще. И потом пошли дальше.
10. LIME - 22 Июля, 2012 - 00:32:43 - перейти к сообщению
tuareg это хорошо при кэшировании страниц в базе
а тут надо выборку образовать из гет параметров
ты чегото не понял
11. tuareg - 22 Июля, 2012 - 00:39:43 - перейти к сообщению
Может быть Улыбка Спать пора.
Хотя я делал и новости подобным образом. Тут "палка о двух концах"
Если не храним URL-->Не маемся при создании новостей, но начинаем дергаться при отдаче их на сайт(сегодня tag и num завтра еще что-то)
Если храним---> Сложно следить за целостностью данных,но выборка проста до идиотизма
12. LIME - 22 Июля, 2012 - 01:18:31 - перейти к сообщению
тоесть каждый набор новостей и каждую страницу набора храним отдельно?
и пофиг что новость войдет в разные списки
оригинальный подход как минимум)))
(Добавление)
да и хранить придется либо в хтмл либо массивом
13. tuareg - 22 Июля, 2012 - 09:39:34 - перейти к сообщению
LIME пишет:
тоесть каждый набор новостей и каждую страницу набора храним отдельно?
Зачем? Храним все вместе.
Если есть выборка допустим, показать все и показать только по одной категории. Будет два столбика page общаяя и page категории. (эти поля просто цифры от 1 до n). В данном случае все запросы на выдачу контента можно оптимизировать практически до идела.
Запрос на количество всего MAX(page) таблица не читается а смотрится индекс
На вывод превью WHERE категория="спорт" AND page категории>... LIMIT 5
14. LIME - 22 Июля, 2012 - 09:42:23 - перейти к сообщению
нифига не понял
можно пример кортежа?
15. tuareg - 22 Июля, 2012 - 10:06:32 - перейти к сообщению
Допустим таблица
id category numberCat numberAll status
1
100 'спорт' 1 56 'show'
120 'спорт' 2 59 'show'
136 'бизнес' 0 0 'hide'
149 'бизнес' 1 67 'show'
....
10000 'спорт' 3 8900 'show'
ключи (numberAll) для всех и (сategory,numberCat) для категорий
Запросы Я думаю понятно в общих чертах Улыбка (category конечно лучше int сделать) если hide новость скрыта, не видна на сайте
Теперь если мы будем выводить не используя поля numberCat numberAll получится плохо
COUNT будет делать fullscan для всех новостей и считать построчно для категории.
Если использовать numberCat numberAll то в обоих случаях даже таблица читаться не будет
Дальше нам необходимо только знать какую страницу надо вывести и сколько новостей выводится на страницу.
PHP:
скопировать код в буфер обмена
  1.  
  2.  $page=4;// страница которую надо вывести $_GET['page']
  3.  $countOfPage=10;// выводим по десять превью на странице
  4.  $number=$page*$countOfPage; // номер после которого надо выводить
  5.  

И запрос для всех новостей
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.   SELECT * FROM TABLE WHERE numberAll>$number LIMIT $countOfPage;
  3.  

для категорий
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.   SELECT * FROM TABLE WHERE category="спорт" AND numberCat>$number LIMIT $countOfPage;
  3.  

P.S ошибочка
PHP:
скопировать код в буфер обмена
  1.  
  2. $page=$_GET['page']-1;
  3.  

 

Powered by ExBB FM 1.0 RC1