Тестирования функций системы

Результаты тестирования:

Была проведена проверка работоспособности модуля, регистрации были введены и отправлены произвольные данные пользователя (Рис. А.4). После чего произошло добавления пользователя в систему и авторизация его в системе.

Было проведено тестирование модуля управления записями. В поля страницы добавления был введён и отправлен произвольный текст записи (Рис. А.5), после чего запись была успешно добавлена в базу и отображена на экране (Рис. А.6).

Было проведено тестирования модуля статистики и администрирования (Рис. А.7). Были удалены тестовые записи пользователей и тестовые пользователи (Рис. А.8).

В ходе тестирования ошибок и неполадок выявлено не было. Система полностью работоспособна.

Тестирование на нагрузку

Было проведено тестирование на время ответа сайта из различных стран мира. Результаты тестирования на рисунке А.9.

Время загрузки сайта 0.10 сек. Скорость загрузки сайта 38.02 кб/сек. Объем страницы: html 2256 bytes (57.4%) css 1674 bytes (42.6%) всего 3930 bytes

Тестирования функций системы - student2.ru

Рис 3. Объем страницы

Заключение

В результате разработки курсового проекта мы получили многофункциональную систему управления блогом.

Полученная система может выполнять следующие задачи:

· Установка системы на сервер

· Создание, редактирование и удаление записей

· Регистрация пользователей

· Статистика и администрирование пользователей и записей

· Управление правами и привилегиями пользователей

Полученная система успешно взаимодействует с компилирующем обработчиком шаблонов “Smarty”. Все шаблоны и отображения системы были написаны с использование шаблонизатора “Smarty”.

В конце работы было проведено полное тестирование проекта, в ходе которого не было выявлено проблем и ошибок в работе системы.

Все задачи, поставленные при проектирование системы выполнены успешно.

Преимущества полученной системы над известными системами управления блогом Drupal и Wordpress:

· Полученная система имеет меньший объём

· У полученной системы более высокая скорость работы

· Полученная система проще и быстрее устанавливается и настраивается

· Нет лишних функций

· Полученная система использует шаблонизатор что упрощает работу с системой

· Полученная система не требует базы данных, так как она уже встроена в систему

Недостатки полученной системы по отношению с известными системами управления блогом Drupal и Wordpress:

· Малый функционал

· Отсутствие технической поддержки

· Нет плагинов и модулей

· Нет готовых шаблонов для системы

· Более уязвимая система безопасности

Список литературы

1. Бейли Линн, Моррисон Майкл Изучаем PHP и MySQL Издательство: Эксмо

2. Веллинг Люк, Томсон Лора Разработка веб-приложений с помощью PHP и MySQL Издательство: Вильямс

3. Дамашке Гизберт PHP и MySQL Издательство: НТ Пресс

4. Зандстра Мэтт PHP. Объекты, шаблоны и методики программирования Издательство: Вильямс

5. Кузнецов Максим, Симдянов Игорь PHP на примерах Издательство: БХВ-Петербург

6. Орлов А. А. PHP. Полезные приемы Издательство: Горячая Линия - Телеком

7. Прохоренок Николай HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера Издательство: БХВ-Петербург

8. Фленов Михаил PHP глазами хакера Издательство: БХВ-Петербург

9. Харрис Энди PHP/MySQL для начинающих Издательство: КУДИЦ-Образ

10. Хольцнер Стивен PHP в примерах Издательство: Бином-Пресс

Приложение А

Тестирования функций системы - student2.ru

Рис. А.1. Отображение сайта в Google Chrome 15.0.874.106 m

Тестирования функций системы - student2.ru

Рис. А.2. Отображение сайта в Internet explorer 7 64x

Тестирования функций системы - student2.ru

Рис. А.3. Отображение сайта в Opera v11.51

Тестирования функций системы - student2.ru

Рис. А.4. Тестирование регистрации

Тестирования функций системы - student2.ru

Рис. А.5. Тестирование добавления записей

Тестирования функций системы - student2.ru

Рис. А.6. Тестирование добавления записей

Тестирования функций системы - student2.ru

Рис. A.7. Тестирование модуля статистики и администрирования

Тестирования функций системы - student2.ru

Рис. A.8. Тестирование модуля статистики и администрирования

Тестирования функций системы - student2.ru

