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

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

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

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

Наш план:

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


Для этого создадим новую папку /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">
&copy; 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 Если имеются вопросы задаем в комментариях

Гиламов Данис

Приветствую вас уважаемый посетитель! Меня зовут Данис, на страницах дневника я пишу о том что мне интересно: программирование, саморазвитие, спорт, мои размышления, творчество. Надеюсь вы сможете найди для себя полезную информацию, если вы что-то заметили, захотели обсудить, прошу оставлять комментарии в статьях, в Журнале или Написать мне Для меня - это лучшая награда. Спасибо за внимание :)

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