View file gb/kernel/GuestBook.php

File size: 7.24Kb
<?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(':', '&#058;', $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('&copy;', '&copy;', '&copy;', '&copy;');
			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);
		}
	}

?>