Рис. А.9. Скорость ответа сайта

Приложение Б

Index.php

// Переменная безопасности

define('ROOT', TRUE);

// Загрузка конфигураций

require_once('config.php');

// установка кодировки

header("Content-type: text/html; charset=".sait_charset);

// старт сессии

session_start();

// загрузка класса ядра

require_once(core_dir.'core.class.php');

$core = new core;

Config.php

if (!defined('ROOT')) die();

// Сообщение об ошибках: 0 - отключить; E_ALL - показывать все

error_reporting(E_ALL);

// Устанавливаем кодировку

define('sait_charset', 'utf-8');

// Константы сайта

define('title_sait', 'Blogyyy - блоговый движок'); // заголовок сайта

define('limit_entry', 5); // колличество записей на странице

define('core_dir', 'core/'); // папка с системными файлами дижка

define('DB_NAME', "core/sqlite.db"); // Путь для хранения базы данных

// Константы директорий Smarty

define('smarty_dir', core_dir.'smarty/Smarty.class.php'); // Путь к классу смарти

define('smarty_template_dir', 'templates/'); // Путь к хранилищю шаблонов

define('smarty_compile_dir', 'tmp/templates_c/'); // Путь к хранению откомпеливованных шаблонов

define('smarty_cache_dir', 'tmp/cache/'); // Путь к папке кеша

define('smarty_caching', false); // разрешить(true) или запретить(false) кэширование

define('smarty_debugging', false); // включить(true) или отключить(false) окно отладки smarty

Core.class.php

if (!defined("ROOT")) die;

/**

*

* Класс ядра блога

*

*/

class core

{

protected $smarty;

protected $func;

/**

*

* Конструктор ядра

*

*/

function __construct()

{

// Инициализация класса Smarty

require_once(smarty_dir);

$this->smarty = new Smarty();

// Инициализация каталогов для работы Smarty

$this->smarty->template_dir = smarty_template_dir;

$this->smarty->compile_dir = smarty_compile_dir;

$this->smarty->cache_dir = smarty_cache_dir;

// Инициализация настроек Smarty

$this->smarty->caching = smarty_caching;

$this->smarty->debugging = smarty_debugging;

// Загрузка модуля функций

require_once('core/func.class.php');

$this->func= new func;

// Загружаем контроллеры

if (!file_exists(DB_NAME))

$this->page_reg(true);

else

$this->_Load();

}

/**

*

* Функция загрузки контролера страницы

*

*/

private function _Load()

{

// Определяем имя контроллера

if (isset($_GET['c']))

$controler = trim(strip_tags($_GET['c']));

else

$controler = 'index';

// Выбираем нужный контроллер

switch ($controler)

{

case 'index':

$this->page_index();

break;

case 'add':

$this->page_edit();

break;

case 'creat':

$this->page_edit(true);

break;

case 'login':

$this->page_login();

break;

case 'logout':

$this->page_logout();

break;

case 'view':

$this->page_view_entry();

break;

case 'del':

$this->page_del();

break;

case 'reg':

$this->page_reg();

break;

case 'a_statistic':

$this->statistic();

break;

default:

$this->page_404();

break;

}

}

/**

*

* Функция загрузки страницы

* str : $page - имя Smarty шаблона в папке templates

* str : $title - Заголовок страницы

* array : $data = array() - массив данных передоваемых в шаблон

* str : $head = "" - строка для вывода между тегами <head></head>

*

*/

protected function _LoadPage($page, $title, $data = array(), $head = '')

{

// Устанавливаем вставки в шаблон

$this->smarty->assign('title', $title.' - '.title_sait);

$this->smarty->assign('page_title', $title);

$this->smarty->assign('title_sait', title_sait);

$this->smarty->assign('charset', sait_charset);

$this->smarty->assign('head', $head);

foreach ($data as $key=>$val)

$this->smarty->assign($key, $val);

// Отображаем шаблоны

$this->smarty->display('header.html');

$this->smarty->display($page.'.html');

$this->smarty->display('foter.html');

}

/**

*

* Функция

* Загружает содержимое стратовой страницы

*

*/

function page_index()

{

// Проверяем передана ли страница

if (isset($_GET['page']))

{

$page = abs((int)$_GET['page']);

if ($page)

$this->func->page = $page;

}

// Выполняем функция чтения списка постов

$data['list_array'] = $this->func->read_list();

$data['nav'] = $this->func->nav;

$this->_LoadPage('view_index', 'Главная страница', $data);

}

/**

*

* Функция отображения ошибки 404

*

*/

private function page_404()

{

$this->_LoadPage('404', '404 ошибка');

exit;

}

/**

*

* Функция добавления/обнавления записи

*

*/

private function page_edit($up = false)

{

// Проверка авторизации

if(!isset($_SESSION['id']))

$this->page_404();

// Если обновлять

if ($up){

$row = $this->func->view_entry($_GET['id']);

// проверяем можноли редактировать

if ($_SESSION['id'] != $row['avtor'] and $_SESSION['UG'] != '7')

$this->page_404();

// загружаем данные в клас

$this->func->title = $row['title'];

$this->func->entry = htmlspecialchars($row['entry']);

$this->func->anons = $row['anons'];

$id = $_GET['id'];

}else{

$id = null;

}

// Отправление post данных в функцию обработчик

if ($_SERVER['REQUEST_METHOD'] == 'POST')

$this->func->edit($_POST, $id);

// Вывод формы

$head = '<script type="text/javascript" src="ckeditor/ckeditor.js"></script>';

$data['error'] = $this->func->error;

$data['tems'] = $this->func->title;

$data['entry'] = $this->func->entry;

$data['anons'] = $this->func->anons;

if ($up)

$title = 'Редакитровать запись';

else

$title = 'Добавить запись';

$this->_LoadPage('edit', $title, $data, $head);

}

/**

*

* Функция вывода статистики для администратора

*

*/

function statistic(){

if ($_SESSION['UG'] != 7)

$this->page_404();

if (isset($_GET['config']) && $_GET['config'] == 'del')

$this->func->del_user($_GET['id']);

if (isset($_GET['del_view']))

$this->func->del_entry($_GET['del_view']);

if (isset($_GET['config']) && $_GET['config'] == 'view'){

$row = $this->func->get_user_entry($_GET['id']);

$data['view_list'] = $row[0];

$data['user'] = $row[1]['name'];

$data['idd'] = $_GET['id'];

$this->_LoadPage('statistic_view', 'Записи пользователя '.$row[1]['name'], $data);

exit();

}

$data['user_list'] = $this->func->get_user_list();

$this->_LoadPage('statistic', 'Статистика', $data);

}

/**

*

* Функция вывода записи

*

*/

function page_view_entry()

{

$row = $this->func->view_entry($_GET['id']);

if ($row)

$this->_LoadPage('view_entry', $row['title'], array('list' => $row));

else

$this->page_404();

}

/**

*

* Функция авторизации

*

*/

function page_login()

{

// Проверка существует ли такой пользователь в базе

if ($row = $this->func->auth($_POST['login'], $_POST['pass'])){

// если да, пишим его имя и id в сессию и выводим приветствие

$_SESSION['id'] = $row['id'];

$_SESSION['name'] = $row['name'];

$_SESSION['UG'] = $row['UG'];

$this->_LoadPage('message', 'Авторизация', array('message' => "Здравствуйте, ".$row['name']));

}else{

// если нет выводим ошибку

$this->_LoadPage('message', 'Авторизация', array('message' => "Не верный логин/пароль"));

}

}

/**

*

* Функция удаления записи

*

*/

function page_del()

{

// проверка авторизации

if(!isset($_SESSION['id']))

$this->page_404();

if (!$this->func->del($_GET['id']))

$this->_LoadPage('message', 'Удаление записи', array('message' => "Ошибка при удаление записи!"));

}

/**

*

* Функция завершения сессии пользователя

*

*/

function page_logout()

{

// Удаляем переменные из сессии

unset($_SESSION['id']);

unset($_SESSION['name']);

unset($_SESSION['UG']);

// Выводим сообщение

$this->_LoadPage('message', 'Авторизация', array('message' => "Сессия завершена"));

}

/**

*

* Функция установки блога

*

*/

private function page_reg($install = false)

{

if(isset($_SESSION['id']))

$this->page_404();

if ($_SERVER['REQUEST_METHOD'] == 'POST')

{

$this->func->reg($_POST, $install);

}

$data['error'] = $this->func->error;

$data['name'] = $this->func->name;

$data['login'] = $this->func->login;

$data['mail'] = $this->func->mail;

if ($install){

$data['reg_group'] = 'супер юзера';

$title = 'Установка CMS Bloggg';

}else{

$data['reg_group'] = 'пользователя';

$title = 'Регистрация';

}

$this->_LoadPage('reg', $title, $data);

}

}

