Создание Гостевой Книги
Вторник, 14 сентября 2010 г.Рубрика: PHP программирование -> Готовые решения
Метки: guestbook | 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"> Вход </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 " <a href='guestbook.php?page=$i' class='navigat'> $i </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"> Выход </a></tt> <tt class="entry_adm"><a href="settings.php"> Настройки </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=" <tt class='entry_adm'><a href='moder.php?id=".$myrow["id"]."'> Показать </a></tt>";
}else{
$linkm=" <tt class='entry_adm'><a href='moder.php?id=".$myrow["id"]."'> Скрыть </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"]."'> Х </a></tt> <tt class='entry_adm'><a href='edit.php?id=".$myrow["id"]."'> Редактировать </a></tt>$linkm <tt class='$class_ban'><a href='ban.php?ip=".$myrow["ip"]."'> $tbanned </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 " <a href='adm.php?page=$i' class='navigat'> $i </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"> Выход </a> <a href="adm.php" class="navigat"> Страница администратора </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"> Выход </a> <a href="adm.php" class="navigat"> Страница администратора </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"> Выход </a> <a href="adm.php" class="navigat"> Страница администратора </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>Да <input type='text' name='ip' value='".$set_row["ip"]."' class='text'/> Ваш IP адрес";
}else{
echo "<input name='ip_gb' type='checkbox' value='1'>Да <input type='text' name='ip' value='".$_SERVER["REMOTE_ADDR"]."' class='text'/> Ваш IP адрес";
}
echo "<br /><br />
<tt class='name_setting'> </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


Ставлю кодировку Кирилицу, а в сообщенях русский язык всё равно не распознаёт... выводит как "??????? ?????", что не введи из русских символов...что делать?:blank:
Приносим извинения - но это старый дамп базы делает кодировку utf-8 - из-за этого возможны неполадки с отображением!
Попробуйте новый вариант - вначале урока мы написали sql-запросы!
Только сначала удалите старую базу и создайте новою guestbook!
Fenomen (10)