Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #71, НОЯБРЬ 2004 г.

Членораздельная адресация

Никита Кислицин

Хакер, номер #071, стр. 071-116-2


ErrorDocument 404 content.php

ErrorDocument 403 content.php

ErrorDocument 401 content.php

Это означает, что при возникновении любой из этих трех ошибок пользователю будет показан файл content.php. Думаю, понятно, что как раз этот сценарий и будет целиком и полностью управлять работой сайта, в зависимости от значения переменной $REQUEST_URI. Напомню, этот идентификатор хранит в себе адрес запрошенного клиентом документа на сервере. Таким образом, становится возможным не просто показывать пользователю что-то адекватное, но и различать файлы, которые он запрашивал, и выводить содержимое этих виртуальных источников. Но это все слова, давай напишем простенький скрипт, который будет выводить содержимое текстового файла с именем запрошенной директории. Т.е., например, если пользователь запросил /contacts/, скрипт должен вывести содержимое файла contacts.txt. Это совсем несложно:

Элементарный пример скрипта-менеджера

<?

header ("HTTP/1.0 200 Ok"); /* Говорим браузеру, что такой файл есть */

$uri=ereg_replace("/", "", $HTTP_SERVER_VARS["REQUEST_URI"]); /* Удаляем лишние символы из имени документа */

$uri.= ".txt"; /* Добавляем расширение .txt */

if(file_exists($uri)) { /* Проверяем наличие файла */

require($uri); /* Если есть, выводим его содержимое */

} else {echo "file not found";} /* В противном случае огорчаем пользователя */

?>

Понятно, что это просто пример, и он не может претендовать на полноценное использование. Однако он наиболее показателен – думаю, тебе не составило труда понять, как он работает, и мы можем двигаться дальше. Давай реализуем более жизнеспособный пример. На твоем сайте есть двухуровневое меню, которое представлено одной таблицей в базе данных:

CREATE TABLE NAVIGATION(

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

parent_id int,

name varchar(40),

address varchar(20),

terminal int);

Чтобы было понятней, я подробно прокомментирую структуру этой таблицы. Id – это уникальный идентификатор каждой ячейки, число. Parent_id – это идентификатор ячейки, которая расположена на уровень ниже текущей. Name – это название раздела, которое рисуется в меню. Address – это слово, используемое для адресации этого раздела меню. Terminal – это флаг, показывающий, является ли конечным текущий элемент. В случае если установлен флаг -1, считается, что элемент не является листом дерева, а если 1, то напротив, перед нами терминальный элемент меню. Если ты чуть-чуть знаком с основами информатики, то легко заметишь, что эта несложная таблица является фактически линеаризованным деревом. В самом деле, этой таблицей можно легко задать дерево меню любой глубины. Но мы для определенности будем считать, что его глубина не может превышать 2. Возможно, у тебя появился резонный вопрос: если это дерево, то можно ли реализовать все классические алгоритмы его обхода? Хех, ответ положительный! Если присмотреться, это совсем нетрудно и абсолютно так же реализуется рекурсивной процедурой. Как видишь, для создания сложных меню совсем необязательно использовать кучу таблиц, можно обойтись одной-единственной, и это позволит куда эффективнее работать с меню. Но об использовании деревьев в web-программировании мы с тобой еще поговорим, а сейчас настало время написать функцию, которая будет парсить двухуровневые адреса элементов меню и выводить идентификаторы найденных разделов. Вот примерный код этой процедуры:

Назад на стр. 071-116-1  Содержание  Вперед на стр. 071-116-3