Создание Гостевой Книги

Вторник, 14 сентября 2010 г.
Рубрика: PHP программирование -> Готовые решения
Метки: |
Просмотров: 10708
Подписаться на комментарии по RSS

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

И ответ Вы можете получить в этом уроке.

В этом уроке мы с Вами создадим гостевую книгу, в которой будет:

Форма для оставления своего сообщения,

Все сообщения оставленные гостями,

Постраничная навигация, во избежания перегрузки страницы,

Страница администратора, позволяющая удалять, редактировать сообщения, менять кол-во сообщений на странице, включать или выключать модерирование сообщений, что позволит размещать сообщения только после их проверки модератором и срывать или показывать сообщения на странице,

Вход на страницу администратора по паролю,

Возможность заходить на страницу администратора, только с указанного IP адреса,

Изменение данных администратора, в том числе и пароля в открытом виде,

И бан лист по IP.

Вот sql-запросы для базы данных, наша база данных будет называться - guestbook:

CREATE TABLE IF NOT EXISTS `adm` (
  `adm_name` varchar(255) NOT NULL,
  `adm_pass` varchar(255) NOT NULL,
  `msg_on_page` int(10) NOT NULL,
  `moder` int(10) NOT NULL,
  `ip_gb` int(10) NOT NULL,
  `ip` varchar(255) NOT NULL,
  `pmsg` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE IF NOT EXISTS `banned` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `ip` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE IF NOT EXISTS `message` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `login` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `site` varchar(255) NOT NULL,
  `text` text NOT NULL,
  `ip` varchar(255) NOT NULL,
  `active` int(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Перейдём к созданию главной страницы гостевой книги, на которой бы выводились все сообщения, была форма добавления сообщения, проверка на численность пользователя в группе бан, которая бы скрывала форму, и что бы все сообщения выводились в постраничной навигации, и если было включено модерирование, то выводились только одобренные сообщения. Для начала создадим файл guestbook.php и в него пропишем этот код, который и будет нашей главной страницей гостевой книги:

<html>
<head>
<title>Гостевая Книга</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<center><h2><tt><b>Гостевая Книга</b></tt></h2></center><br /><br />
<tt>
<!-- Ссылка входа на страницу администратора -->
<div class="entry_adm"><a href="entry.php">&nbsp;Вход&nbsp;</a></div>
<?php
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Кол-во сообщений на странице
 */
$num=$set_row["msg_on_page"];
/**
 * Направление показа сообщений
 */
$ord_msg=$set_row["pmsg"];
/**
 * Если модерирование сообщений включено, то считаем кол-во тех сообщений, которые должны быть видны на странице
 */
if($set_row["moder"]==1){
    /**
     * Считаем кол-во сообщений в базе
     */
    $num_msg_res=mysql_query("SELECT COUNT(*) FROM message WHERE active='1'");
    $num_msg_row=mysql_fetch_array($num_msg_res);
}else{
    $num_msg_res=mysql_query("SELECT COUNT(*) FROM message");
    $num_msg_row=mysql_fetch_array($num_msg_res);
}
/**
 * Присваиваем кол-во сообщений переменной
 */
$numb_msg=$num_msg_row[0];
/**
 * Если в базе есть сообщения, то работаем с ними
 */
if($numb_msg!=0){
/**
 * Расчитываем кол-во страниц
 */
$num_page=intval((($numb_msg - 1)/$num)+1);
/**
 * Записываем в переменную переданный номер страницы
 */
@$page=$_GET["page"];
/**
 * Если нет переданных данных, или они меньше 0, то присваиваем переменной номер страницы 1
 */
if(empty($page)or($page<0)){
$page=1;
}
/**
 * Если номер страницы больше реального номера страниц, то присваиваем переменной номер последней страницы
 */
if($page>$num_page){
$page=$num_page;
}
/**
 * Расчитываем с какого сообщения выводить
 */
$begin=($page*$num)-$num;
if($set_row["moder"]==1){
/**
 * Вытаскиваем сообщения из таблицы, строго по такому порядку, по которому их расчитали 
 */
$result=mysql_query("SELECT * FROM message WHERE active='1' ORDER BY id $ord_msg LIMIT $begin, $num");
$myrow=mysql_fetch_array($result);
}else{
/**
 * Вытаскиваем сообщения из таблицы, строго по такому порядку, по которому их расчитали 
 */
$result=mysql_query("SELECT * FROM message ORDER BY id $ord_msg LIMIT $begin, $num");
$myrow=mysql_fetch_array($result);
}
/**
 * Если сообщения есть, то выводим их
 */
if(!empty($myrow["id"])){
/**
 * Выводим все сообщения в цикле
 */
do{
    /**
      * Если есть email, то создаём ссылку
      */
    if(!empty($myrow["email"])){
        $email="<a href='mailto:".$myrow["email"]."'>email</a>";
    }else{
        $email='';
    }
    /**
      * Если есть адрес сайта, то создаём ссылку
      */
    if(!empty($myrow["site"])){
        $site="<a href='".$myrow["site"]."'>сайт</a>";
    }else{
        $site='';
    }
    /**
      * Выводим сообщение
      */
    echo "<div class='view_msg'>
          <code><b class='who_add'>".$myrow["login"]."</b> $email $site</code><br />
          ".$myrow["text"]."
          </div><br /><br />";
}while($myrow=mysql_fetch_array($result));
}else{
    echo "<center>Сообщений пока нет</center>";
}
/**
 * Если передались данные о успешном добавлении, то обрабатываем их
 */
if(isset($_GET["msg"])and($_GET["msg"]!=='')){
    $msg=$_GET["msg"];
    /**
     * Если переданные данные являются числом, то выводим сообщение о успешном добавлении
     */
    if(preg_match('/[0-9]/', $msg)){
        echo "<center><b>Ваше сообщение было добавлено</b></center>";
    }else{
        echo "<font color='#cc0000'><center><b>Переданные данные не верны!</b></center></font>";
    }
}else{
    /**
     * Если модерирование сообщений включено, то после добавления сообщения выводим строку о том, что наше сообщение будет добавлено только после проверки модератором
     */
    if(isset($_GET["moder"])and($_GET["moder"]!=='')){
        $mod=$_GET["moder"];
        if(preg_match('/[0-9]/', $mod)){
            echo "<center><b>Ваше сообщение будет добавлено после проверки модератором</b></center>";
        }
    }
}
/**
 * Выводим ссылки постраничной навигации, начиная цикл от 1, и до кол-ва сообщений
 */
for ($i=1; $i<=$num_page; $i++){
    echo "&nbsp;<a href='guestbook.php?page=$i' class='navigat'>&nbsp;$i&nbsp;</a>";
}
}else{
    echo "<center>Сообщений пока нет</center>";
}
?>
<br /><br />
Оставьте своё сообщение:<br /><br />
<?php
/**
 * Записываем ip пользователя в переменную
 */
$ip=$_SERVER["REMOTE_ADDR"];
/**
 * Проверяем есть ли пользователь с таким ip в группе БАН
 */
$bans=mysql_query("SELECT * FROM banned WHERE ip='$ip'", $db);
$banr=mysql_fetch_array($bans);
/**
 * Если нет, то выводим форму для добавления сообщения, а если есть, то выводим сообщение о том, что он находится в группе бан
 */
if(empty($banr["id"])){
echo "<form action='add_guest_msg.php' method='post'>
Имя<br />
<input type='text' name='login' class='text'/><br /><br />
E-mail<br />
<input type='text' name='email' class='text'/><br /><br />
Сайт<br />
<input type='text' name='site' class='text' value='http://'/><br /><br />
Сообщение<br />
<textarea rows='6' cols='60' name='msg' class='text'></textarea><br /><br />
<input type='submit' name='submit' value='отправить' class='button'/>
</form>";
}else{
    echo "<center><font color='#cc0000'><b>Пользователи находящиеся в группе БАН, не могут оставлять сообщения</b></font></center>";
}
?>
</tt>
</body>
</html>

Все описания Вы можете видеть в коде, а если что-то не понятно, то можно прочитать предыдущие уроки по php, там всё описанно. Теперь создадим файл стилей style.css, и сохраним в туже папку, где будет находиться наша гостевая книга. В нём пропишим сразу все стили для всех блоков, и т.п.:

/* Задаём стиль для текстовых полей */
.text {
    border: 1px solid #999999; /* Устанавливаем серую рамку полей */
    font-size: 1.0em; /* Задаём размер шрифта */
    color: #999999; /* Задаём цвет шрифта */
}
/* Задаём стиль для активных текстовых полей */
.text:hover{
    border-color: #0099ff; /* Изменяем цвет рамки полей */
}
/* Задаём стиль для полей во время ввода */
.text:focus{
    border-color: #0099ff; /* Изменяем цвет рамки */
    color: #000000; /* Изменяем цвет шрифта */
}
/* Задаём стиль для кнопки */
.button {
    border: 1px solid #0099ff; /* Устанавливаем размер, тип и цвет рамки кнопки */
    background-color: #0099ff; /* Задаём фон кнопки */
    color: #fafafa; /* Задаём цвет шрифта */
    font-size: 0.80em; /* Задаём размер шрифта */
    font-family: sans-serif; /* Задаём рубленый шрифт */
}
/* Задаём стиль для блока с сообщением */
.view_msg {
    border: 1px solid #0099ff; /* Задаём рамку блоку */
    padding: 10px; /* Делаем внутренний отступ */
    display: block; /* Делаем блок */
}
/* Задаём стиль для ссылки */
a{
    font-size: 1.0em; /* Задаём размер шрифта */
    color: #000000; /* Задаём цвет шрифта */
    text-decoration: underline; /* Делаем подчёркнутый текст */
}
/* Задаём стиль для ссылки, на которой находится курсор мыши */
a:hover{
    text-decoration: none; /* Убираем подчёркивание текста */
}
/* Задаём стиль для данных о пользователе, который написал сообщение */
code{
    border-bottom: 1px solid #0099ff; /* Делаем нижнее подчёркивание */
    display: block; /* Делаем блок, для задания ширины во весь экран */
    padding: 2px; /* Делаем внутренний отступ от нижний линии */
}
/* Задаём стиль для ссылки входа */
.entry_adm a{
    border-top: 1px solid #0099ff; /* Верхняя рамка */
    border-right: 1px solid #0099ff; /* Правая рамка */
    border-left: 1px solid #0099ff; /* Левая рамка */
    color: #000000; /* Цвет шрифта */
    text-decoration: none; /* Убираем подчёркивание текста */
}
/* Задаём стиль для ссылки входа, когда на ней находится курсор мыши */
.entry_adm a:hover{
    color: #fafafa; /* Изменяем цвет шрифта */
    background-color: #0099ff; /* Задаём фон под ссылкой */
}
/* Задаём стиль для навигационных ссылок */
.navigat {
    border: 1px solid #0099ff; /* Задаём рамку */
    color: #000000; /* Устанавливаем стиль шрифта */
    text-decoration: none; /* Убираем черту под текстом */
}
/* Задаём стиль для навигационных ссылок, когда над ними находится курсор мыши */
.navigat:hover{
    background-color: #0099ff; /* Изменяем цвет фона */
    color: #fafafa; /* Задаём цвет шрифта */
}
/* Задаём стиль для названия настройки в настройках Гостевой Книги */
.name_setting {
    display: block; /* Делаем блок */
    border-bottom: 1px solid #0099ff; /* Задаём нижнюю рамку */
}
/* Задаём стиль для блоков с настройками Гостевой */
.info {
    margin: 20px; /* Делаем внешний отступ */
    padding: 15px; /* Делаем внутренний отступ */
    border: 1px solid #0099ff; /* Задаём рамку снаружи */
}
/* Задаём стиль для выпадающего списка */
.option {
    border: 1px solid #0099ff; /* Задаём цвет рамки */
}
/* Задаём стиль для ссылки на разбан */
.unban a{
    border-top: 1px solid #999999; /* Верхняя рамка */
    border-right: 1px solid #999999; /* Правая рамка */
    border-left: 1px solid #999999; /* Левая рамка */
    color: #999999; /* Цвет шрифта */
    text-decoration: none; /* Убираем подчёркивание текста */
}
/* Задаём стиль для ссылки на разбан, когда на ней находится курсор */
.unban a:hover{
    border-top: 1px solid #0099ff; /* Верхняя рамка */
    border-right: 1px solid #0099ff; /* Правая рамка */
    border-left: 1px solid #0099ff; /* Левая рамка */
    color: #fafafa; /* Изменяем цвет шрифта */
    background-color: #0099ff; /* Задаём фон под ссылкой */
}

Дальше нам нужно создать обработчик, который бы принимал все данные из формы добавления сообщения, и добавлял бы их в базу, а также если было включено модерирование сообщений, то добавлял бы их скрытыми до проверки модератором. Для этого создадим файл add_guest_msg.php, и в нём пропишем весь следующий код:

<?php
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Если включено модерирование, то сообщение будет добавлено как скрытое сообщение
 */
if($set_row["moder"]==1){
    $active=0;
    $msg="&&moder=1";
}else{
    $active=1;
}
/**
 * Обрабатываем переданное имя
 */
if(isset($_POST["login"])and($_POST["login"]!=='')){
    $login=$_POST["login"];
    $login=trim($login);
    $login=htmlspecialchars($login);
    $login=stripslashes($login);
}else{
    die("Вы не ввели имя");
}
/**
 * Обрабатываем переданный email
 */
if(isset($_POST["email"])and($_POST["email"]!=='')){
    $email=$_POST["email"];
    $email=trim($email);
    $email=htmlspecialchars($email);
    $email=stripslashes($email);
    if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)){
        die("Ваш email адрес введён не корректно");
    }
}
/**
 * Обрабатываем переданный адрес сайта
 */
