Главная
Скачать (Download)
Dreamweaver CS6
Dreamweaver CS5
Dreamweaver CS4
Dreamweaver 8
Dreamweaver MX 2004
Dreamweaver 4
Уроки (Tutorials)
Видеоуроки new!!!

Fireworks
ЧаВо
Документация
Статьи
Программы и скрипты
Бесплатные шаблоны
Каталог сайтов
Форум
Карта сайта
Контакты



Документация - Главная
- Macromedia Dreamweaver
- CSS
- Раскрутка
- PHP
- SQL
- Дизайн [1 2]
- Java
- Разное

главная > статьи >

Пишем скрипт гостевой книги

В этой статье мы рассмотрим, как написать свою гостевую книгу. И так поставим цель: простейшую гостевую книгу на PHP с использованием базы данных MySQL. Наша гостевая не будет обременена красивым интерфейсом и защитой, главное, чтобы она работала. Приведенные здесь скрипты основаны на скриптах моей гостевой книги, но значительно упрощены для лучшего понимания принципа работы скриптов, а все остальное: форматирование текста, смайлы, скины и пр. можно легко добавить. Скачать готовые скрипты можно здесь.

Этап первый: планирование.

Для начала определимся с таблицей MySQL, в которой мы будем хранить сообщения нашей гостевой книги. Нам хватит одной таблицы. Основные параметры, которые должны быть в любой гостевой это имя, сообщение и дата, когда было оставлено сообщение. Но мы введем еще пару полей: адрес электронной почты, url сайта, и ICQ. Исходя из этого нам нужно составить SQL-запрос, создающий нужную нам таблицу. Он будет выглядеть так:

  CREATE TABLE $table(
    k_msg int primary key auto_increment,
    guest varchar(20),
    email varchar(40),
    url varchar(60),
    icq varchar(15),
    time int,
    msg mediumtext,
    replay mediumtext

Что же мы сделали. Этот запрос создаст таблицу gbook и в ней будут определены следующие поля:

  • k_msg - уникальный номер сообщения, первичный ключ таблицы, он нам понабиться, когда мы будем работать над панелью модерирования нашей гостевой.
  • guest - имя гостя, 30 символов должно быть достаточно, но при желании можно и увеличить;
  • email - адрес электронной почты гостя;
  • url - URL-адрес сайта;
  • icq - аська гостя;
  • time - время, когда было оставлено сообщение;
  • msg - собственно сообщение. Тип mediumtext позволяет хранить текст размером до 64Кб;
  • replay - ответное сообщение от администратора.
  • Этап второй: скрипт установки

    Рядовой пользователь может быть незнаком с PHP или MySQL, по этому мы не будем его обременять ручным созданием нужной нам таблицы и настройки нашей гостевой книги. Поэтому нам нужен инсталляционный скрипт который все сделает за него (и за нас тоже). Наш инсталляционный скрипт должен запросить у пользователя основные параметры у пользователя, подключиться к базе данных, создать таблицу и конфигурационный файл нашей гостевой книги.

    install.php

    <html>
    <head><title>Установка гостевой книги</title></head>
    <body>
    
    <h2>Установка гостевой книги</h2>
    <form action=<?=$SCRIPT_NAME?> method=post>
    <table>
    <tr><td align=right>Хост:</td>
    <td align=left><input type=text name=host value=<?=$host?>></td></tr>
    
    <tr><td align=right>Логин:</td>
    <td align=left><input type=text name=login value=<?=$login?>></td></tr>
    <tr><td align=right>Пароль:</td>
    <td aling=left><input type=password name=password></td></tr>
    
    <tr><td align=right>База:</td>
    <td align=left><input type=text name=database value=<?=$database?>></td></tr>
    <tr><td align=right>Таблица:</td>
    <td align=left><input type=text name=table value=<?=$table?>></td></tr>
    
    <tr><td align=right>Пароль админа:</td>
    <td align=left><input type=password name=pass></td></tr>
    </table>
    <input type=submit name=go value="Install">
    </form>
    
    <?
    function error()
    // Выводим сообщение об ощибке и выходим
    {
      echo "Error #".mysql_errno().": ".mysql_error();
      exit;
    }
    if(isset($go)):// Если пользователь передал параметры
    
    echo "Полключаемся к MySQL...<br>\n";
    mysql_connect($host,$login,$password) or error();
    echo "Выбираем базу данных $database...<br>\n";
    mysql_select_db($database) or error();
    echo "Удаляем таблицу (если существует) $table...<br>\n";
    mysql_query("DROP TABLE IF EXISTS $table") or error();
    
    echo "Создаем новую таблицу $table...<br>\n";
    mysql_query("
      CREATE TABLE $table(
        k_msg int primary key auto_increment,
        guest varchar(20),
        email varchar(40),
        url varchar(60),
        icq varchar(15),
        time int,
        msg mediumtext,
        replay mediumtext
      )") or error();
    // Создадим файл конфигурации и запишим в него
    // параметры подключения и пароль модератороа гостевой
    $f=fopen('gbook.conf','w');
    flock($f,LOCK_EX); // Исключительная блокировка файла
    
    fputs($f,"$host\n$login\n$password\n$database\n$table\n$pass");
    flock($f,LOCK_UN); // Снимаем блокировку с файла
    fclose($f);
    // Создадим файл .htaccess и укажем в нем
    // что поумолчанию нужно открывать файл gbook.php
    $f=fopen('.htaccess','w');
    flock($f,LOCK_EX);
    fputs($f,"DirectoryIndex gbook.php\n");
    flock($f,LOCK_UN);
    fclose($f);
    
    // Установим права на чтение/запись
    // только для владельца
    exec('chmod 600 gbook.conf');
    exec('chmod 600 install.php');
    // Все сделано можно перейти на готовую гостевую
    echo "<b>Инсталяция завершена</b><br>";
    
    echo "<a href=gbook.php>Гостевая книга</a>";
    endif;
    ?>
    </body>
    </html>
          

    Замечание. После создания конфигурационного файла мы выставляем на него права для чтения и записи только для хозяина. Это сделано для того, чтобы злоумышленник не смог прочесть наш файл конфигурации: в нем мы храним параметры подключения к базе данных и пароль модератора гостевой книги. Данная защита будет работать только на Unix/Linux хостинге. Для Windows-хостинга нужна другая защита, но приведенные команды не должны порождать ошибок.

    Этап третьий: отображение гостевой книги

    ЗЗдесь мы рассмотрим скрипт, отображающий нашу гостевую книгу. Мы в нескольких скриптах будем выполнять ряд одинаковых действий и, чтобы не повторяться вынесем их в один файл gbook.lib.

    gbook.lib

    <?
    function htmltrim($str)
    { // Просто для краткости
      return HtmlSpecialChars(trim($str));
    }
    
    function error($msg)
    // Выведм сообщение об ощибке и остановим скрипт
    {
      echo "<b>Ошибка:</b> $msg";
      exit;
    }
    function my_error()
    
    // Ошибка MySQL
    {
      echo "<b>Ошибка MySQL</b> #".mysql_errno().": ".mysql_error()."</b><br>";
      exit;
    }
    
    function my_no_cache()
    // Отключить кеширование страницы
    {
      Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
      Header("Cache-Control: no-cache, must-revalidate");
      Header("Pramga: no-cache");
      Header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); 
    }
    
    function my_redirect($url)
    // Включить перенаправление
    {
      echo '<html><head><meta http-equiv="refresh" content=1>
      <script language=JavaScript>location="'.$url.'"</script></head></html>';
    }
    $MY_MONTH_RU=array('января','февраля','марта','апреля','мая',
      'июня','июля','августа','сентября','октября','ноября','декабря');
    
    function my_date($d)
    // Форматирвание даты
    {
      global $MY_MONTH_RU;
      return date("j ",$d).$MY_MONTH_RU[date("m",$d)-1].date(" Y - H:i:s",$d);
    }
    
    function gbook_init()
    // Инициализация
    {
    // Объявим глобальные переменные
    global $table, $admin;
    // Прочитаем праметры подключения к БД
    $f=@fopen('gbook.conf','r') or error("<b>Нет файла конфигурации</b>");
    flock($f,LOCK_SH);
    $host=trim(fgets($f));
    $login=trim(fgets($f));
    $password=trim(fgets($f));
    $database=trim(fgets($f));
    $table=trim(fgets($f));
    $pass=trim(fgets($f));
    flock($f,LOCK_UN);
    fclose($f);
    
    // Подключаемся к БД
    mysql_connect($host,$login,$password) or my_error();
    mysql_select_db($database) or my_error();
    // Проверим пароль
    if(isset($_GET['sid']) || isset($_POST['sid']) || isset($_COOKIE['sid']))
    {
      if(isset($_POST['sid'])) $sid=$_POST['sid'];
      elseif(isset($_GET['sid'])) $sid=$_GET['sid'];
      else $sid=$_COOKIE['sid'];
      @SetCookie("sid",$sid,time()+60*15);
      $admin=($sid===md5($pass.date('dmYH')));
    }
    }
    my_no_cache();
    ?>

    Итак собственно скрипт отображающий гостевую книгу:

    gbook.php

    <?
    require_once "gbook.lib";
    gbook_init();
    // Выберем все сообщения из таблицы
    // записи сортируем по убыванию времени:
    // от последних сообщений к первым
    
    $r=mysql_query("select k_msg, guest, email, url, icq, time, 
      msg, replay from $table order by time desc") or my_error();
    $pgsz=8; // Количество сообщений на страницу
    $pgbar=''; // Здесь будет сформирован текст ссылок на страницы
    if(!isset($pg))$pg=0; // По умолчанию с первого сообщения
    
    $rows=mysql_num_rows($r); // Число записей = число сообщений
    $pgcnt=$rows/$pgsz; // Число страниц
    // Формируем строку страниц
    for($i=0;$i<$rows;$i+=$pgsz)
      if( ($i>=$pg) && ($i<($pg+$pgsz)) )
        $pgbar.=($i/$pgsz+1);
      else
    
        $pgbar.="<a href=gbook.php?pg=$i>".($i/$pgsz+1)."</a> ";
    ?>
    <html>
    <head>
    
    <title>Гостевая книга</title>
    <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
    </head>
    <body>
    <h2 align=center>Гостевая книга</h2>
    <div align=center><?=$pgbar?></div>
    
    <table width=100% border=1>
    <?
    // Выведем сообщения
    $i=0;
    while($f=mysql_fetch_array($r))
    {
      if( ($i>=$pg) && ($i<($pg+$pgsz)) )
      {
        echo "<tr><td align=center valign=top width=25%>";
        echo htmltrim($f['guest'])."<br>";
        $email=htmltrim($f['email']);
        $href='mailto:'.$email;
        echo "<a href=$href>$email</a><br>";
        $url=htmltrim($f['url']);
        echo "<a href=$url>$url</a><br>";
        echo "ICQ: ".htmltrim($f['icq'])."<br>";
        echo my_date($f['time']);
        echo "</td>";
        $mes=nl2br(htmltrim($f['msg']));
        echo "<td align=left valign=top>$mes";
        $replay=nl2br(htmltrim($f['replay']));
        if($replay):
          echo "<hr>$replay";
        endif;
        echo "</td>";
        if($admin):
          // А это только для адмнистратора
    
          echo "<td width=10% align=center valign=top>";
          // Ссылка для редактирования сообщения
          echo "<a href=replay.php?sid=$sid&id=$f[k_msg]>Ответить</a><br>";
          // Ссылка для удаления сообщения
    
          echo "<a href=drop.php?sid=$sid&id=$f[k_msg]>Удалить</a>";
          echo "</td>";
        endif;
        echo "</tr>";
      }
      $i++;
      if($i>=($pg+$pgsz)) break;
    }
    ?>
    
    </table>
    <div align=center><?=$pgbar?></div>
    <table align=center><tr><td>
    <form action="post.php" name=frm method=post>
    <H2 align=center>Оставьте свое сообщение</H2>
    
    <table>
    <tr><td align=right><b><font color=red>*</font>Имя:</b></td>
    <td><input class=e type=text name=Login size=40></td></tr>
    
    <tr><td align=right><b>e-mail:</b></td>
    <td><input class=e type=text name=Email size=40></td></tr>
    <tr><td align=right><b>URL сайта:</b></td>
    
    <td><input class=e type=text name=Url size=40></td></tr>
    <tr><td align=right><b>ICQ:</b></td>
    <td><input class=e type=text name=Icq size=40></td></tr>
    
    </table>
    <b><font color=red>*</font>Сообщение:</b><br>
    <center>
    <textarea class=t cols=40 rows=8 name=Msg></textarea><br>
    
    <input type=submit value="Отправить">
    </center>
    </form>
    <div align=center><br>gbook 1.0 beta © Золотов Алексей 2005<br>
    
    <a href=http://zolotov.h14.ru>http://zolotov.h14.ru</a>
    </div>
    </body>
    </html>
          

    Вот и все. Это самое основное, осталось сделать панель модерирования гостевой книги, чтобы можно было легко удалять и редактировать оставленные сообщения. Для входа в режим администрирования создадим отдельный скрипт. Когда пользователь вводит пароль, то на основе его и текущей даты генерируется код сессии, если переданный в скрипт код сессии правильный, то считается, что зашел администратор, и ему открываются все возможности.

    admin.php

    <?
    $addr=dirname($SCRIPT_NAME);
    
    if($addr=='/')$addr='/gbook.php'; else $addr.='/gbook.php';
    $addr="http://".$SERVER_NAME.$addr;
    require_once "gbook.lib";
    
    if(isset($pass))
    {
      my_redirect($addr."?sid=".md5($pass.date('dmYH')));
      exit;
    }
    ?>
    <html>
    <head>
    <title>Гостевая книга</title>
    <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
    
    </head>
    <body>
    <H2 align=center>Вход в режим модерирования</H2>
    <form action=admin.php method=post>
    <table align=center><tr><td>
    <b>Введите пароль:</b>
    
    <input type=password name=pass>
    <input type=submit value="Войти">
    </td></tr></table></form>
    <div align=center><br>gbook 1.0 beta © Золотов Алексей 2005<br>
    
    <a href=http://zolotov.h14.ru>http://zolotov.h14.ru</a></div>
    </body>
    </html>
          

    В главном скрипте в режиме адмнистратора мы создали ссылки для редактирования и удаления сообщений. Для начала приведу скрипт для удаления сообщения - он короче.

    drop.php

    <?
    
    require_once "gbook.lib";
    $id=trim($id);
    gbook_init();
    if(!$admin) error("Отказано в доступе");
    if(!$id) error("Незадан идентификатор удаляемого собщения<b>id</b>");
    // Удалим сообщение
    
    mysql_query("delete from $table where k_msg=$id") or my_error();
    $addr=dirname($SCRIPT_NAME);
    if($addr==='/') $addr.='gbook.php'; else $addr.='/gbook.php';
    $addr="http://".$SERVER_NAME.$addr;
    my_redirect($addr);
    echo "<b>Сообщение удалено. <a href=$addr>Назад</a></b>"
    
    ?>      

    А теперь скприпт, отображающий страницу для редактирования сообщения.

    replay.php

    <?
    require_once "gbook.lib";
    $id=trim($id);
    gbook_init();
    if(!$admin) error("Отказано в доступе");
    
    if(!$id) error("Незадан идентификатор редактируемого собщения<b>id</b>");
    $r=mysql_query("select k_msg, guest, email, url, icq, time, msg, replay 
      from $table where k_msg=$id") or my_error();
    if(mysql_num_rows($r)==0) error("Сообщения с id=$id нет в гостевой таблице");
    $f=mysql_fetch_array($r);
    $name=htmltrim($f['guest']);
    $email=htmltrim($f['email']);
    $url=htmltrim($f['url']);
    $icq=htmltrim($f['icq']);
    $msg_n=htmltrim($f['k_msg']);
    $replay=htmltrim($f['replay']);
    $msg=htmltrim($f['msg']);
    $date=my_date($f['time']);
    ?>
    
    <html>
    <head>
    <title>Гостевая книга</title>
    <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
    </head>
    <body>
    <H2 align=center>Редактирование сообщения</H2>
    
    <form action=save.php method=post>
    <table align=center><tr><td>
    <table>
    <tr><th align=right>Имя:</th>
    <td><input class=e type=edit name=Login value='<?=$name?>'></td></tr>
    
    <tr><th align=right>E-Mail:</th>
    <td><input class=e type=edit name=Email value='<?=$email?>'></td></tr>
    <tr><th align=right>ICQ:</th><td>
    
    <input class=e type=edit name=Icq value='<?=$icq?>'></td></tr>
    <tr><th align=right>Сайт:</th><td>
    <input class=e type=edit name=Url value='<?=$url?>'></td></tr>
    
    <tr><th align=right>Дата:</th><td><?=$date?></td></tr>
    </table>
    </td><td>
    <b>Сообщение:</b><br>
    
    <textarea cols=40 rows=10 name=Msg><?=$msg?></textarea><br>
    <b>Ответ:</b><br>
    <textarea cols=40 rows=10 name=Replay><?=$replay?></textarea>
    
    </td></tr></table>
    <input type=hidden name=sid value=<?=$sid?>>
    <input type=hidden name=id value=<?=$msg_n?>>
    <center><input type=submit value='Сохранить'></center>
    </from>
    
    <div align=center><br>gbook 1.0 beta © Золотов Алексей 2005<br>
    <a href=http://zolotov.h14.ru>http://zolotov.h14.ru</a></div>
    
    </body></html>

    Сохранение редактированного сообщения происходит в скрипте save.php

    save.php

    <?
    require_once "gbook.lib";
    $Login=trim($Login);
    $Email=trim($Email);
    $Url=trim($Url);
    $Icq=trim($Icq);
    $Msg=trim($Msg);
    $Replay=trim($Replay);
    $k_msg=trim($id);
    gbook_init();
    if(!$admin) error("Отказано в доступе");
    
    if(!$k_msg) error("Неуказан идентификатор <b>id</b> 
    сохраняемого сообщения");
    if(!$Login || !$Msg) error("Поля <b>Имя</b> и <b>Сообщение</b> 
    должны быть заданы");
    
    // Обновим запись
    mysql_query("update $table set guest='$Login', email='$Email', url='$Url',
      icq='$Icq', msg='$Msg', replay='$Replay' where k_msg=$k_msg")
     or my_error();
    $addr=dirname($SCRIPT_NAME);
    if($addr==='/') $addr.='gbook.php'; else $addr.='/gbook.php';
    $addr="http://".$SERVER_NAME.$addr;
    my_redirect($addr);
    
    echo "<b>Сообщение отправлено. <a href=$addr>Назад</a></b>"
    ?>
          

    Вот и весь скрипт. Осталось только установить и использовать.

    Автор: Золотов Алексей
    Источник: www.zolotov.h14.ru

    главная > статьи >

    Реклама