Март
Гостевая книга на php


Гостевая книга php используется многими вебмастерами. Её наличие на сайте улучшает комерческие факторы проекта и поэтому гостевую книгу на php часто используют на сайтах, продающих товары или услуги. В этой статье мы разберём как её создавать.
Наша простейшая гостевая книга должна осуществлять следующим функции:
- Гость должен ввести своё имя и текст сообщения
- Дложна проводиться проверка заполнения полей и отправляемых данных
- Наша гостевая книга php должна быть без mysql
- Должно быть организованно удаление сообщений
И так будем использовать ООП подход. Продумаем структуру. Исходя из ООП подхода у нас будет интерфейс, от него будет наследоваться класс, в классе будут методы на добавление, выборку, удаление. Так же создадим форму гостевой книги где будут происходить события, которые станут обращаться к методам класса и соответственно добавляться удаляться и тд. Так как мы решили что не будем использовать mysql, то мы будем писать данные в файл. Использовать для этого станем встроенную в интерпритатор php базу данные sqlite3.
Создание интерфейса
Cоздадим файл Imybook.class.php и в нём опишем основные методы для работы с книгой:
interface Imybook{
//Добавляет новую запись
function saveLetter($gname, $letter);
//Выборка всех записей
function showLetter();
//Удаление записи
function deleteLetter($id);
}
Создание класса
//подключаем файл с интерфейсом
include "Imybook.class.php";
//созд. класс mybook наследующий интерфейс Imybook
class mybook implements Imybook{
//созд. константу класса DB_NAME и присваиваем ей значение mybook.db
const DB_NAME='mybook.db';
//созд. закрытое свойство $_db для хранения объекта соединения с БД
private $_db;
//созд. конструктор, в котором подключ. к БД
function __construct(){
//проверим существует ли БД
//если БД нет то создадим её и таблицу в ней letters
if(!file_exists(self::DB_NAME)){
$this->_db=new SQLite3(self::DB_NAME);
$sql="CREATE TABLE letters(
id INTEGER PRIMARY KEY,
gname TEXT,
letter TEXT,
datetime INTEGER
)";
$this->_db->query($sql);
}else{
//если бд есть то просто подключ. к ней
$this->_db=new SQLite3(self::DB_NAME);
}
}
//созд. деструктор, в котором откл. от БД
function __destruct(){
unset($this->_db);
}
//при наследовании интерфейса нужно перегрузить все
//его методы (не забыв. ставить {})
function saveLetter($gname, $letter){}
function showLetter(){}
function deleteLetter($id){}
}
Метод saveLetter
Метод saveLetter будет добавлять информацию из нашей формы в БД. Опишем его в нашем классе находящимся в файле mybook.class.php.
function saveLetter($gname, $letter){
//Получим данные о текущих дате и времени
$dt=time();
//Сформируем строку запроса на добавление новой записи
$sql="INSERT INTO letters (gname ,letter, datetime)
VALUES('$gname', '$letter', '$dt')";
$this->_db->query($sql);
return $errMessage="запись добавлена";
}
Файл с формой отправки
Создадим файл mybook.php. Это так называемая вюха, файл где будет отображаться форма отправки и написанные сообщения.
<?php
//Подключим файл с описанием класса mybook
include "mybook.class.php";
//Создадим объект gbook
$gbook=new mybook();
//Создадим переменную $errMessage со строковым значением ""
$errMessage="";
//проверим была ли отправлена HTML-форма
//Если ДА, то подключите файл с кодом для обработки HTML-формы
if($_SERVER["REQUEST_METHOD"]=="POST"){
include "saveletter.inc.php";
}
//Проверяем был ли запрос методом GET на удаление записи
// Если ДА, то подключаем файл с кодом для удаления записи
if(isset($_GET['del'])){
include "deleteletter.inc.php";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>пример гостевой книги php</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" href="/style.css">
</head>
<body>
<section id="content" class="container">
<?php
include "showletter.inc.php";
?>
<h2>Оставить отзыв</h2>
<?php
//Проверим, не является ли переменная $errMessage пустой строкой
//Если НЕТ, то выведите значение переменной $errMessage
if($errMessage){
echo "<p>".$errMessage;
}
?>
<form id="form1" name="form1" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table>
<tbody><tr><td><p>Ваше имя</p></td><td><input type="text" name="gname"></td>
</tr><tr>
<td><p>Ваш отзыв</p></td>
<td>
<textarea name="letter" cols="40" rows="4"></textarea></td>
</tr>
<tr><td> </td><td>
<input type="submit" name="Submit" value="Оставить отзыв"></td>
</tr>
</tbody></table>
</form>
</section>
</body>
</html>
Мы заранее описали в mybook.php подключение файлов saveletter.inc.php, deleteletter.inc.php, showletter.inc.php
saveletter.inc.php
Создадим файл saveletter.inc.php. В этом файле у нас будут обрабатываться данные из нашей HTML формы и вызываться метод saveletter, который будет писать данные в БД.
//Проверим, была ли корректным образом отправлена HTML-форма
//для этого напишем функцию clearDate, вставим её в наш класс
//gbook, теперь это будет метод класса и вызывается соответственно
function clearDate($date){
$date=stripslashes($date);
$date=strip_tags($date);
$date=trim($date);
return $date;
}
//Проверим, была ли корректным образом отправлена HTML-форма
//Если НЕТ, то присвоим переменной $errMessage строковое значение
//"Заполните все поля формы!"
//для начала прогоним получ. данные через clearDate
$gname=clearDate($_POST['gname']);
$letter=clearDate($_POST['letter']);
if(!empty($gname) && !empty($letter)){
//вызовем метод saveletter
if($gbook->saveLetter($gname, $letter)){
// Перезапрашиваем страницу, чтобы избавиться от информации,
//переданной через форму
header('Location: mybook.php');
}else{
$errMessage="Произошла ошибка при добавлении сообщения";
}
}else{
$errMessage="Заполните все поля формы!";
}
Проверку отправки формы и подключение файла мы уже сделали в mybook.php
Метод showLetter. Вывод сообщений в браузер.
Метод showLetter будет возвращать данные из БД в виде массива. Опишем его в нашем классе находящимся в файле mybook.class.php.
function showLetter(){
//формируем строку запроса на выборку всех данных из таблицы letters
//в обратном порядке
$sql="SELECT id, gname, letter, datetime FROM letters
ORDER BY id DESC";
//Получаем и возвращаем результат запроса
$res=$this->_db->query($sql);
$array = array();
while($data = $res->fetchArray(SQLITE3_ASSOC))
{
$array[] = $data;
}
return $array;
}
Создадим теперь файл showletter.inc.php в котором будем выводить данные в браузер.
<?php
//Вызовем метод showLetter, результат сохраним в $allletters
$allletters=$gbook->showLetter();
//Используя цикл, выведите в браузер все сообщения
if(count ($allletters)>0){
foreach($allletters as $row){
$id=$row['id'];
$gname=$row['gname'];
$letter=$row['letter'];
@$dt=date("d-m-Y H:i:s", $row['datetime']*1);
?>
<div class="quote">
<div class="quote-icon">
<div class="icon-img" style="background-color: #ff3333"></div>
</div>
<div class="quote-content">
<p class="droid"><strong><?php echo $gname ?></strong><span class="data"><?php echo @$dt ?></span><br><?php echo $letter ?></p>
</div>
<div class="quote-close">
<a href="/mybook.php?del=<?php echo $id ?>"><img src="/close.png" alt=""></a>
</div>
</div>
<div class="clear"></div>
<?php
}
}
?>
К mybook.php мы этот файл то же подключили.
Метод deleteLetter. Удаление записей.
Опишем метод deleteLetter в нашем классе находящимся в файле mybook.class.php.
function deleteLetter($id){
$sql = "DELETE FROM letters WHERE id=$id";
$this->_db->query($sql);
}
Создадим файл deleteletter.inc.php. В нём мы будем вызывать метод deleteLetter и фильтровать полученные данные
//фильтруем получ. данные
$id=abs((int)$_GET['del']);
//Проверьте, корректны ли полученные данные
if($id){
//вызовем метод deletePost
$gbook->deleteLetter($id);
// Перезапрашиваем страницу, чтобы избавиться от информации,
//переданной через форму
header('Location: mybook.php');
exit;
}else{
$errMessage="хватит меня ломать!";
}
И этот файл мы уже подключили к mybook.php. Стили находятся в файле style.css. Описывать стили я в этой статье не буду.
Комментарии
Максим
24.05.2016 04:27 Ответить
Да хорошая гостевая Собственно давно хотел свою гостевую но Тут вопрос возникает А как тогда кто хочет может отзывы удалять Нажав на крестик и отзыв другова тютю ?
Алексей Григорьев
24.05.2016 13:36 Ответить
Хороший вопрос Максим. Выводить крестик для удаления поста нужно если пользователь авторизован как админ. Про авторизацию на php напишу заметку позже, ну и соответственно прикручу функционал к этой книге.
Александр
26.12.2017 20:27 Ответить
Жаль, что нет демо-просмотра. Пока всё не свяжу со своим сайтом, не получится посмотреть, что же это за книга...
Алексей Григорьев
26.12.2017 20:57 Ответить
В начале статьи есть кнопочка на демо гостевую.
Александр
26.12.2017 21:05 Ответить
Ой, виноват. Не доглядел. Есть просмотр. Прошу извинить!
Алексей Григорьев
26.12.2017 21:06 Ответить
Бывает))
Александр
26.12.2017 21:14 Ответить
Только сейчас рассмотрел книгу. Суперская вещь! Только с удалениями чужих комментариев пока не разобрался. Если я правильно понял, то в данной версии любой человек может удалить чужие комменты. Разработчик обещает авторизацию и функционал. Буду с нетерпением ждать! Заранее от души благодарю его за помощь людям, которым нужна такая книга!
Алексей Григорьев
26.12.2017 21:25 Ответить
Вы всё правильно поняли. Если вы немного понимаете в php то с удаление комментариев только для админа проблем не будет. Всё просто. Делаете авторизацию пользователя на php. Грубо говоря она заключается в том что записывается в бд лог и пасс. Если логин и пасс введены верно то пользователю вешается сессионная кука например админ. Кнопка удалить комментарий показывается только тому пользователю, у которого есть кука админ. Не знаю когда но я эту гостевую допили до этого уровня. Сейчас нет времени, работаю над другим проектом.
Александр
26.12.2017 21:46 Ответить
В PHP почти совсем ничего не понимаю, я больше на actionscript 3.0 сижу. И хоть это совершенно разные языки программировани я, но на то, чтобы не показывать здесь кнопку для удаления сообщений у меня ума хватит))). Всё равно, огромное вам спасибо за такой отличный урок!
Иван
25.06.2018 09:59 Ответить
файл или не работает и отображается на сайте текстом или я что то не понимаю
Алексей Григорьев
25.06.2018 22:42 Ответить
А что вы делаете и как? Где открываете файл? Хостинг с php? Какая версия и тд.
Сергей
18.07.2018 14:54 Ответить
Добрый день! Поставил у себя на сайте, всё вроде настроил, но когда удаляю комментарий, то страница начинает перезапускаться , но останавливается , в адресной строке последний символ это номер комментария который удаляю. Приходится вручную перезапускать сайт, может подскажите где что надо поменять, чтоб удалялось корректно на другом сайте?
Алексей Григорьев
18.07.2018 16:41 Ответить
А скиньте адрес страницы с вашей гостевой книгой