Func.class.php

if (!defined("ROOT")) die;

/**

*

* модуль добавления, чтения, редактирования и удаления записей

*

*/

class func

{

protected $_db;

public $error;

public $title;

public $entry;

public $anons;

public $name;

public $login;

public $pass;

public $mail;

public $page = 1;

public $nav = false;

/**

*

* Функция конструктор подключает класс БД

*

*/

function __construct()

{

// Загрузка класса SQLite

require_once(core_dir.'dblite.class.php');

$this->_db= new dblite;

}

/**

*

* Функция инсталятора

*

*/

function reg($post, $install=false)

{

// Проверяем данные и выводим ошибки

$this->name = $this->valid($post['name']);

$this->login = $this->valid($post['login']);

$this->pass = $this->valid($post['pass']);

$this->mail = $this->valid($post['mail']);

if (empty($this->name))

$this->error .= '<p>Поле <strong>Имя</strong> не заполнено</p>';

if (empty($this->mail))

$this->error .= '<p>Поле <strong>E-mail</strong> не заполнено</p>';

if (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $this->mail))

$this->error .= '<p>В поле <strong>E-mail</strong> введён не коректный e-mail адрес</p>';

if (empty($this->login))

$this->error .= '<p>Поле <strong>Логин</strong> не заполнено</p>';

if (empty($this->pass))

$this->error .= '<p>Поле <strong>Пароль</strong> не заполнено</p>';

if (md5($this->pass) != md5($post['re_pass']))

$this->error .= '<p><strong>Пароли</strong> не совпадают</p>';

if (!$install)

{

$res = $this->_db->select('users', 'id', "login = '".md5($this->login)."'");

if ($res->fetch() && !empty($this->login))

$this->error .= '<p>Пользовательн с таким <strong>Логином</strong> уже существует</p>';

$res = $this->_db->select('users', 'id', "mail = '$this->mail'");

if ($res->fetch() && !empty($this->mail))

$this->error .= '<p>Пользовательн с таким <strong>E-mail\'ом</strong> уже существует</p>';

}

if ($this->error)

{

$this->set_error();

return false;

}

// Устанавливаем права

if ($install)

{

// Создаём базу

$this->_db->install();

$UG = 7; // Права администратора

}else{

$UG = 5; // Права редактора

}

// Добавляем запись в базу

$res = $this->_db->insert('users',

'id, name, login, pass, mail, UG', "'".time()."','".$this->name."',

'".md5($this->login)."', '".md5($this->pass)."', '".$this->mail."', '".$UG."'");

// Проверяем вернувшийся результат

if($res)

{

mail($this->mail, 'Добро пожаловать в наш блог!', 'Ты только что у нас зарегался))) Твой логин '.$this->login.'

Если ты не понимаешь откуда это письмо. Не парся просто удали и всё)))');

$_SESSION['name'] = $this->name;

$_SESSION['id'] = $this->_db->last_id;

$_SESSION['UG'] = $UG;

// Возвращаемся на главную

header('Location: /');

return true;

}else{

// Выводим ошибку

$this->error = "<p>Ошибка работы базы данных.</p>";

$this->set_error();

return false;

}

}

/**

*

* Функция валидации

*

*/

function valid($val, $type = "str", $val_db=true)

{

switch ($type)

{

case "str":

$val = trim(strip_tags($val));

if ($val_db)

$val = sqlite_escape_string($val);

return $val;

break;

case "int":

$val = abs((int)$val);

if ($val_db)

$val = sqlite_escape_string($val);

return $val;

break;

case "text":

$val = trim($val);

$val = sqlite_escape_string($val);

return $val;

break;

default:

if ($val_db)

$val = sqlite_escape_string($val);

return $val;

break;

}

}

/**

*

* Функция добавления или обнавления записи в БД

*

*/

function edit($post, $id = null)