if(isset($_POST["site"])and($_POST["site"]!=='')){
    $site=$_POST["site"];
    $site=trim($site);
    $site=htmlspecialchars($site);
    $site=stripslashes($site);
}
/**
 * Обрабатываем переданный текст сообщения
 */
if(isset($_POST["msg"])and($_POST["msg"]!=='')){
    $msg=$_POST["msg"];
    $msg=trim($msg);
    $msg=htmlspecialchars($msg);
    $msg=stripslashes($msg);
}else{
    die("Вы не ввели текст сообщения");
}
/**
 * Присваиваем переменной IP пользователя
 */
$ip=$_SERVER["REMOTE_ADDR"];
/**
 * Проверяем есть ли пользователь с таким ip в группе БАН
 */
$bans=mysql_query("SELECT * FROM banned WHERE ip='$ip'", $db);
$banr=mysql_fetch_array($bans);
/**
 * Если есть, то выводим сообщение, если нет, то добавляем сообщение в базу
 */
if(!empty($banr["id"])){
    die("<center><font color='#cc0000'><b>Пользователи находящиеся в группе БАН, не могут оставлять сообщения</b></font></center>");
}
/**
 * Добавляем в базу сообщение
 */
$ins=mysql_query("INSERT INTO message (login, email, site, text, ip, active) VALUES ('$login', '$email', '$site', '$msg', '$ip', '$active')", $db);
/**
 * Если успешно добавили сообщение, то делаем редирект на главную страницу
 */
if($ins=='true'){
    if($set_row["moder"]==1){
        echo "<html><head><meta http-equiv='Refresh' content='0; URL=guestbook.php?moder=1'></head></html>";
    }else{
        echo "<html><head><meta http-equiv='Refresh' content='0; URL=guestbook.php?msg=1'></head></html>";
    }
}else{
    die("Ваше сообщение добавить не удалось");
}

Наша гостевая книга готова к добавлению на неё сообщений, но в ней нет самого главного - страницы администратора. Для этого сначала нужно создать страницу входа - entry.php:

<?php
session_start();
?>
<html>
<head>
<title>Гостевая Книга</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<tt>
<?php
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Если мы нажали кнопку, то делаем обработки
 */
if(isset($_POST["submit"])){
/**
 * Обрабатываем переданные данные логина через форму
 */
if(isset($_POST["login"])and($_POST["login"]!=='')){
    $login=$_POST["login"];
    $login=trim($login);
    $login=htmlspecialchars($login);
    $login=stripslashes($login);
}else{
    die("Вы не ввели имя");
}
/**
 * Обрабатываем переданные данные пароля через форму
 */
if(isset($_POST["pass"])and($_POST["pass"]!=='')){
    $pass=$_POST["pass"];
    $pass=trim($pass);
    $pass=htmlspecialchars($pass);
    $pass=stripslashes($pass);
}else{
    die("Вы не ввели пароль");
}
/**
 * Вытаскиваем из базы реальные данные админа
 */
$adm_res=mysql_query("SELECT * FROM adm", $db);
$adm_row=mysql_fetch_array($adm_res);
/**
 * Если данные верны, то создаём сессию с именем и паролём админа, и делаем редирект на страницу администратора
 */
if(($login==$adm_row["adm_name"])and($pass==$adm_row["adm_pass"])){
    $_SESSION["adm_name"]=$login;
    $_SESSION["adm_pass"]=$pass;
    echo "<html><head><meta http-equiv='Refresh' content='0; URL=adm.php'></head></html>";
}else{
    die("Вы не верно ввели данные");
}
}else{
echo "<center><h2><b>Гостевая Книга</b></h2><br /><br />
<form method='post' action='entry.php'>
Имя<br />
<input type='text' name='login' class='text'/><br /><br />
Пароль<br />
<input type='password' name='pass' class='text'/><br /><br />
<input type='submit' name='submit' value='войти' class='button'/>
</form>
</center>
</tt>
</body>
</html>";
}

