<?php
/*
Класс: GuestBook
*/
require_once ('ErrorMessage.php');
require_once ('Authorisation.php');
class GuestBook
{
var $records = array(); // Массив считанных сообщений
var $_recs_loaded = 0; // Количество считанных сообщений
var $_error_num = 0; // Номер внутренней ошибки
var $_cur_page = 0; // Текущая страница
var $_max_page = 0; // Максимальная страница
function GuestBook()
//
// Конструктор класса, считывает записи страницы $page и помещает в внутренний массив
// $_records, если $page=0, то считывает последние MAX_ON_SCREEN сообщений
//
{
if (is_dir('data'))
{
if (is_writable('data'))
{
if (file_exists('data/'.GB_FILE))
{
$arr_file = file('data/'.GB_FILE); // Считываем файл в массив построчно
$gb_size = sizeof($arr_file); // Размер массива
$max_page = ceil($gb_size/MAX_ON_SCREEN); // Максимальная страница
$this->_max_page = $max_page;
if (isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page']<=$max_page && $_GET['page']>0){
$page = $_GET['page'];
$this->_cur_page = $page;
$start_mess = ($page-1)*MAX_ON_SCREEN;
$finish_mess = (($start_mess+MAX_ON_SCREEN-1) > ($gb_size-1)) ? $gb_size-1 : $start_mess+MAX_ON_SCREEN-1;
} else {
$this->_cur_page = 0; // Последние MAX_ON_SCREEN записей
$start_mess = ($gb_size-MAX_ON_SCREEN > 0) ? $gb_size-MAX_ON_SCREEN : 0;
$finish_mess = $gb_size-1;
}
// Формируем новый массив необходимых записей
for ($i=$finish_mess; $i>=$start_mess; $i--)
{
list($record['name'], $record['email'], $record['date'], $record['ip'], $record['message']) = explode('::', $this->Delnl($arr_file[$i]));
$record['page'] = $this->_cur_page;
$record['id'] = $i;
$record['message'] = stripslashes($record['message']);
$this->records[] = $record;
}
$this->_recs_loaded = $finish_mess-$start_mess+1;
return true;
}else{
$this->_recs_loaded = 0;
return true;
}
}else{
$this->_error_num = 2; // Ошибка - запись в директорию запрещена
return false;
}
}else{
$this->_error_num = 1; // Ошибка - директории не существует
return false;
}
}
function GetCurPageNum()
{
return $this->_cur_page;
}
function GetMaxPageNum()
{
return $this->_max_page;
}
function GetRecords()
//
// Функция возвращает массив сообщений гостевой книги
//
{
if (0 == $this->_recs_loaded)
{
return array();
} else {
return $this->records;
}
}
function ShowNavLine()
//
// Выводит постраничную навигацию гостевой книги
//
{
echo '<table width="100%" height="24" border="0"><tbody><tr><td bgcolor="#ffffff" align="center" valign="middle" width="100" class="pages">страницы</td><td bgcolor="#ffffff" align="center" valign="middle" class="pages">';
for($j=$maxpage;$j>=0;$j--){
if($j==$page){
echo '<b> [ '.$j.' ] </b>';
}else{
echo '<a href="index.php?page='.$j.'">'.$j.'</a> ';
}
}
echo '</td><td bgcolor="#ffffff" align="center" valign="middle" width="100" class="pages">страницы</td></tr></tbody></table><br>';
}
function AddPost()
//
// Добавляет сообщение в гостевую книгу, предварительно его проверив
//
{
if(empty($_POST['name']) || empty($_POST['post'])){
return 1;
}else{
$_POST['name'] = substr(htmlspecialchars($_POST['name']), 0, 32);
$_POST['email'] = substr(htmlspecialchars($_POST['email']), 0, 32);
$name = substr($_POST['name'], 0, 32);
$email = substr($_POST['email'], 0, 32);
$post = substr($_POST['post'], 0, 10000);
$post = str_replace("\n", '<br />', htmlspecialchars($post));
$post = str_replace(':', ':', $post); // Убираем символы ":"
$post = $this->UbbCode($post);
$post = $this->Typographica($post);
if (preg_match('/[^A-Za-z_0-9\xC0-\xFF\xB8\s\-]/',$name) || preg_match('/[^A-Za-z_@0-9\.\-]/',$email))
{
return 2; // Запрещённые символы в имени или адресе эл. почты
}else{
$ip = $_SERVER['REMOTE_ADDR'];
if(file_exists('data/'.GB_FILE))
{
$data = @file('data/'.GB_FILE);
list($last_name, $last_email, $last_date, $last_ip, $last_post) = explode('::', $data[sizeof($data)-1]);
$last_post = $this->Delnl($last_post);
if($last_ip == $ip && $last_post == $post)
{
return 3; // Флуд контроль
}else{
$stream = @fopen('data/'.GB_FILE, 'a');
flock($stream, LOCK_EX);
fputs($stream, "\n".$name.'::'.$email.'::'.date('H:i d.m.y').'::'.$ip.'::'.$post);
flock($stream, LOCK_UN);
fclose($stream);
}
}else{
$stream = @fopen('data/'.GB_FILE, 'a');
flock($stream, LOCK_EX);
fputs($stream, $name.'::'.$email.'::'.date('H:i d.m.y').'::'.$ip.'::'.$post);
flock($stream, LOCK_UN);
fclose($stream);
}
$_SESSION['name'] = $name;
$_SESSION['email'] = $email;
setcookie('name', $name, time()+30*24*3600);
setcookie('email', $email, time()+30*24*3600);
unset($_POST['name'], $_POST['email'], $_POST['post']);
return 0;
}
}
}
function UbbCode($post)
{
$search = array('[b]', '[/b]', '[i]', '[/i]');
$replace = array('<b>', '</b>', '<i>', '</i>');
$post = str_replace($search, $replace, $post);
$post = preg_replace('/\[link\]([^\[\]]+)\[\/link\]/', '<a href="$1" target="_blank">$1</a>', $post);
$post = preg_replace('/\[email\]([A-Za-z0-9\.@\_\?\&\=\%]+)\[\/email\]/', '<a href="mailto:$1">$1</a>', $post);
$post = preg_replace('/[^\s\n\t\v]{100,}/', '<b>[флуд контроль]</b>', $post);
return $post;
}
function Typographica($post)
{
$search = array('(C)', '(c)' , '(С)', '(с)');
$replace = array('©', '©', '©', '©');
return str_replace($search, $replace, $post);
}
function DelPost()
{
$id = $_GET['id'];
$arr_file = @file('data/'.GB_FILE);
$gb_size = sizeof($arr_file);
if ($id>=0 && $id<$gb_size)
{
if (0==$id && 1==$gb_size)
{
@unlink('data/'.GB_FILE);
return 0;
} else {
if (file_exists('data/'.GB_FILE.'.bak')) {
return 12; // Ошибка на сервере
} else {
if (@copy('data/'.GB_FILE, 'data/'.GB_FILE.'.bak')) {
$stream = fopen('data/'.GB_FILE, 'w');
flock($stream, LOCK_EX);
for ($i=0; $i<$gb_size; $i++) {
if ($i!=$id) {
if ($i!=$gb_size-1) {
if ($id==$gb_size-1 && $i==$gb_size-2) {
fputs($stream, $this->Delnl($arr_file[$i]));
} else {
fputs($stream, $this->Delnl($arr_file[$i])."\n");
}
} else {
fputs($stream, $this->Delnl($arr_file[$i]));
}
}
}
flock($stream, LOCK_UN);
fclose($stream);
@unlink('data/'.GB_FILE.'.bak');
} else {
return 12; // Невозможно скопировать файл
}
}
}
} else {
return 11; // Записи не существует
}
}
function Delnl($string)
{
return str_replace("\n", '', str_replace("\r", '', $string));
}
function ClearAll()
{
@unlink('../data/'.GB_FILE);
}
}
?>