{

// Проверяем, чистим поля и формируем ошибки

$this->title = $this->valid($post['tems']);

if(empty($this->title))

$this->error .= '<p>Поле <strong>Тема</strong> не заполнено</p>';

$this->entry = $this->valid($post['text'], "text");

if (empty($this->entry))

$this->error .= '<p>Поле <strong>Текст</strong> не заполнено</p>';

$this->anons = substr($this->valid($post['anons'], "str"), 0, 400);

if (empty($this->anons))

$this->error .= '<p>Поле <strong>Анонс</strong> не заполнено</p>';

// если есть ошибки отправляем их в обработчки и отправляем false

if ($this->error)

{

$this->set_error();

return false;

}

// Обнавляем или добавляем запись в базе

if (!empty($id)){

$id = $this->valid($id, 'int');

$res = $this->_db->update('entry', "title='$this->title', anons='$this->anons', entry='$this->entry'", "id = '$id'");

}else{

$res = $this->_db->insert('entry', 'title, anons, entry, date, avtor', "'".$this->title."', '".$this->anons."', '".$this->entry."', '".time()."', '".$_SESSION['id']."'");

$id = $this->_db->last_id;

}

// Проверяем вернувшийся результат

if($res)

{

// Переходим к просмотру записи

header('Location: /?c=view&id='.$id);

return true;

}else{

// Выводим ошибку

$this->error = "<p>Ошибка работы базы данных.</p>";

$this->set_error();

return false;

}

}

/**

*

* Функция проверки логина/пароля

*

*/

function auth($login, $pass)

{

$login = md5($login);

$pass = md5($pass);

$res =$this->_db->select('users', 'id, name, UG', "login = '$login' and pass = '$pass'");

$row = $res->fetch(SQLITE_ASSOC);

return $row;

}

/**

*

* Функция получения списка пользователей

*

*/

function get_user_entry($id){

$id = $this->valid($id, 'int');

$res = $this->_db->select('entry', 'id, title, date', "avtor = '$id'", "", "date desc");

$row[0] = $res->fetchAll(SQLITE_ASSOC);

$res = $this->_db->select('users', 'name', "id = '$id'");

$row[1] = $res->fetch(SQLITE_ASSOC);

return $row;

}

/**

*

* Функция получения списка записей пользователя

*

*/

function get_user_list(){

$res =$this->_db->select('users', 'id, name, mail, UG');

$row = $res->fetchAll(SQLITE_ASSOC);

return $row;

}

/**

*

* Функция удаления пользователя

*

*/

function del_user($id){

$id = $this->valid($id, 'int');

$res = $this->_db->delete('users', 'id = "'.$id.'"');

return $res;

}

/**

*

* Функция удаления записи

*

*/

function del_entry($id){

$id = $this->valid($id, 'int');

$res = $this->_db->delete('entry', 'id = "'.$id.'"');

return $res;

}

/**

*

* Функция загрузки списка записей

*

*/

function read_list()

{

// количество записей в таблице

$res =$this->_db->select('entry', 'COUNT(*)');

$row = $res->fetch();

// Навигация //

$num_entry = $row[0];

if ($num_entry > limit_entry)

{

$all_page = ceil($num_entry/limit_entry);

if ($this->page > 2)

$nav = '<b><a href="/">В начало</a></b>';

if ($this->page > 1)

$nav .= '<a href="/?page='.($this->page-1).'">Назад</a>';

for ($i=1; $all_page+1; $i++)

{

if ($i == $this->page)

$nav .= "<b>$i</b>";

else

$nav .= "<a href='/?page=$i'>$i</a>";

}

if ($this->page+1 <= $this->all_page)

$nav .= '<a href="/?page='.($this->page+1).'">Вперёд</a>';

if ($this->page < $all_page-1)

$nav .= "<b><a href='/?page={$all_page}'>В конец</a></b>";

$this->nav = $nav;

}

// Расчитываем размер выборки

$limit = limit_entry;

$end_limit = $this->page*limit_entry;

if ($end_limit>limit_entry)

$start_limit = $end_limit-limit_entry;

else

$start_limit = 0;

if ($end_limit>$num_entry)

$end_limit = $num_entry;

// Делаем запрос

$res = $this->_db->select('entry JOIN users',

'entry.id id, title, anons, date, avtor, users.name name',

"entry.avtor = users.id", "$start_limit, $limit", "date desc");

// Выводим результат

if ($res)

return $res->fetchAll(SQLITE_ASSOC);

else

return false;

}