Эта страница будет выдавать форму входа, получать данные из формы, сравнивать их с реальными данными, и если всё будет верно, то создаст сессии, и сделает редирект на страницу администратора. Далее нам нужно создать страницу администратора, на которой:

Выводились все сообщения в постраничной навигации.

Определялось бы скрытое сообщение или нет, и выводилась соответствующая кнопка для скрытия или показа.

Выводились кнопки для удаления сообщения и их редактирования.

Определялось не состоит ли пользователь добавивший сообщение в бан списке, и выводилось бы сообщение о разбане и добавления в бан.

Теперь создадим файл adm.php:

<?php
session_start();
?>
<html>
<head>
<title>Гостевая Книга</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<center><h2><tt><b>Гостевая Книга</b></tt></h2></center><br /><br />
<tt>
<!-- Ссылка входа на выход из страницы администратора и настройки гостевой книги -->
<tt class="entry_adm"><a href="exit.php">&nbsp;Выход&nbsp;</a></tt>&nbsp;<tt class="entry_adm"><a href="settings.php">&nbsp;Настройки&nbsp;</a></tt>
<?php
if(isset($_SESSION["adm_name"]) and isset($_SESSION["adm_pass"])){
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Проверяем ip адрес пользователя вошедшого на страницу администратора
 */
if(!empty($set_row["ip_gb"])){
    if($set_row["ip"]!==$_SERVER["REMOTE_ADDR"]){
        die("<center><font color='#cc0000'><b>Ошибка!<br />Вы зашли в страницу администратора не с оригинального ip адреса!</b></font></center>");
    }
}
/**
 * Кол-во сообщений на странице
 */
$num=$set_row["msg_on_page"];
/**
 * Направление показа сообщений
 */
$ord_msg=$set_row["pmsg"];
/**
 * Считаем кол-во сообщений в базе
 */
$num_msg_res=mysql_query("SELECT COUNT(*) FROM message");
$num_msg_row=mysql_fetch_array($num_msg_res);
/**
 * Присваиваем кол-во сообщений переменной
 */
$numb_msg=$num_msg_row[0];
/**
 * Если в базе есть сообщения, то работаем с ними
 */
if($numb_msg!=0){
/**
 * Расчитываем кол-во страниц
 */
$num_page=intval((($numb_msg - 1)/$num)+1);
/**
 * Записываем в переменную переданный номер страницы
 */
@$page=$_GET["page"];
/**
 * Если нет переданных данных, или они меньше 0, то присваиваем переменной номер страницы 1
 */
if(empty($page)or($page<0)){
$page=1;
}
/**
 * Если номер страницы больше реального номера страниц, то присваиваем переменной номер последней страницы
 */
if($page>$num_page){
$page=$num_page;
}
/**
 * Расчитываем с какого сообщения выводить
 */
$begin=($page*$num)-$num;
/**
 * Вытаскиваем сообщения из таблицы, строго по такому порядку, по которому их расчитали 
 */
$result=mysql_query("SELECT * FROM message ORDER BY id $ord_msg LIMIT $begin, $num");
$myrow=mysql_fetch_array($result);
/**
 * Если сообщения есть, то выводим их
 */
if(!empty($myrow["id"])){
/**
 * Выводим все сообщения в цикле
 */
do{
    /**
      * Если есть email, то создаём ссылку
      */
    if(!empty($myrow["email"])){
        $email="<a href='mailto:".$myrow["email"]."'>email</a>";
    }else{
        $email='';
    }
    /**
      * Если есть адрес сайта, то создаём ссылку
      */
    if(!empty($myrow["site"])){
        $site="<a href='".$myrow["site"]."'>сайт</a>";
    }else{
        $site='';
    }
    /**
     * Присваиваем переменной ip адрес пользователя, оставившего сообщения
     */
    $ipb=$myrow["ip"];
    /**
     * Проверяем есть ли пользователь с таким ip в группе БАН
     */
    $res_ip=mysql_query("SELECT * FROM banned WHERE ip='$ipb'", $db);
    $row_ip=mysql_fetch_array($res_ip);
    /**
     * Если пользователь есть в группе бан, то будем выводить ссылку разбанить, а если нет, то забанить
     */
    if(!empty($row_ip["id"])){
        $tbanned="Разбанить";
        $class_ban="unban";
    }else{
        $tbanned="Забанить";
        $class_ban="entry_adm";
    }
    /**
     * Если модерирование выключено, то ни чего не выводим
     */
    if($set_row["moder"]==0){
        $linkm='';
    }else{
        /**
         * Если модерирование включено, то выводим ссылку на скрыть или показать сообщение
         */
        if($myrow["active"]==0){
        $linkm="&nbsp;<tt class='entry_adm'><a href='moder.php?id=".$myrow["id"]."'>&nbsp;Показать&nbsp;</a></tt>";
        }else{
            $linkm="&nbsp;<tt class='entry_adm'><a href='moder.php?id=".$myrow["id"]."'>&nbsp;Скрыть&nbsp;</a></tt>";
        }
    }
    /**
      * Выводим сообщение
      */
    echo "<div class='view_msg'>
          <code><b class='who_add'>".$myrow["login"]."</b> $email $site <tt class='entry_adm'><a href='del.php?id=".$myrow["id"]."'>&nbsp;Х&nbsp;</a></tt>&nbsp;<tt class='entry_adm'><a href='edit.php?id=".$myrow["id"]."'>&nbsp;Редактировать&nbsp;</a></tt>$linkm&nbsp;<tt class='$class_ban'><a href='ban.php?ip=".$myrow["ip"]."'>&nbsp;$tbanned&nbsp;</a></tt></code><br />
          ".$myrow["text"]."
          </div><br /><br />";
}while($myrow=mysql_fetch_array($result));
}else{
    echo "<center>Сообщений пока нет</center>";
}
/**
 * Если передались данные о успешном добавлении, то обрабатываем их
 */
if(isset($_GET["msg"])and($_GET["msg"]!=='')){
    $msg=$_GET["msg"];
    /**
     * Если переданные данные являются числом, то выводим сообщение о успешном добавлении
     */
    if(preg_match('/[0-9]/', $msg)){
        echo "<center><b>Ваше сообщение было добавлено</b></center>";
    }else{
        echo "<font color='#cc0000'><center><b>Переданные данные не верны!</b></center></font>";
    }
}
/**
 * Выводим ссылки постраничной навигации, начиная цикл от 1, и до кол-ва сообщений
 */
for ($i=1; $i<=$num_page; $i++){
    echo "&nbsp;<a href='adm.php?page=$i' class='navigat'>&nbsp;$i&nbsp;</a>";
}
}else{
    echo "<center>Сообщений пока нет</center>";
}
}else{
    echo "<html><head><meta http-equiv='Refresh' content='0; URL=entry.php'></head></html>";
}
?>
</tt>
</body>
</html>

