alhames.ru
Имеется схема, при которой существует только одна страничка (index.php), на которой генерируется весь сайт (в зависимости от переданных параметров).
К примеру по запросу site.ru/?a=news, должна сгенерироваться главная страничка новостей, по запросу site.ru/?a=news&b=05 на страницу должны быть выведены новости за май, а по запросу site.ru/?a=news&b=05&c=09 - новсть за конкретное девятое число.
Вопрос: каким образом у вас устроена обработка переданных параметров, и по какому принципу генерируется сайт?
Самый банальный пример, который мне приходит в голову - каждый раз подставлять для include новый адрес (к примеру, в случае новостей - "news.txt"), в котором и будет код запрашиваемой странички.

@темы: PHP

Комментарии
12.05.2008 в 14:46

последний вагон
далеко не все поисковые системы автоматом находят и индексируют ссылки с более чем одним параметром, соотвественно, site.ru/?a=news&b=05&c=09 в большинстве случаев не будет индексироваться
если не предусмотреть альтернативные пути скармливания роботам страниц, то могут возникнуть проблемы )
12.05.2008 в 14:54

alhames.ru
Runables ну, в данном случае, поисковым машинам и пользователям я буду скармливать адрес вида site.ru/news/05/09/, а параметры будут подставляться с помощью .htaccess =)
12.05.2008 в 16:35

Never Say Never (c)
1) ну лучше бы не иклуд (file_gets_content к примеру)
2) лучше все бы бд.

И не забывать
$b = (int) $_GET['b'];
и т.д...

а если подключать файлы п отипу
files/$a$b$c.txt
то ещё проверять $a
12.05.2008 в 17:58

alhames.ru
Nuclear Snow
1) ну лучше бы не иклуд (file_gets_content к примеру)
А чем функции работы с файлами лучше инклуда?

2) лучше все бы бд.
Код php хранить в БД?

а если подключать файлы п отипуfiles/$a$b$c.txt
Ну это не совсем устраивает, так как новостей должно быть большое количество - дисковое пространство будет излишне загружено..

Меня, собственно интересует вопрос "каким образом у вас устроена обработка переданных параметров", а не каким образом её можно устроить.. =)
12.05.2008 в 18:08

Never Say Never (c)
alhames
инклуд это хорошо.. если хорошо путь фильтровать..
хотя с mod_rewrite ом тут ошибок быть не может..)

в бд тексты новостей..
ну индекс будет подсоединять как бы модули

...
if (isset($_GET['a']) and !is_array($_GET['a']))
{
$a = $_GET['a'];
}else{
$a = 'main.php';
}
$pages = array ('news' => 'news.php', 'blog' => 'lib/blog.php');
if (isset($pages[$a]))
{
include $pages[$a];
}else{
include ('main.php');
}
...

и в каждом из них обработка с другими параметрами...
типа в news.php будет извлечение новости из бд к примеру.
if (isset($_GET['b']))
{
$b = (int) $_GET['b'];
}else{
$b = false;
}
анологично для $c
далее можно

if ($a!== false and $b!==false)
{
... // Вывод на дату
}else if ($a!==false){
... // На месяц
}else{
... // главная страница новостей
}
12.05.2008 в 18:46

alhames.ru
Nuclear Snow хм.. впринципе я так и делал, но ты мне подал очень хорошую идею - проверять наличие элемента массива непосредственно перед вставкой - а то я целую функцию написал, которая почемут каряво работает =(
Сиб =)

Если есть другие идеи - я весь во внимании =)
12.05.2008 в 18:53

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

У меня, наверное, так и устроено...
12.05.2008 в 19:12

Never Say Never (c)
alhames
если хочешь без массива с функцией

function check($str)
{
if (eregi("^[a-z0-9]+.php$",$str))
{
return true;
}
return false;
}

var_dump(check('news.php'));



для подключения файлов из текущей папки
12.05.2008 в 19:17

alhames.ru
Волчонок Джей
Можно хранить новости в базе с таймстампоп, а потом делать выборку в зависимости от запроса.
Ну, пример с новостями я привел как самый распространенный. =)
А вообще запросы там намного сложнее - вот теперь думаю как обрабатывать запрос по двум и более параметрам - т.е. массив уже будет иметь вид $page[$a1][$a2][...], и проверка
<?
if (isset($pages[$a]))
{
include 
$pages[$a];
}else{
include (
'main.php');
}
?>
уже не подходит...
12.05.2008 в 19:27

Never Say Never (c)
сами тексты новостей в бд размещать надо...

UPD а вообще если хочешь с инклудами, что не стандартно, то регеспы действительно умеют творить чудеса...
12.05.2008 в 22:34

alhames.ru
Nuclear Snow
если хочешь без массива с функцией
Не-не-не, это функция не устроит, т.к. я категорически против прямой связи переданных параметров с именем файла. Потому тока массив.
Да, тут еще один момент, помимо адреса для инклуда в этом массиве хранятся title, keywords и description, т.к. для каждой сгенерированной странички они разные..
Гм.. А что если их хранить в БД? Тогда уж проще и инклуды тоже в БД хранить..
Надо думать.. думать...


UPD а вообще если хочешь с инклудами, что не стандартно, то регеспы действительно умеют творить чудеса...
Дело в том, что я заранее знаю все возможные варианты значений, которые может принять $_GET['a'] - т.е. это всего несколько конкретных разделов с конкретными именами - в регулярке нет смысла из-за малого объема данных.

Да и вообще, у меня как-то странно все получилось: изначально хотел полностью отделить html от php для простоты настройки дизайна - получилось куча кусков, но ничего толком отделить не удалось.. Наверно раз в пятый переделываю в поисках более рационального решения =)
12.05.2008 в 22:50

Never Say Never (c)
темплеты делай.
т.е. в html коде оставляй типа {user} потом str_replace ом его...
22.05.2008 в 17:43

function __autoload($classname) {
$classname=strtolower($classname);
$path=explode('_',$classname,2);

if (isset($path[1])) {
(file_exists(CL.$classname.'.php')) ? $classname=CL.$classname : $classname=MODULES.$path[1].'/'.$classname;
} else {
$classname=CL.$path[0];
}
include $classname.'.php';
}

PHP5 - рулит =)
Каждая страничка отдельно генерится в своем классе... ну че тут сказать... удобно...

Расширенная форма

Редактировать

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail