Loading
Красноглазым Джедаям
компьютерной вселенной
посвящается.

Шаг третий. Файл variables.php

В файле "/libs/model/variables.php" мы определим необходимые переменные и массивы. В частности нас не устраивает получение данных напрямую из адресной строки браузера. Такие данные нуждаются в серьезной проверке на соответствие и безопасность. Но зачем заморачиваться проверкой всех продуктов, если можно просто не жрать подряд всякую дрянь. Выход прост: отфильтруем необходимые нам данные и сольем в бескрайний космос все остальное.

Используй то, что под рукой
и не ищи себе другое.

Создадим $GET.

Массив $GET будет являться отфильтрованной копией глобального массива $_GET и будет содержать только нужные нам и безопасные для нашего сайта данные. Данные, записанные в массив по умолчанию, будут использованы в случае получения некорректных данных из $_GET, что во первых обезопасит сайт от атак, а самое главное, в случае чего пользователь увидит станицу нашего сайта, а не набор предупреждений сервера об ошибках. Создавая этот массив, мы фильтруем получаемую информацию по ключам и те ключи, которых мы не ожидаем сливаем в космос вместе с их значениями.

/** * Array of variables for GET-parametres * Массив переменных для GET-параметров * */ $GET = array( 'section' => 'main', //раздел сайта 'page' => 'page_1' //конкретная страница );

Теперь стоит задача записать в наш вновь созданный массив данные из глобального массива $_GET.

/** * Initialization of variables GET-parametres * Инициализация переменных GET-параметров */ if(CONFIG_REWRITE == 'on' && !empty($_GET['route'])) { $get = explode('/', trim($_GET['route'], '/')); $i = 0; foreach($GET as $var) { if(!empty($get[$i])) $GET[$var] = $get[$i]; ++$i; } } elseif(count($_GET)) { foreach($GET as $var) if(!empty($_GET[$var])) $GET[$var] = $_GET[$var]; }

Первой строкой мы проверяем содержимое константы CONFIG_REWRITE. Как мы помним первая часть имени константы говорит о том, где мы ее определили. В данном случае определим ее в файле с названием config.php, который мы разместили в каталоге "/libs/model/". Она будет определять включен ли модуль перенаправления "REWRITE". Давайте разберемся с ним. Внешний вид гиперссылок определяется либо физическим путем к файлам на сервере (www.mysite.ru/files/myfile.html), либо включением $_GET параметров для точки входа на сайт index.php (www.mysite.ru/index.php?var1=value1&var2=value2). Если на сервере включен модуль перенаправления "REWRITE", то вторая ссылка будет иметь вид (www.mysite.ru/value1/value2). Наша константа будет сообщать логическому модулю сайта о том, включен ли модуль перенаправления. Если он выключен, то в файле с названием config.php мы просто изменим 'on' на любое другое значение и наши гиперссылки заработают как надо!

Итак записали в файл config.php константу: define('CONFIG_REWRITE', 'on');

Теперь загадочное "!empty($_GET['route'])". Включать или выключать модуль перенаправления мы можем самостоятельно. Для этого нужно в корне сайта, там где будет лежать index.php, разместить файл конфигурации сервера Апач. Называется этот файл ".htaccess". Полный текст файла привожу ниже.

AddDefaultCharset UTF-8 php_flag magic_quotes_gpc Off php_flag magic_quotes_runtime Off php_flag register_globals Off ErrorDocument 401 /401.html ErrorDocument 403 /403.html ErrorDocument 404 /404.html Options -Indexes RewriteEngine on RewriteCond %{REQUEST_URI} !^/favicon.ico RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

Не будем рассматривать детальное описание всех директив. Нас интересует последняя строка: "RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]". Это и будет тот самый $_GET['route']. То есть в данном случае вся строка параметров гиперссылки (например: '/main/page_1') будет помещена в переменную route. Речь идет именно о текстовой строке, которую выдает нам функция href() как результат своей работы. (Смотри Шаг 2).

Синтаксис правил преобразования URL таков: # RewriteRule Шаблон Подстановка [флаги] RewriteRule ^(.*)$ index.php?route=$1 [L,QSA] Производится поиск в строке URL запроса в соответствие с Шаблоном регулярного выражения и замена совпадения на строку Подстановки.

$N где (N=0..9)
route=$1
Обратные связи это идентификаторы, которые заменяются содержимым N-й группы подходящего Шаблона.
QSA (добавлять строку запроса)
Этот флаг указывает механизму преобразований на добавление а не замену, строки запроса из URL к существующей, в строке подстановки. Используйте это когда вы хотите добавлять дополнительные данные в строку запроса с помощью директив преобразований. То есть строка запроса из URL будет добавлена к строке index.php?route=. Мы получим итоговую стороку index.php?route=/main/page_1
L (последнее правило)
Остановить процесс преобразования на этом месте и не применять больше никаких правил преобразований. Это соответствует оператору last в Perl или оператору break в языке C. Используйте этот флаг для того, чтобы не преобразовывать текущий URL другими, следующими за этим, правилами преобразований.

В свете сказанного дальнейший разбор строки $get = explode('/', trim($_GET['route'], '/')); и создание массива $get с дальнейшей записью значений в массив $GET будет произведено уже со строкой, сформированной и проверенной функцией href(). Но проверены только ключи, в строке будут только те ключи, которые нами заранее определены в массиве $GET, значения же нам прийдется проверять в последующих логических модулях. Это означает,что если ключ "section" уже проверен, то его значение "MAIN" еще нет!

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

Массив $POST представляет собой отфильтрованный глобальный массив $_POST. Он служит для приема данных из форм. Имена ключей определяют какими будут имена полей формы. Создавая этот массив, мы фильтруем получаемую информацию по ключам и другие ключи мы сможем принять только непосредственно из массива $_POST, либо слить в космос.

$POST = array( 'value0' => '', 'value1' => '', 'value2' => '', 'value3' => '', 'value4' => '', 'value5' => '', 'value6' => '', 'value7' => '', 'value8' => '' ); if(!empty($_POST['form'])) $POST = array_merge($POST, $_POST['form']);

В форме элементы должны иметь имена как: "<input name="form[value3]" type="text">". $_POST['form'] содержит массив всех полей формы. При помощи функции array_merge() сливаем два массива $POST и $_POST['form'] и получим новый массив $POST с данными формы, принятыми от пользователя. В этом случае также ключи предопределены и проверены, а значения нуждаются в дополнительной проверке. Частично можно возложить ее на javascript и выполнить на стороне клиента.

И в заключении полный код файла variables.php:

///////////////////////////////////////////////////////// /** * We kill magic inverted commas * Убиваем магические кавычки */ function stripslashesDeep($data) { if(is_array($data)) $data = array_map("stripslashesDeep", $data); else $data = stripslashes($data); return $data; } if(get_magic_quotes_gpc()) { $_GET = stripslashesDeep($_GET); $_POST = stripslashesDeep($_POST); $_COOKIE = stripslashesDeep($_COOKIE); } /** * Array of variables for GET-parametres * Массив переменных для GET-параметров * */ $GET = array( 'section' => 'main', 'page' => 'page_1' ); /** * Initialization of variables GET-parametres * Инициализация переменных GET-параметров */ if(CONFIG_REWRITE == 'on' && !empty($_GET['route'])) { $get = explode('/', trim($_GET['route'], '/')); $i = 0; foreach($GET as $var => $val) { if(!empty($get[$i])) $GET[$var] = $get[$i]; ++$i; } } elseif(!empty($_GET)) { foreach($GET as $var => $val) if(!empty($_GET[$var])) $GET[$var] = $_GET[$var]; } /** * Buttons * Кнопки */ $ok = !empty($_POST['ok'])?true:false; /* * Initialization of variables POST * Инициализация переменных POST * Принимаем из формы post данные * Записываем их в наш массив $POST = array_merge( * в форме элементы должны иметь имена как: name="form[value3]" * $_POST['form'] содержит массив всех полей формы (name="form[value*]") * Функция array_merge() сливает элементы двух или большего количества массивов таким образом, что значения одного массива присоединяются к значениям предыдущего. * Результатом работы функции является новый массив. */ $POST = array( 'value0' => '', 'value1' => '', 'value2' => '', 'value3' => '', 'value4' => '', 'value5' => '', 'value6' => '', 'value7' => '', 'value8' => '' ); if(!empty($_POST['form'])) $POST = array_merge($POST, $_POST['form']); /* * Не удалять, т.к. если не определены далее в контроллерах, то получим нотис * формирование мета тэгов */ $title = LANG_NO_TITLE; $keywords = LANG_NO_KEYWORDS; $description = LANG_NO_DESCRIPTION;

Продолжим в Шаге 4. Рассмотрим подключение к базе данных.


Контактная информация

E-Mail: oleynikww@gmail.com

Добавить комментарий

Комментарии пользователей