Отлично, у нас есть страница администратора, но теперь надо создать страницу выхода из админ-части. Для этого создадим файл exit.php:

<?php
session_start();
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Проверяем ip адрес пользователя вошедшего на страницу администратора
 */
if(!empty($set_row["ip_gb"])){
    if($set_row["ip"]!==$_SERVER["REMOTE_ADDR"]){
        die("<center><font color='#cc0000'><b>Ошибка!<br />Вы зашли в страницу администратора не с оригинального ip адреса!</b></font></center>");
    }
}
/**
 * Если мы когда-то вошли на страницу администратора, то удаляем сессию для выхода
 */
if(isset($_SESSION["adm_name"]) and isset($_SESSION["adm_pass"])){
    unset($_SESSION["adm_name"]);
    unset($_SESSION["adm_pass"]);
    echo "<html><head><meta http-equiv='Refresh' content='0; URL=guestbook.php'></head></html>";
}else{
    die("Вы не вошли");
}

Создадим страницу, которая принимала бы id сообщения, и удаляла бы его из базы - сохраним её как del.php:

<?php
session_start();
if(isset($_SESSION["adm_name"]) and isset($_SESSION["adm_pass"])){
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Проверяем ip адрес пользователя вошедшого на страницу администратора
 */
if(!empty($set_row["ip_gb"])){
    if($set_row["ip"]!==$_SERVER["REMOTE_ADDR"]){
        die("<center><font color='#cc0000'><b>Ошибка!<br />Вы зашли в страницу администратора не с оригинального ip адреса!</b></font></center>");
    }
}
/**
 * Если передали id, то обрабатываем его
 */
if(isset($_GET["id"])and($_GET["id"]!=='')){
    $id=$_GET["id"];
    /**
     * Проверяем число ли id или нет
     */
    if(preg_match('/[1-9]{1,10}/', $id)){
        /**
         * Если id число, то удаляем сообщение с этим номером из базы
         */
        $del=mysql_query("DELETE FROM message WHERE id='$id'", $db);
        if($del=='true'){
            echo "<html><head><meta http-equiv='Refresh' content='0; URL=adm.php'></head></html>";
        }else{
            die("Сообщение удалить не удалось");
        }
    }else{
        die("Не верный параметр");
    }
}else{
    die("Вы не выбрали сообщение");
}
}else{
    echo "<html><head><meta http-equiv='Refresh' content='0; URL=entry.php'></head></html>";
}

Нам потребуется также страница для редактирования сообщения, которая выводила бы форму редактирования, и примала бы данные и обновляла бы их в базе, сохраним такую страницу как edit.php:

