Получение данных о пользователе
Получение текста и проверка на безопасность
Получение данных о дате и времени
У обработчика формы есть три основные задачи:
- получить данные из массива и проверить их на безопасность;
- произвести с данными какие-либо действия;
- вывести результат (при помощи файла шаблона).
В этой главе рассматривается первая задача - получение данных и проверка безопасности (фильтрация).
Получение данных о пользователе
35 // ОБРАБОТКА ПОЛУЧЕННЫХ ДАННЫХ И СОЗДАНИЕ ПЕРЕМЕННЫХ
36 $h_cook_user = JFactory::getUser();
37 if (!($h_cook_user->guest)) {
38 $name = $h_cook_user->username;
39 $eml = $h_cook_user->email;
40 }
Метод JFactory::getUser() позволяет получить так называемый объект пользователя, содержащий все необходимые данные, после чего эти данные можно вывести (получить). В строке 36 переменная $h_cook_user получает объект пользователя, отправившего сообщение.
Далее в строке 37 происходит проверка: является ли пользователь гостем или нет? Если $h_cook_user->guest выдаст TRUE (пользователь является гостем), то ! поменяет это значение на противоположное, т.е. на FALSE, и соответственно, строки 38-39 выполнены не будут. В принципе, такой вариант практически не возможен, так как сама форма открывается только зарегистрированным пользователям. Если пользователь не гость, выполняются строки 38 и 39, в результате чего переменной $name будет присвоено имя пользователя, а переменной $eml - его адрес электронной почты.
Получение данных из списка
41 $type_mess = $_POST['t-dish'];
Переменной $type_mess присваивается значение из списка, выбранное пользователем.
Получение текста и проверка на безопасность
Любой полученный текст должен обязательно проходить фильтрацию и проверку на безопасность.
Для чего это нужно?
В полученным тексте может содержаться какой-либо вредоносный код, который может наделать много различных проблем. Это могут быть различные нарушения в работе сайта, получение доступа к базе данных, данным пользователей и многое, многое другое. Поэтому любой полученный текст должен обязательно тут же пропускаться через специальные фильтры, удаляющие из текста отдельные слова и символы.
42 $text_mess2 = $_POST['mess_text'];
43 $text_mess1 = mb_eregi_replace('(</script>)|(<script>)|(</div>)|(<div>)|(</p>)|(<p>)|(\<\?php)|(\?\>)| (value)|(echo)', '', $text_mess2);
44 $text_mess = mb_eregi_replace('[\{\}\$]', '', $text_mess1);
В строке 42 переменная $text_mess2 принимает из $_POST['mess_text'] текст сообщения, написанного пользователем. В строке 43 функция mb_eregi_replace сканирует текст, содержащийся в переменной $text_mess2, для поиска совпадений со словами, тегами и символами, указанными в регулярном выражении
'(</script>)|(<script>)|(</div>)|(<div>)|(</p>)|(<p>)|(\<\?php)|(\?\>)| (value)|(echo)'
и в случае обнаружения совпадений заменяет этот символ (слово, тег) на пустое значение, т.е. проще говоря, удаляет его. Полученный в результате отфильтрованный текст присваивается переменной $text_mess1 .
В строке 44 функция mb_eregi_replace делает тоже самое со скобками и символом $.
Теперь текст очищен от слов, тегов и символов, которые могут быть использованы для написания вредоносного кода. Так же сюда можно включить любые другие слова и символы, которые нежелательны для использования на вашем сайте.
Получение данных о дате и времени
45 $date_mess = date('Y-m-d'); // Дата создания обращения
46 $time_mess = date('H:i:s'); // Время создания обращения
Переменные $date_mess и $time_mess получают данные при помощи функций PHP date('d.m.Y') и date('H:i:s') соответственно.
Присвоение статуса сообщению
47 $status_mess = '1'; // Статус обращения (1 - новое)
Вновь поступившему сообщению присваивается статус 1 ("Новое").
Получение IP пользователя
48 $ip_client = $_SERVER['REMOTE_ADDR']; // IP пользователя
IP автора получается из массива переменной $_SERVER (индекс 'REMOTE_ADDR').
Обработка полученных файлов
Любые полученные файлы должны быть так же в первую очередь проверены на безопасность.
49 // УСТАНОВКА ФОТО
50 if (!($_FILES['mess_img_1']['tmp_name'] == NULL)) {
51 if (is_uploaded_file($_FILES['mess_img_1']['tmp_name'])) {
52 move_uploaded_file($_FILES['mess_img_1']['tmp_name'], (JPATH_COMPONENT . '/images/' . $_FILES['mess_img_1'] ['name']));
53 $image_1 = ('/images/' . $_FILES['mess_img_1']['name']);
54 }
55 }
Для начала проверяется, существует ли вообще загруженный файл, или переменная $_FILES['mess_img_1']['tmp_name'] пустая (строка 50). Данные в переменной $_FILES содержатся в двойном массиве (один вложен в другой); ['mess_img_1'] указывает имя поля для ввода файлов, а ['tmp_name'] - адрес временного размещения и новое временное имя загруженного файла (см. главу 14). Если в $_FILES['mess_img_1']['tmp_name'] есть значение, то будет выполнен дальнейший код (строки 51-54); если значение NULL - эти строки будут проигнорированы.
В строке 51 функция PHP is_uploaded_file определяет, был ли файл, указанный в $_FILES['mess_img_1']['tmp_name'], загружен при помощи HTTP POST. Это необходимо для защиты сайта (более подробно см. PHP, функция is_uploaded_file). Если файл был загружен как положено, то выполняется код в строке 52.
В строке 52 функция PHP move_uploaded_file перемещает загруженный файл, содержащийся во временной папке $_FILES['mess_img_1']['tmp_name'], в необходимое место и присваивает ему имя, указанные далее в скобках:
(JPATH_COMPONENT . '/images/' . $_FILES['mess_img_2'] ['name'])
В данной строке применяется константа JPATH_COMPONENT, указывающая полный путь на сервере к компоненту, включая папку com_feedback_form . Далее к ней прибавляется название папки для изображений images и имя самого файла, которое было получено при загрузке. Обратите внимание: код строки размещается в одну строку (редактор это позволяет).
В строке 53 переменной $image_1 присваивается значение в виде адреса и имени установленного файла.
Далее всё тоже самое выполняется и для двух других полей:
56 if (!($_FILES['mess_img_2']['tmp_name'] == NULL)) {
57 if (is_uploaded_file($_FILES['mess_img_2']['tmp_name'])) {
58 move_uploaded_file($_FILES['mess_img_2']['tmp_name'], (JPATH_COMPONENT . '/images/' . $_FILES['mess_img_2'] ['name']));
59 $image_2 = ('/images/' . $_FILES['mess_img_2']['name']);
60 }
61 }
62 if (!($_FILES['mess_img_3']['tmp_name'] == NULL)) {
63 if (is_uploaded_file($_FILES['mess_img_3']['tmp_name'])) {
64 move_uploaded_file($_FILES['mess_img_3']['tmp_name'], (JPATH_COMPONENT . '/images/'. $_FILES['mess_img_3']['name']));
65 $image_3 = ('/images/' . $_FILES['mess_img_3']['name']);
66 }
67 }
Обратите внимание: сохранять изображения можно и по-другому - непосредственно в базе данных; для этого используются специальные поля типа BLOB. Подробно о сохранении изображений в БД читайте в статье "Как вносить изображения в базу данных". В этом случае в строках 49-67 данного скрипта прописывается другой код; так же меняется содержимое атрибута src в теге <img> для вывода изображения из БД (читайте указанную статью). Не забудьте в базе данных изменить тип соответствующих столбцов на MEDIUMBLOB.
-------
Следующая глава будет полностью посвящена работе с базой данных: выполнению подключения, созданию строк и внесению в них данных, получению данных из имеющихся ячеек и так далее.