Реализация ЧПУ для сайта

Aug 12, 2011 16:21


Запись опубликована Блог Озима. Оставляйте Ваши комментарии здесь.


Сегодня поговорим о том, как реализовать человекопонятные URL, а точнее, мы поговорим о том, как я это делаю.

Не будем вдаваться в споры - лучше или хуже, просто сразу к делу.

Итак. Для того, чтобы сделать ЧПУ нам необходимо прийти к общему знаменателю, а именно:
- данные хранятся в базе данных (субд MySQL)
- данные имеют уникальный идентификатор (id), являющийся полем int AUTO INCREMENT
- для отображения содержимого на странице мы используем строку GET типа index.php?id=3, само собой, как называть переменные - не имеет значения.
- на данный момент ваш sql запрос в коде выглядит как то так

SELECT * FROM table WHERE id='".mysql_real_escape_string($_GET['id'])."'
- структура таблицы выглядит как то так

CREATE TABLE `pages` ( `id` int(10) unsigned NOT NULL auto_increment, `text` text character set utf8, `title` varchar(255) character set utf8 default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Если все выше написанное у вас имеется - перейдем к делу.
Давайте поймем как все работает сейчас, и как оно должно работать в будущем, когда у нас будет ЧПУ.
Сейчас мы получаем какой то id страницы, и тащим всю информацию, которая соответствует полю с этим id в таблице.
В случае с ЧПУ все должно быть примерно также, за исключением того, что выборку по id мы больше делать не будем.. мы будем делать выборку по URL, а для того, чтобы не было повторов URL мы будем всячески извращаться в админской части.

Итак, если ранее мы просто вбивали в БД данные, то теперь нам нужно создавать еще два поля, для формирования ЧПУ

CREATE TABLE `news` ( `id` int(10) unsigned NOT NULL auto_increment, `text` text character set utf8, `title` varchar(255) character set utf8 default NULL, `url` varchar(255) character set utf8 default NULL, `url_num` int(11) default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
как видите, я добавил два поля - url и url_num. Поле url это само собой, сам URL (как получить транслит), но нам нужно учесть, что при добавлении записи в БД мы можем иметь одинаковые названия (у меня url формируется из названия: название + транслит = URL), но нам нельзя допускать совпадений, так как мы по сути эмулируем id, по которому будет происходить выборка из бд, поэтому, мы вручную будем проверять наличие только что созданного URL в базе данных.

$chpu = translit($_POST['title']); //получаем транслит название $sql=mysql_query("SELECT max(url_num) as url_num FROM pages where url='".$chpu."'"); $row=mysql_fetch_array($sql); if ($row['url_num']!=null)// проверяем - есть такой url или нет, если есть - то { $row['url_num']=$row['url_num']+1; //увеличиваем url_num на 1, чтобы избежать одинаковых ссылок $chpu2=$chpu."_".$row['url_num']; // создаем дополнение к ссылке вида nash_url_1 $upd="UPDATE pages SET url_num=url_num+1 where url='".$chpu."'"; // в бд указывем, что этот урл уже использует число (1 например, если это первый раз) mysql_query($upd); } else { // если такого url нет $chpu2 = $chpu; // то переменная $chpu2 будет простым транслитом без дополнений }
Затем мы обычным способом вносим в БД наши данные, не забыв при этом внести в поле url значение $chpu2.

При выборке на странице пользователю мы уже отправляем не id, а url, т.е. вначале мы получим что то вроде
index.php?id=eto_ssylka_stranicy

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

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

">
а например так


затем мы открываем (или создаем) файл .htaccess в корне сайта, и пишем следующее

RewriteEngine On RewriteRule ^page/([^/]*)\/$ index.php?url=$1 [L]
Собственно - все. Если что непонятно - буду рад помочь в меру своих скромных способностей.

Программирование

Previous post Next post
Up