Написание гостевой книги на PHP — 3 часть.
Написание гостевой книги на PHP — 3 часть.
Уровень: Новичок (базовые знания)
Здравствуйте ,сегодня третья часть из цикла — Написание гостевой книги на PHP.
Наш план:
- Сделаем простенький дизайн для нашей гостевой книги
- Напишем сценарий и форму для добавления сообщений
Для этого создадим новую папку /style/ ,а в ней файл со стилем — style.css ,также в этой папке мы будем хранить все что относиться к нашему виду — изображения ,javascript и прочее.
Файл style.css
/* Тема: Для гостевой книги /* Автор: Danis92 /* Сайт: gilamov.ru /* Версия CSS: Для редактирования */ body {margin:auto;font-size: 12px; font-family: Verdana,arial; background-color: #EDEEEF; color:#000; max-width: 800px; border: 1px solid #CCCCCC} div.body {background-color: #FCFDFF} /* ссылки */ a {color:#404060; text-decoration: none} a:hover {color: #0099CC} /* Заголовок страницы */ div.title { text-align: center; background-color: #5272B2; font-weight:bold; color: #fff; padding: 2px; border-bottom: 1px solid #4E6DAA; border-right: 1px solid #4E6DAA; border-top: 1px solid #5577BA; border-left: 1px solid #5577BA; } div.copyright { text-align: center; font-size: 11px; padding:2px; } /* Подвал страницы */ div.footer{ background-color: #5272B2; color: #fff; padding: 2px; border-bottom: 1px solid #4E6DAA; border-right: 1px solid #4E6DAA; border-top: 1px solid #5577BA; border-left: 1px solid #5577BA; } .footer a {color: #fff;} .footer a:hover {text-decoration: underline;} /* форма ввода данных */ div.forms{ padding:1px; border-top: 1px #888 solid; border-bottom: 1px #888 solid; margin: 1px; background-color: #defbb9;} /* сообщение об ошибке */ div.err{text-align: center;background: #BF614D;color: #fff;padding:1px} /* информативное сообщение */ div.msg{text-align: center;background: #4DBF9A;color: #fff;padding:1px} /* Формы */ input, select { background-color: #fff; border: 1px solid #68725d; color: #68725d; } textarea { width: 500px; height: 200px; background-color: #fff; border: 1px solid #68725d; color: #68725d; }
Теперь когда наш файл со стилями готов ,пропишем его в нашем заголовке чтобы он подключался ко всем страницам гостевой книги ,и пропишем классы для заголовков и подвала.
Внесем изменения в файл /core/functions.php
<?php defined('SYSPATH') or die('No direct script access.'); /** * Функция вывода заголовка */ function head($title=NULL) { global $keywords,$description,$config; $title = (!empty($title))?$title:$config['title']; $keywords = (!empty($keywords))?$keywords:$config['keywords']; $description = (!empty($description))?$description:$config['description']; header("Content-type: text/html"); echo '<?xml version="1.0" encoding="utf-8"?>'."\n"; ?> <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <title><?=$title?></title> <link rel="stylesheet" href="/style/style.css" type="text/css" /> <meta name="keywords" content="<?=$keywords?>" /> <meta name="description" content="<?=$description?>" /> </head> <body> <div class="body"> <div class="title"><?=$title?></div> <? } /** * Функция вывода подвала сайта */ function foot() { ?> <div class="footer"> <? echo 'Генерация страницы: '.round(microtime(1)-START_TIME,4).' с <br />'; echo 'Используемая память: '.round(START_MEMORY/(1024*1024),2).' Mb <br />'; ?> </div> <div class="copyright"> © My Guestbook - <a href="http://gilamov.ru">Gilamov.ru</a> </div> </div> </body> </html> <? } ?>
Готово ) ,также пропишем в файлу index.php для красоты вывода строчку
<?php /** * Пути к папкам */ define('SYSPATH', realpath('system').DIRECTORY_SEPARATOR); /** * Подключение главного файла */ require_once SYSPATH.'core.php'; head('Гостевая книга'); echo 'Здесь будет сценарии вывода и форма для добавления сообщений'; foot(); ?>
Теперь у нас в гостевой книги есть очень простенький дизайн.
2. Переходим ко второму пункту. Напишем форму и сценарий добавления сообщений в гостевую книгу.
В файле index.php
<?php /** * Пути к папкам */ define('SYSPATH', realpath('system').DIRECTORY_SEPARATOR); /** * Подключение главного файла */ require_once SYSPATH.'core.php'; head('Гостевая книга'); /** * Сценарий для добавлений сообщений */ if (!empty($_POST['login']) && !empty($_POST['message'])) { // Защита от XSS ,удаление пробелов в начале $login = trim(filter_input(INPUT_POST, 'login', FILTER_SANITIZE_SPECIAL_CHARS)); $message = trim(filter_input(INPUT_POST, 'message', FILTER_SANITIZE_SPECIAL_CHARS)); // Массив с ошибками // Проверка на длину логина if(mb_strlen($login)<2 || mb_strlen($login)>64) { $err.='Неправильная длина у логина'; } if (mb_strlen($message)<2 || mb_strlen($message)>1024) { $err.='Неправильная длина у сообщения'; } if (!isset($err)) { /** * Если нет ошибок добавляем сообщение */ $addMessage=$db->prepare('INSERT INTO `guestbook`(`name`,`time`,`message`) VALUES (?,?,?)'); $addMessage->execute(array($login,time(),$message)); if ($addMessage) { echo 'Сообщение добавлено'; } else { echo 'Ошибка добавления сообщения <br />'.$e; } } else { // Вывод ошибок echo $err; } } ?> <!-- Форма добавления сообщений --> <form method="post" action=""> <div class='forms'> Введит ваше имя(max 64):<br /><input type="text" name="login" value="<?=filter_input(INPUT_POST, 'login', FILTER_SANITIZE_SPECIAL_CHARS)?>"/> <br /> Введит ваше сообщение(max 1024):<br /><textarea name="message"><?=filter_input(INPUT_POST, 'login', FILTER_SANITIZE_SPECIAL_CHARS)?></textarea> <br /> <input type="submit" value="Добавить сообщение" /> </div> </form> <? foot();
Теперь подробнее ,в форме мы для удобства пользователя оставляем предыдущие введенные данные ,только не забываем при этом их фильтровать ,так существует возможность проведения XSS
У нас форма и сценарий добавления сообщения совмещены в одном файле ,на мой взгляд это удобно.
В сценарии добавления сообщений проверяем если вообще нужные нам значения в POST массиве.Есть ли они есть и не пусты — фильтруем от XSS.
Любые данные которые вводит пользователь необходимо фильтровать и относиться к ним с очень большой осторожностью ,так как существует вероятность что пользователь может ввести нежелательные нам данные или еще что хуже провести XSS или SQL инъекцию.
Подробнее о уязвимостях можно почитать у меня в блоге в категории Безопасность.
Также мы проверяем на допустимую длину ник и сообщение пользователя.
Все обнаруженные ошибки мы сохраняем в массиве ,значит если массив с ошибками пуст мы можем добавить сообщение иначе выводим ошибку.
Стоит обратить внимание что мы используем в PDO спец.форму prepare и метод execute ,которые защищает наши сообщения от возможности проведения SQL-инъекции. Если вы используете mysql вам необходимо также допольнительно защищать ваши сообщения с помощью функции mysql_real_escape_string.
Если сообщение добавилось выводим соответствующий message.
Пока у нас нет сценария вывода сообщений из базы ,поэтому мы увидим только сообщение о успешном добавлении.Также проследить добавилось ли сообщение можно через phpmyadmin.
Наш урок подошел к концу.
Рекомендую если вы не знакомы с функцией filter изучить ее,также если вы не знаете как правильно фильтровать переменные посетить раздел — безопасность ,можно также спросить у дядюшки Googla )
Ну и напоследок для самых ленивых )
Скачать исходники гостевой книги 3
P.S Если имеются вопросы задаем в комментариях