2016
27
Март

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

grigoriev
79994
гостевая книга на php
скачать скрипт гостевая книга php
DOWNLOAD
посмотреть гостевая книга php
DEMO

Гостевая книга 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 Ответить

А скиньте адрес страницы с вашей гостевой книгой

You have no rights to post comments

Используя данный сайт, вы даете согласие на использование файлов cookie, помогающих мне сделать его удобнее для вас. Уведомление о cookie