/**

*

* Функция загрузка одной записи

*

*/

function view_entry($id)

{

$id = $this->valid($id, 'int');

$res = $this->_db->select('entry JOIN users',

'entry.id id, title, entry, anons, date, avtor, users.name name',

"entry.avtor = users.id and entry.id = '$id'");

if ($res)

return $res->fetch(SQLITE_ASSOC);

else

return false;

}

/**

*

* Функция удаления записи

*

*/

function del($id)

{

$id = $this->valid($id, 'int');

if ($_SESSION['UG'] == '7')

$res = $this->_db->delete('entry', "id = '$id'");

else

$res = $this->_db->delete('entry', "id = '$id' and avtor = '$_SESSION[id]'");

if($res)

header("Location: /");

else

return false;

}

/**

*

* Функция обработки ошибки

*

*/

function set_error()

{

$this->error = '<div class="error"><h3>Ошибка:</h3>'.$this->error.'</div>';

}

}

Dblite.class.php

if (!defined("ROOT")) die;

/**

*

* Класс работы с SQLite

*

*/

class dblite

{

const tmp_ERROR = "tmp/sql_error.log";

protected $_db;

public $last_id;

/**

*

* Функция конструктор

* Либо подключаеся к базе

* Либо создаёт базу и подключается к ней

*

*/

function __construct(){

if (file_exists(DB_NAME))

$this->_db = new SQLiteDatabase(DB_NAME);

}

/**

*

* Функция создания базы данных

*

*/

function install(){

$this->_db = new SQLiteDatabase(DB_NAME);

$sql = "CREATE TABLE entry(

id INTEGER PRIMARY KEY,

title TEXT,

anons TEXT,

entry TEXT,

date INTEGER,

avtor INTEGER

);";

$this->sql_try($sql);

$sql = "CREATE TABLE users(

id INTEGER PRIMARY KEY,

name TEXT,

login TEXT,

pass TEXT,

mail TEXT,

UG INTEGER

);";

$this->sql_try($sql);

}

/**

*

* Функция выборки данных из базы

* str : $table - имя таблицы

* str : $from - выбираемые поля

* str : $where - строка where условий

* str : $limit = "" - количество выводимых записей

* str : $order = "" - поле для сортировки

*/

function select($table, $from, $where = "", $limit="", $order = ""){

$sql = "SELECT $from from $table";

if (!empty($where))

$sql .= " WHERE ".$where;

if (!empty($order))

$sql .= " ORDER BY ".$order;

if (!empty($limit))

$sql .= " LIMIT ".$limit;

if ($this->sql_try($sql))

return $this->_db->query($sql);

else

return false;

}

/**

*

* Функция добавления в базу данных

* str : $table - имя таблицы

* str : $key - поля для добавления

* str : $val - значение добавляемых полей

*/

function insert($table, $key, $val){

$sql = "INSERT INTO $table ($key) VALUES ($val)";

return $this->sql_try($sql);

}

/**

*

* Функция обнавления записи в базе данных

* str : $table - имя таблицы

* str : $item - строка обнавления

* str : $where - строка where условий

*/

function update($table, $item, $where){

$sql = "UPDATE $table SET $item WHERE $where";

return $this->sql_try($sql);

}

/**

*

* Функция удаления записи из базы данных

* str : $table - имя таблицы

* str : $where - строка where условий

*/

function delete($table, $where){

$sql = "DELETE FROM $table WHERE $where";

return $this->sql_try($sql);

}

/**

*

* Функция обработки запроса

* В случаее успеха выполнения запроса возвращает TRUE

* В случае неудачи возвращает FALSE и записывает в лого файл tmp_ERROR

*

*/

function sql_try($sql)

{

try{

$res = $this->_db->query($sql);

if (!$res)

throw new SQLiteException(sqlite_error_string($this->_db->lastError()));

$this->last_id = $this->_db->lastInsertRowid();

return true;

}catch(SQLiteException $e){

if(!file_exists(self::tmp_ERROR))

file_put_contents(self::tmp_ERROR, "$e \n");

else

file_put_contents(self::tmp_ERROR, file_get_contents(self::tmp_ERROR)."$e \n");

return false;

}

}

/**

*

* Функция диструктор

* Отключается от базы

*

*/

function __destruct(){

unset($this->_db);

}

}

Наши рекомендации