<?php
session_start();
?>
<html>
<head>
<title>Гостевая Книга</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<center><h2><tt><b>Гостевая Книга</b></tt></h2></center><br /><br />
<tt>
<!-- Ссылка входа на выход из страницы администратора и настройки гостевой книги -->
<a href="exit.php" class="navigat">&nbsp;Выход&nbsp;</a>&nbsp;<a href="adm.php" class="navigat">&nbsp;Страница администратора&nbsp;</a><br /><br />
<?php
if(isset($_SESSION["adm_name"]) and isset($_SESSION["adm_pass"])){
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Проверяем ip адрес пользователя вошедшого на страницу администратора
 */
if(!empty($set_row["ip_gb"])){
    if($set_row["ip"]!==$_SERVER["REMOTE_ADDR"]){
        die("<center><font color='#cc0000'><b>Ошибка!<br />Вы зашли в страницу администратора не с оригинального ip адреса!</b></font></center>");
    }
}
/**
 * Если мы нажали на кнопку нашей формы с редактированием сообщения, то принимаем данные
 */
if(isset($_POST["save_edit"])){
/**
 * Обрабатываем переданное имя
 */
if(isset($_POST["login"])and($_POST["login"]!=='')){
    $login=$_POST["login"];
    $login=trim($login);
    $login=htmlspecialchars($login);
    $login=stripslashes($login);
}else{
    die("Вы не ввели имя");
}
/**
 * Обрабатываем переданный email
 */
if(isset($_POST["email"])and($_POST["email"]!=='')){
    $email=$_POST["email"];
    $email=trim($email);
    $email=htmlspecialchars($email);
    $email=stripslashes($email);
    if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)){
        die("Ваш email адрес введён не корректно");
    }
}
/**
 * Обрабатываем переданный адрес сайта
 */
if(isset($_POST["site"])and($_POST["site"]!=='')){
    $site=$_POST["site"];
    $site=trim($site);
    $site=htmlspecialchars($site);
    $site=stripslashes($site);
}
/**
 * Обрабатываем переданный текст сообщения
 */
if(isset($_POST["msg"])and($_POST["msg"]!=='')){
    $msg=$_POST["msg"];
    $msg=trim($msg);
    $msg=htmlspecialchars($msg);
    $msg=stripslashes($msg);
}else{
    die("Вы не ввели текст сообщения");
}
/**
 * Если было передано id, то обрабатываем его
 */
if(isset($_POST["id"])and($_POST["id"]!=='')){
    $id=$_POST["id"];
    if(!preg_match('/[1-9]{1,10}/', $id)){
        die("Переданные данные не корректны");
    }
}else{
    die("Вы не выбрали сообщение");
}
/**
 * Обновляем сообщение в базе
 */
$update=mysql_query("UPDATE message SET login='$login', email='$email', site='$site', text='$msg' WHERE id='$id'", $db);
if($update=='true'){
    echo "<center><b>Ваше сообщение успешно обновлено</b></center>";
}else{
    echo "<center><b>Ваше сообщение обновить не удалось</b></center>";
}
}else{
        /**
         * Если мы не нажали на кнопку, то выводим форму для редактирования сообщения
         */
        if(isset($_GET["id"])and($_GET["id"]!=='')){
            $id=$_GET["id"];
            if(preg_match('/[1-9]{1,10}/', $id)){
                $res=mysql_query("SELECT * FROM message WHERE id='$id'", $db);
                $row=mysql_fetch_array($res);
                if(!empty($row["id"])){
                    echo "<div class='info'><form method='post' action='edit.php' class='form'>
                          Имя<br />
                          <input type='text' name='login' class='text' value='".$row["login"]."'/><br /><br />
                          E-mail<br />
                             <input type='text' name='email' class='text' value='".$row["email"]."'/><br /><br />
                          Сайт<br />
                          <input type='text' name='site' class='text'  value='".$row["site"]."'/><br /><br />
                          Сообщение<br />
                          <textarea rows='6' cols='60' name='msg' class='text'>".$row["text"]."</textarea><br /><br />
                          <input type='hidden' name='id' value='".$row["id"]."'/>
                          <input type='submit' name='save_edit' value='сохранить' class='button'/>
                          </form></div>"; 
                }else{
                    die("Сообщения, которое Вы запросили, не существует");
                }
            }else{
                die("Переданные параметры не корректны");
            }
        }else{
            die("Вы не выбрали сообщение для редактирования");
        }
    }
}else{
    echo "<html><head><meta http-equiv='Refresh' content='0; URL=entry.php'></head></html>";
}
?>
</tt>
</tt>
</body>
</html>
Нам ещё нужно создать страницу для скрытия и показа сообщений при включённой модерации, то есть эта страница могла скрыть или показать сообщение путём обновления данных в базе. Создадим такую страницу как moder.php:

