Март
Гостевая книга на 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 Ответить
А скиньте адрес страницы с вашей гостевой книгой