2b315845

Имитация файлов и директорий - 2


Тут приемов много. Например, у меня версия для печати и страница отзывов ищутся по регулярным выражениям:

if (preg_match("/(d+)-comment/A", $url, $res)) ...

А потом из переменной $res[0] беру номер выпуска и проверяю наличие его в базе. Адрес из нескольких поддиректорий можно, например, при помощи взрыва :)

$dir = explode("/", $url);

и потом обрабатывать подстроки по одной (перед взрывом надо убрать из начала и конца строки слэши).

Кстати, перед тем, как писать материал, я честно отправил письмо на info@lenta.ru с вопросом, используется ли у них такой метод обработки запроса или там действительно существуют директории. Мне не ответили. Не буду гадать, как у них сделано, напишу, как бы я делал обработку адреса.

if (preg_match("/([a-z]+)/(d{4})/(d{2})/(d{2})/([a-z]+)/A", $url, $match)) {

  $request = "SELECT news_id FROM news, rub WHERE news.rub_id=rub.rub_id AND rub_address='". $match[1]. "' AND news_date LIKE '". $match[2]. "-". $match[3]. "-". $match[4]. "' AND news_address='". $match[5]. "'";

Этот запрос делается просто для проверки, есть ли такая новость в базе. А потом в зависимости от результата выдается либо страница с новостью, либо какая-нибудь ругань (или главная страница рубрики/сайта).

А вот как я проверяю адреса на этом сайте:

if (preg_match("/(d+)-print/A", $url, $res)) {

  // версия для печати

  }

elseif (preg_match("/(d+)-comment/A", $url, $res)) {

  // все отзывы

  }

elseif (!preg_match("/D/", $url)) {

  // полная версия выпуска

  }

else {

  // либо остальные рубрики, либо адрес не найден

  };

Кстати, у себя я как честный человек выдаю header("HTTP/1.0 200 Ok") только если выпуск/рубрика найдены.

И еще один пример. Допустим, рубрики сайта построены как дерево, а таблица в базе выглядит так:

CREATE TABLE rubrika ( id TINYINT NOT NULL AUTO_INCREMENT, parent_id TINYINT, address VARCHAR(16) NOT NULL, title VARCHAR(128) NOT NULL, rub_text TEXT NOT NULL, PRIMARY KEY (id), UNIQUE address (address) );




Начало  Назад  Вперед