<php
session_start();
?>
<html>
<head>
<title>Гостевая Книга</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<center><h2><tt><b>Гостевая Книга</b></tt></h2></center><br /><br />
<tt>
<!-- Ссылка входа на выход из страницы администратора и настройки гостевой книги -->
<a href="exit.php" class="navigat">&nbsp;Выход&nbsp;</a>&nbsp;<a href="adm.php" class="navigat">&nbsp;Страница администратора&nbsp;</a><br /><br />
<?php
if(isset($_SESSION["adm_name"]) and isset($_SESSION["adm_pass"])){
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Проверяем ip адрес пользователя вошедшого на страницу администратора
 */
if(!empty($set_row["ip_gb"])){
    if($set_row["ip"]!==$_SERVER["REMOTE_ADDR"]){
        die("<center><font color='#cc0000'><b>Ошибка!<br />Вы зашли в страницу администратора не с оригинального ip адреса!</b></font></center>");
    }
}
/**
 * Если в базе есть настройки, то выводим их
 */
if($set_row["id"]!==''){
    if(isset($_GET["id"])and($_GET["id"]!=='')){
        $id=$_GET["id"];
        if(preg_match('/[1-9]{1,10}/', $id)){
            $sel=mysql_query("SELECT * FROM message WHERE id='$id'", $db);
            $row=mysql_fetch_array($sel);
            if(!empty($row["id"])){
                if($row["active"]==0){
                    $update=mysql_query("UPDATE message SET active='1' WHERE id='$id'", $db);
                }else{
                    $update=mysql_query("UPDATE message SET active='0' WHERE id='$id'", $db);
                }
                    echo "<html><head><meta http-equiv='Refresh' content='0; URL=adm.php'></head></html>";
            }else{
                die("Сообщения, которое Вы запросили, не существует");
            }
        }else{
            die("Переданные данные не корректно");
        }
    }else{
        die("Вы не выбрали сообщение");
    }
}else{
    die("База Данных повреждена, восстановите все данные из оригинальной копии Гостевой Книги");
}
}else{
    echo "<html><head><meta http-equiv='Refresh' content='0; URL=entry.php'></head></html>";
}
?>
</tt>
</tt>
</body>
</html>

И нам также потребуется страница для бана пользователя, эта страница определяла бы есть ли пользователя в бан списке, и если есть то разбанивала бы его, а если нет, то банила. Сохраним такую страницу как ban.php:

<?php
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Обрабатываем переданное имя
 */
if(isset($_GET["ip"])and($_GET["ip"]!=='')){
    $ip=$_GET["ip"];
    $ip=trim($ip);
    $ip=htmlspecialchars($ip);
    $ip=stripslashes($ip);
}else{
    die("Вы не выбрали пользователя с нужным ip");
}
/**
 * Проверяем есть ли пользователь с таким ip в группе БАН
 */
$bans=mysql_query("SELECT * FROM banned WHERE ip='$ip'", $db);
$banr=mysql_fetch_array($bans);
/**
 * Если есть, то удаляем его с этой группы, а если нет, то заносим его туда
 */
if(!empty($banr["id"])){
    $del=mysql_query("DELETE FROM banned WHERE ip='$ip'", $db);
    if($del=='true'){
        echo "<html><head><meta http-equiv='Refresh' content='0; URL=adm.php'></head></html>";
    }else{
        die ("Удалить пользователя с группы БАН не удалось");
    }
}else{
    $ins=mysql_query("INSERT INTO banned (ip) VALUES ('$ip')", $db);
    if($ins=='true'){
        echo "<html><head><meta http-equiv='Refresh' content='0; URL=adm.php'></head></html>";
    }else{
        die ("Добавить пользователя в группу БАН не удалось");
    }
}

Нам ещё нужна страница, которая выводила бы все настройки гостевой книги и позволяла бы их редактировать, создадим страницу settings.php:

<?php
session_start();
?>
<html>
<head>
<title>Гостевая Книга</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<center><h2><tt><b>Гостевая Книга</b></tt></h2></center><br /><br />
<tt>
<!-- Ссылка входа на выход из страницы администратора и настройки гостевой книги -->
<a href="exit.php" class="navigat">&nbsp;Выход&nbsp;</a>&nbsp;<a href="adm.php" class="navigat">&nbsp;Страница администратора&nbsp;</a><br /><br />
<?php
if(isset($_SESSION["adm_name"]) and isset($_SESSION["adm_pass"])){
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Проверяем ip адрес пользователя вошедшого на страницу администратора
 */
if(!empty($set_row["ip_gb"])){
    if($set_row["ip"]!==$_SERVER["REMOTE_ADDR"]){
        die("<center><font color='#cc0000'><b>Ошибка!<br />Вы зашли в страницу администратора не с оригинального ip адреса!</b></font></center>");
    }
}
/**
 * Если в базе есть настройки, то выводим их
 */
if($set_row["id"]!==''){
    if(isset($_GET["save"])and($_GET["save"]!=='')){
        $save=$_GET["save"];
        if(preg_match('/[1-2]/', $save)){
            if($save==1){
                echo "<center><b>Данные успешно обновлены</b></center>";
            }else{
                echo "<center><b>Данные обновить не удалось</b></center>";
            }
        }else{
            echo "<center><b>Переданные данные не корректны</b></center>";
        }
    }
    echo "<tt class='name_setting'>Данные администратора</tt><br />";
    echo "<div class='info'>
    <form method='post' action='save.php'>
    Имя<br />
    <input type='text' name='login' value='".$set_row["adm_name"]."' class='text'/><br /><br />
    Пароль<br />
    <input type='text' name='pass' value='".$set_row["adm_pass"]."' class='text'/><br /><br />
    </div><br />";
    echo "<tt class='name_setting'>Параметры отображения сообщений на странице</tt><br />";
    echo "<div class='info'>
    Кол-во сообщений на странице<br />
    <input type='text' name='mop' value='".$set_row["msg_on_page"]."' class='text'/><br /><br />
    Направление показа сообщений<br />
    <select name='pmsg' class='option'>";
    if ($set_row["pmsg"]=='DESC'){
        echo "<option value='ASC'>От первого</option>
              <option value='DESC' selected>От последнего</option>";
    }else{
        echo "<option value='ASC' selected>От первого</option>
              <option value='DESC'>От последнего</option>";
    }
    echo "</select>
    </div>";
    echo "<tt class='name_setting'>Настройки Гостевой Книги</tt><br />";
    echo "<div class='info'>
    Модерирование сообщений<br />
    <select name='moder'  class='option'>";
    if ($set_row["moder"]==1){
        echo "<option value='1' selected>Да</option>
              <option value='0'>Нет</option>";
    }else{
        echo "<option value='1'>Да</option>
              <option value='0' selected>Нет</option>";
    }
    echo "</select><br /><br />
    Вход на страницу администратора только с указанного IP адреса<br />";
    if ($set_row["ip_gb"]==1){
        echo "<input name='ip_gb' type='checkbox' value='1' checked>Да&nbsp;<input type='text' name='ip' value='".$set_row["ip"]."' class='text'/>&nbsp;Ваш IP адрес";
    }else{
        echo "<input name='ip_gb' type='checkbox' value='1'>Да&nbsp;<input type='text' name='ip' value='".$_SERVER["REMOTE_ADDR"]."' class='text'/>&nbsp;Ваш IP адрес";
    }
    echo "<br /><br />
    <tt class='name_setting'>&nbsp;</tt><br />
    <input type='submit' name='save' value = 'сохранить' class='button'/>
    </form>
    </div>";
}else{
    die("База Данных повреждена, восстановите все данные из оригинальной копии Гостевой Книги");
}
}else{
    echo "<html><head><meta http-equiv='Refresh' content='0; URL=entry.php'></head></html>";
}
?>
</tt>
</tt>
</body>
</html>

