Написание гостевой книги на PHP — 3 часть.

Написание гостевой книги на PHP — 3 часть.

Уровень: Новичок (базовые знания)

Здравствуйте ,сегодня третья часть из цикла — Написание гостевой книги на PHP.

Наш план:

  1. Сделаем простенький дизайн для нашей гостевой книги
  2. Напишем сценарий и форму для добавления сообщений


Для этого создадим новую папку /style/ ,а в ней файл со стилем — style.css ,также в этой папке мы будем хранить все что относиться к нашему виду — изображения ,javascript и прочее.

Файл style.css

<br />
/* Тема: Для гостевой книги<br />
/* Автор: Danis92<br />
/* Сайт: gilamov.ru<br />
/* Версия CSS: Для редактирования<br />
*/<br />
body {margin:auto;font-size: 12px; font-family: Verdana,arial; background-color: #EDEEEF; color:#000; max-width: 800px; border: 1px solid #CCCCCC}<br />
div.body {background-color: #FCFDFF}<br />
/* ссылки */<br />
a {color:#404060; text-decoration: none}<br />
a:hover {color: #0099CC}</p>
<p>/* Заголовок страницы */<br />
div.title {<br />
text-align: center;<br />
background-color: #5272B2;<br />
font-weight:bold;<br />
color: #fff;<br />
padding: 2px;<br />
border-bottom: 1px solid #4E6DAA;<br />
border-right: 1px solid #4E6DAA;<br />
border-top: 1px solid #5577BA;<br />
border-left: 1px solid #5577BA;<br />
}<br />
div.copyright {<br />
text-align: center;<br />
font-size: 11px;<br />
padding:2px;<br />
}</p>
<p>/* Подвал страницы */<br />
div.footer{<br />
background-color: #5272B2;<br />
color: #fff;<br />
padding: 2px;<br />
border-bottom: 1px solid #4E6DAA;<br />
border-right: 1px solid #4E6DAA;<br />
border-top: 1px solid #5577BA;<br />
border-left: 1px solid #5577BA;<br />
}<br />
.footer a {color: #fff;}<br />
.footer a:hover {text-decoration: underline;}</p>
<p>/* форма ввода данных */<br />
div.forms{<br />
padding:1px;<br />
border-top: 1px #888 solid;<br />
border-bottom: 1px #888 solid;<br />
margin: 1px; background-color: #defbb9;}</p>
<p>/* сообщение об ошибке */<br />
div.err{text-align: center;background: #BF614D;color: #fff;padding:1px}<br />
/* информативное сообщение */<br />
div.msg{text-align: center;background: #4DBF9A;color: #fff;padding:1px}</p>
<p>/* Формы */<br />
input, select {<br />
background-color: #fff;<br />
border: 1px solid #68725d;<br />
color: #68725d;<br />
}<br />
textarea {<br />
width: 500px;<br />
height: 200px;<br />
background-color: #fff;<br />
border: 1px solid #68725d;<br />
color: #68725d;<br />
}<br />

Теперь когда наш файл со стилями готов ,пропишем его в нашем заголовке чтобы он подключался ко всем страницам гостевой книги ,и пропишем классы для заголовков и подвала.
Внесем изменения в файл /core/functions.php

<br />
&lt;?php defined('SYSPATH') or die('No direct script access.');<br />
/**<br />
* Функция вывода заголовка<br />
*/<br />
function head($title=NULL)<br />
{<br />
global $keywords,$description,$config;</p>
<p>$title = (!empty($title))?$title:$config['title'];<br />
$keywords = (!empty($keywords))?$keywords:$config['keywords'];<br />
$description = (!empty($description))?$description:$config['description'];</p>
<p>header(&quot;Content-type: text/html&quot;);<br />
echo '&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;'.&quot;\n&quot;;<br />
?&gt;<br />
&lt;!DOCTYPE html PUBLIC &quot;-//WAPFORUM//DTD XHTML Mobile 1.0//EN&quot; &quot;http://www.wapforum.org/DTD/xhtml-mobile10.dtd&quot;&gt;<br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;ru&quot;&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;&lt;?=$title?&gt;&lt;/title&gt;<br />
&lt;link rel=&quot;stylesheet&quot; href=&quot;/style/style.css&quot; type=&quot;text/css&quot; /&gt;<br />
&lt;meta name=&quot;keywords&quot; content=&quot;&lt;?=$keywords?&gt;&quot; /&gt;<br />
&lt;meta name=&quot;description&quot; content=&quot;&lt;?=$description?&gt;&quot; /&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div class=&quot;body&quot;&gt;<br />
&lt;div class=&quot;title&quot;&gt;&lt;?=$title?&gt;&lt;/div&gt;<br />
&lt;?<br />
}</p>
<p>/**<br />
* Функция вывода подвала сайта<br />
*/<br />
function foot()<br />
{<br />
?&gt;<br />
&lt;div class=&quot;footer&quot;&gt;<br />
&lt;?<br />
echo 'Генерация страницы: '.round(microtime(1)-START_TIME,4).' с &lt;br /&gt;';<br />
echo 'Используемая память: '.round(START_MEMORY/(1024*1024),2).' Mb &lt;br /&gt;';<br />
?&gt;<br />
&lt;/div&gt;<br />
&lt;div class=&quot;copyright&quot;&gt;<br />
&amp;copy; My Guestbook - &lt;a href=&quot;http://gilamov.ru&quot;&gt;Gilamov.ru&lt;/a&gt;<br />
&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
&lt;?<br />
}<br />
?&gt;<br />

Готово ) ,также пропишем в файлу index.php для красоты вывода строчку

<br />
&lt;?php<br />
/**<br />
 * Пути к папкам<br />
 */<br />
define('SYSPATH', realpath('system').DIRECTORY_SEPARATOR);</p>
<p>/**<br />
 * Подключение главного файла<br />
 */<br />
require_once SYSPATH.'core.php';</p>
<p>head('Гостевая книга');<br />
echo 'Здесь будет сценарии вывода и форма для добавления сообщений';</p>
<p>foot();<br />
?&gt;<br />

Теперь у нас в гостевой книги есть очень простенький дизайн.

2. Переходим ко второму пункту. Напишем форму и сценарий добавления сообщений в гостевую книгу.
В файле index.php

<br />
&lt;?php<br />
/**<br />
 * Пути к папкам<br />
 */<br />
define('SYSPATH', realpath('system').DIRECTORY_SEPARATOR);</p>
<p>/**<br />
 * Подключение главного файла<br />
 */<br />
require_once SYSPATH.'core.php';</p>
<p>head('Гостевая книга');</p>
<p>/**<br />
* Сценарий для добавлений сообщений<br />
*/<br />
if (!empty($_POST['login']) &amp;&amp; !empty($_POST['message'])) {<br />
// Защита от XSS ,удаление пробелов в начале<br />
$login = trim(filter_input(INPUT_POST, 'login', FILTER_SANITIZE_SPECIAL_CHARS));<br />
$message = trim(filter_input(INPUT_POST, 'message', FILTER_SANITIZE_SPECIAL_CHARS));</p>
<p>// Массив с ошибками<br />
	// Проверка на длину логина<br />
    if(mb_strlen($login)&lt;2 || mb_strlen($login)&gt;64) {<br />
	$err.='Неправильная длина у логина';<br />
	}<br />
      if (mb_strlen($message)&lt;2 || mb_strlen($message)&gt;1024) {<br />
	  $err.='Неправильная длина у сообщения';<br />
	  }</p>
<p>	  if (!isset($err)) {<br />
	  /**<br />
	  * Если нет ошибок добавляем сообщение<br />
	  */<br />
      $addMessage=$db-&gt;prepare('INSERT INTO `guestbook`(`name`,`time`,`message`) VALUES (?,?,?)');<br />
      $addMessage-&gt;execute(array($login,time(),$message));</p>
<p>		if ($addMessage) {<br />
		echo 'Сообщение добавлено';<br />
		} else {<br />
		echo 'Ошибка добавления сообщения &lt;br /&gt;'.$e;<br />
		}<br />
	  } else {<br />
	  // Вывод ошибок<br />
	  echo $err;<br />
	  }<br />
}<br />
?&gt;<br />
&lt;!-- Форма добавления сообщений --&gt;<br />
&lt;form method=&quot;post&quot; action=&quot;&quot;&gt;<br />
&lt;div class='forms'&gt;<br />
Введит ваше имя(max 64):&lt;br /&gt;&lt;input type=&quot;text&quot; name=&quot;login&quot; value=&quot;&lt;?=filter_input(INPUT_POST, 'login', FILTER_SANITIZE_SPECIAL_CHARS)?&gt;&quot;/&gt;<br />
&lt;br /&gt;<br />
Введит ваше сообщение(max 1024):&lt;br /&gt;&lt;textarea name=&quot;message&quot;&gt;&lt;?=filter_input(INPUT_POST, 'login', FILTER_SANITIZE_SPECIAL_CHARS)?&gt;&lt;/textarea&gt;<br />
&lt;br /&gt;<br />
&lt;input type=&quot;submit&quot; value=&quot;Добавить сообщение&quot; /&gt;<br />
&lt;/div&gt;<br />
&lt;/form&gt;<br />
&lt;?<br />
foot();<br />

Теперь подробнее ,в форме мы для удобства пользователя оставляем предыдущие введенные данные ,только не забываем при этом их фильтровать ,так существует возможность проведения XSS
У нас форма и сценарий добавления сообщения совмещены в одном файле ,на мой взгляд это удобно.
В сценарии добавления сообщений проверяем если вообще нужные нам значения в POST массиве.Есть ли они есть и не пусты — фильтруем от XSS.
Любые данные которые вводит пользователь необходимо фильтровать и относиться к ним с очень большой осторожностью ,так как существует вероятность что пользователь может ввести нежелательные нам данные или еще что хуже провести XSS или SQL инъекцию.
Подробнее о уязвимостях можно почитать у меня в блоге в категории Безопасность.
Также мы проверяем на допустимую длину ник и сообщение пользователя.
Все обнаруженные ошибки мы сохраняем в массиве ,значит если массив с ошибками пуст мы можем добавить сообщение иначе выводим ошибку.
Стоит обратить внимание что мы используем в PDO спец.форму prepare и метод execute ,которые защищает наши сообщения от возможности проведения SQL-инъекции. Если вы используете mysql вам необходимо также допольнительно защищать ваши сообщения с помощью функции mysql_real_escape_string.
Если сообщение добавилось выводим соответствующий message.
Пока у нас нет сценария вывода сообщений из базы ,поэтому мы увидим только сообщение о успешном добавлении.Также проследить добавилось ли сообщение можно через phpmyadmin.
Наш урок подошел к концу.

Рекомендую если вы не знакомы с функцией filter изучить ее,также если вы не знаете как правильно фильтровать переменные посетить раздел — безопасность ,можно также спросить у дядюшки Googla )

Ну и напоследок для самых ленивых )
Скачать исходники гостевой книги 3

P.S Если имеются вопросы задаем в комментариях

Вам также может понравиться ...