|
|
Ответов: 0
|
25-02-12 07:01
|
|
|
|
Ответов: 0
|
16-01-12 20:13
|
|
|
|
Ответов: 1
|
09-01-12 11:23
|
|
   Web - программирование
|
|
|
   Программирование под ОС
|
|
|
   Web - технологии
|
|
|
   Базы Данных
|
|
|
|
Web - программирование / PHP /
| |
| | |
Возможно вас заинтересует
|
|
Пишем скрипт гостевой книги
В этой статье мы рассмотрим, как написать свою гостевую книгу. И так поставим цель: простейшую гостевую книгу на 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 , "$hostn$loginn$passwordn$databasen$tablen$pass" );
flock ( $f , LOCK_UN ); // Снимаем блокировку с файла
fclose ( $f );
// Создадим файл .htaccess и укажем в нем
// что по умолчанию нужно открывать файл gbook.php
$f = fopen ( '.htaccess' , 'w' );
flock ( $f , LOCK_EX );
fputs ( $f , "DirectoryIndex gbook.phpn" );
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>
<h3 align=center> Оставьте свое сообщение </h3>
<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>
<h3 align=center> Вход в режим модерирования </h3>
<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>
<h3 align=center>Редактирование сообщения</h3>
<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>"
?>
Вот и весь скрипт. Осталось только установить и использовать.
Последние статьи: Web - программирование / PHP /
| |
| | |
Библиотека GTK+ прошла долгий путь развития и сейчас очень популярна. GNOME, одна из ведущих оконных сред, использует GTK+ почти исключительно, GIMP построен на GTK+, множество коммерческих разработчиков ПО, таких как Abobe, NVidia и VMware, решили использовать эту библиотеку в качестве графической основы для своих продуктов... подробнее
|
Кол. просмотров: общее - 5821 сегодня - 0
|
|
Slashdot.org – популярный новостной портал с посещаемостью 50 млн. человек в месяц. Авторы проекта добились такого успеха, предоставляя пользователям свежие и интересные новости из мира IT... подробнее
|
Кол. просмотров: общее - 5990 сегодня - 0
|
|
Здесь рассматривается вопрос, что бывает, если запустить некий скрипт почти одновременно (что происходит, например, при большой нагруженности сервера) несколько раз, т.е. запустить несколько копий одного и того же скрипта. И к чему это может привести... подробнее
|
Кол. просмотров: общее - 5469 сегодня - 0
|
|
...и снова о спаме. Кто о нем только не писал, и все писали, что это плохо и ай-яй-яй. Я не буду оригинальничать, и тоже скажу – это плохо. Это ай-яй-яй. Как бороться со спамерами со своей стороны... подробнее
|
Кол. просмотров: общее - 5529 сегодня - 1
|
|
Эта статья даст вам общее представление о том, как создавать, обрабатывать и выводить рисунки в PHP4 для Windows... подробнее
|
Кол. просмотров: общее - 5515 сегодня - 0
|
|
|
|