А теперь создадим страницу, которая принимала бы данные со страницы настроек, и обновляла бы их в базе, то есть создадим страницу save.php:

<?php
session_start();
if(isset($_SESSION["adm_name"]) and isset($_SESSION["adm_pass"])){
/**
 * Подключаемся к базе
 */
$db=mysql_connect("localhost", "root", "");
mysql_select_db("guestbook", $db);
/**
 * Вытаскиваем все настройки из базы
 */
$set_res=mysql_query("SELECT * FROM adm", $db);
$set_row=mysql_fetch_array($set_res);
/**
 * Проверяем ip адрес пользователя вошедшого на страницу администратора
 */
if(!empty($set_row["ip_gb"])){
    if($set_row["ip"]!==$_SERVER["REMOTE_ADDR"]){
        die("<center><font color='#cc0000'><b>Ошибка!<br />Вы зашли в страницу администратора не с оригинального ip адреса!</b></font></center>");
    }
}
    if(isset($_POST["login"])and($_POST["login"]!=='')){
        $login=$_POST["login"];
        $login=trim($login);
        $login=stripslashes($login);
        $login=htmlspecialchars($login);
    }else{
        die("Вы не ввели имя");
    }
    if(isset($_POST["pass"])and($_POST["pass"]!=='')){
        $pass=$_POST["pass"];
        $pass=trim($pass);
        $pass=stripslashes($pass);
        $pass=htmlspecialchars($pass);
    }else{
        die("Вы не ввели пароль");
    }
    if(isset($_POST["mop"])and($_POST["mop"]!=='')){
        $mop=$_POST["mop"];
        $mop=trim($mop);
        $mop=stripslashes($mop);
        $mop=htmlspecialchars($mop);
    }else{
        die("Вы не ввели кол-во сообщений на странице");
    }
    if(isset($_POST["pmsg"])and($_POST["pmsg"]!=='')){
        $pmsg=$_POST["pmsg"];
        $pmsg=trim($pmsg);
        $pmsg=stripslashes($pmsg);
        $pmsg=htmlspecialchars($pmsg);
    }else{
        die("Вы не выбрали в каком направлении выводить сообщения");
    }
    if(isset($_POST["moder"])and($_POST["moder"]!=='')){
        $moder=$_POST["moder"];
        $moder=trim($moder);
        $moder=stripslashes($moder);
        $moder=htmlspecialchars($moder);
    }else{
        die("Вы не выбрали модерировать сообщения или нет");
    }
    if(isset($_POST["ip_gb"])){
        if($_POST["ip"]!==''){
            $ip=$_POST["ip"];
            $ip_gb=1;
            $ip=$_SERVER["REMOTE_ADDR"];
        }else{
            die("Вы не ввели ip для защиты");
        }
    }else{
        $ip_gb=0;
    }
    $update=mysql_query("UPDATE adm SET adm_name='$login', adm_pass='$pass', msg_on_page='$mop', pmsg='$pmsg', moder='$moder', ip_gb='$ip_gb', ip='$ip'", $db);
    if($update=='true'){
        echo "<html><head><meta http-equiv='Refresh' content='0; URL=settings.php?save=1'></head></html>";
    }else{
        echo "<html><head><meta http-equiv='Refresh' content='0; URL=settings.php?save=2'></head></html>";
    }
}else{
    die("Вы должны войти как администратор");
}

Наша гостевая книга готова. Стандартные данные админа для входа на страницу администратора:

имя администратора - admin

пароль администратора - 111111

Поделиться...
twitter.com facebook.com vkontakte.ru mail.ru google.com bobrdobr.ru
Комментариев: 3
  1. Ставлю кодировку Кирилицу, а в сообщенях русский язык всё равно не распознаёт... выводит как "??????? ?????", что не введи из русских символов...что делать?:blank:

  2. Приносим извинения - но это старый дамп базы делает кодировку utf-8 - из-за этого возможны неполадки с отображением!

    Попробуйте новый вариант - вначале урока мы написали sql-запросы!

    Только сначала удалите старую базу и создайте новою guestbook!

  3. Fenomen (10)

Оставьте свой комментарий!

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор, укажите пароль и свой действующий email.

(обязательно)