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 :: Вывод из БД в зависимости от URL

 PHP.SU

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


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

> Без описания
kasphaus
Отправлено: 21 Июля, 2012 - 23:54:17
Post Id


Новичок


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


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




Здраствуйте, вот есть у меня на сайте 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 переменных одновременно в урле может быть довольно много.
Может есть более лаконичные варианты?
 
 Top
LIME
Отправлено: 22 Июля, 2012 - 00:00:46
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




kasphaus выбрать из $_GET элемент 'news' и удалить его из массива
остальные элементы объеденить через ' AND '
(Добавление)
в цикле foreach($_GET as $key=>$value)
 
 Top
Hawkmoth
Отправлено: 22 Июля, 2012 - 00:10:07
Post Id


Посетитель


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


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




Не относящееся к делу:
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 не всегда оптимальное решение, но на правах варианта сойдет, думаю.

Относящееся к делу:
А, уже появился пост выше.

(Отредактировано автором: 22 Июля, 2012 - 00:13:49)

 
 Top
KingStar
Отправлено: 22 Июля, 2012 - 00:12:15
Post Id



Участник


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


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




я бы сделал так:

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 Улыбка

(Отредактировано автором: 22 Июля, 2012 - 00:15:32)



-----
То что программа работает, не означает что она написана правильно!
 
 Top
LIME
Отправлено: 22 Июля, 2012 - 00:13:13
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




кроме того надо параметр тримить и после проверять на пустоту
 
 Top
tuareg
Отправлено: 22 Июля, 2012 - 00:22:09
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




URL храните в таблице и не будете мучаться
 
 Top
LIME
Отправлено: 22 Июля, 2012 - 00:25:04
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




tuareg это как?))
 
 Top
KingStar
Отправлено: 22 Июля, 2012 - 00:26:42
Post Id



Участник


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


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




вот и мне интересно???


-----
То что программа работает, не означает что она написана правильно!
 
 Top
tuareg
Отправлено: 22 Июля, 2012 - 00:31:10
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




Я не очень понимаю в чем проблема? Url строка. Ну и храните ее как строку. Поле varchar(255).
Т.е табличка будет что то типа id url name title ....
Первым запросом узнали есть ли такая страница вообще. И потом пошли дальше.
 
 Top
LIME
Отправлено: 22 Июля, 2012 - 00:32:43
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




tuareg это хорошо при кэшировании страниц в базе
а тут надо выборку образовать из гет параметров
ты чегото не понял
 
 Top
tuareg
Отправлено: 22 Июля, 2012 - 00:39:43
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




Может быть Улыбка Спать пора.
Хотя я делал и новости подобным образом. Тут "палка о двух концах"
Если не храним URL-->Не маемся при создании новостей, но начинаем дергаться при отдаче их на сайт(сегодня tag и num завтра еще что-то)
Если храним---> Сложно следить за целостностью данных,но выборка проста до идиотизма

(Отредактировано автором: 22 Июля, 2012 - 00:40:51)

 
 Top
LIME
Отправлено: 22 Июля, 2012 - 01:18:31
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




тоесть каждый набор новостей и каждую страницу набора храним отдельно?
и пофиг что новость войдет в разные списки
оригинальный подход как минимум)))
(Добавление)
да и хранить придется либо в хтмл либо массивом
 
 Top
tuareg
Отправлено: 22 Июля, 2012 - 09:39:34
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




LIME пишет:
тоесть каждый набор новостей и каждую страницу набора храним отдельно?
Зачем? Храним все вместе.
Если есть выборка допустим, показать все и показать только по одной категории. Будет два столбика page общаяя и page категории. (эти поля просто цифры от 1 до n). В данном случае все запросы на выдачу контента можно оптимизировать практически до идела.
Запрос на количество всего MAX(page) таблица не читается а смотрится индекс
На вывод превью WHERE категория="спорт" AND page категории>... LIMIT 5
 
 Top
LIME
Отправлено: 22 Июля, 2012 - 09:42:23
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




нифига не понял
можно пример кортежа?
 
 Top
tuareg
Отправлено: 22 Июля, 2012 - 10:06:32
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




Допустим таблица
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 ошибочка

(Отредактировано автором: 22 Июля, 2012 - 10:13:24)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB