А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/slang.ru/9/
Rambler's Top100
Строим сайт slang.ru, глава 9

Строим сайт slang.ru

Глава 9. Подготовительные работы-1: class_init и class_mysql


Мне кажется, что мы уже готовы к началу технических работ по созданию сайта. А что, основные классы определены, главные функции расписаны, принцип отображения данных - известен. Можно начинать работать. Не сомневаюсь, что большинство из вас только и ждут этого, полагаю, что сам процесс программирования - это главное. Нет, стерляди мои, это всего лишь довольно тоскливая рутина. Но без нее - никуда.

Поехали!

Начнем с начала. То есть, надо определить рабочие переменные в class_init. Уже сейчас нам потребуются:

<? class class_init {  // адрес сайта  var $URL='slang.ru';  // путь к сайту на диске сервера  var $path_root='/opt/www/slang.ru';  // путь к картинкам  var $path_pic='/opt/www/slang.ru/www/pic';   // путь к папке inc  var $path_inc='/opt/www/slang.ru/inc';   // путь к папке info  var $path_info='/opt/www/slang.ru/info';  // путь к папке с темплейтами  var $path_blank='/opt/www/slang.ru/blank';  // путь к папке с флагами  var $path_flag='/opt/www/slang.ru/flags';  // уровень отладки  var $debug_level=100000;  // адреса службы поддержки  var $email_support=array('atos@slang.ru');  // email-робот (обратный адрес)  var $email_robot='robot@slang.ru';  // пауза между письмами (в милисекундах)  var $email_usleep=100000; } ?>

Полагаю, комментировать тут нечего. Недостающие у вас директории - создайте.

Обращение: если вы достаточно хорошо владеете английским языком, не откажите в помощи - необходимо создать англоязычную версию сайта slang.ru: тексты в дизайне, сообщения об ошибках, тексты для рассылок. А то я с этим на должном уровне не справлюсь. Спасибо всем, кто откликнется!

Мы к этому файлу еще ни раз вернемся, чтобы добавить полезных переменных и констант.

Теперь давайте разберемся с базой данных. Вернее, с подключением к ней и с оформлением sql-запросов. Класс class_mysql:

<?   var $sql_conn_id// идентификатор подключения к базе   var $sql_host='localhost'// host   var $sql_user='slang'// имя пользователя   var $sql_pass='xxxxxx'// пароль   var $sql_db='slang'// имя базы данных   var $sql_query// sql-запрос   var $sql_err// описание sql-ошибки   var $sql_errno// номер sql-ошибки   var $sql_res// указатель на sql-запрос   function sql_connect()   {    $this->sql_conn_id=@mysql_pconnect($this->sql_host,$this->sql_user,$this->sql_pass);    if(!$this->sql_conn_id) return(111); // ошибка подключения к базе данных    if(!@mysql_select_db($this->sql_db)) return(113); // ошибка выбора базы данных    return(0);   } ?>

Зачем я вынес реквизиты подключения в отдельные переменные, когда обычно их прописывают в mysql_connect сразу? Я это сделал для того, чтобы иметь возможность переопределить их в нужный момент. Например, если в URL-запросе какой-то из brain-ов определит, что надо подключиться к другой базе данных, то достаточно будет переопределить некоторые из перечисленных переменных, чтобы вся система начала работать с другой базой данных, находящейся на любом другом компьютере Интернета.

Примечание: использовать для подключения к SQL-базе функцию mysql_connect() или mysql_pconnect() - решайте для себя сами. Лично мне кажется, что логичнее использовать функцию mysql_pconnect() по причине того, что она сначала пытается установить постоянное соединение, а потом обычное, если постоянное создать не удалось. В этом есть известное удобство. В принципе, можно в список глобальных mysql-переменных добавить еще одну - указывающую тип подключения, чтобы можно было динамически ею управлять, но сейчас я в этом не вижу большого смысла, поэтому делать этого пока не буду.

К строкам:

<?    if(!$this->conn_id) return(111); // ошибка подключения к базе данных и    return(0); ?>

привыкайте сразу, такие строки будут попадаться нам в каждой функции, и не по одному разу. Смысл их прост - функция возвращает код ошибки. Если возвращен "0", то функция отработала без ошибок. Если возвращен не "0", значит, произошла ошибка, код которой необходимо обработать.

Так сложилось, что ошибка подключения к базе данных у меня всегда или "11" или "111", так зачем же мне отступать от своих привычек?

Пишу в файл /info/errors.txt:

; ошибки SQL
111	не удалось подключиться к базе данных SQL

Первая строка - это комментарий. Рекомендую все ошибки разбивать на логические группы и комментировать эти группы: ошибки sql, ошибки работы с файлами, ошибки авторизации и так дальше. Если вы помните, в нашем файле описания ошибок комментарием считается любая строка, начинающаяся НЕ с цифры.

В class_init мы определили переменную $debug_level. Она указывает движку максимальный номер ошибки, ниже которого все другие считаются критическими, и о них следует докладывать администратору сайта. Поэтому располагать ошибки мы будем по мере их критичности: чем меньше номер ошибки, тем важнее событие. Давайте сразу запишем в errors.txt следующие группы:

; 1-100 критические ошибки разного характера

; 101-200 ошибки SQL
111	не удалось подключиться к базе данных SQL

; 201-300 ошибки работы с файлами и деркториями

; 1000-2000 ошибки пользователей при работе с сайтом

Примерно так.

Дальше можно дробить выделенные диапазоны на более мелкие группы ошибок. Это уже по желанию.

Сейчас $debug_level установлен в 100000, поэтому отчеты о любых ошибках будут доставляться администраторам на перечисленные email-адреса в массиве $email_support.

Но вернемся к class_mysql. Нам необходимо создать еще несколько sql-функций.

<?   function sql_execute()   {    if(!$this->sql_conn_id// подключаемся к базе данных    {     $err=$this->sql_connect();     if($err) return($err);    }    // запрос    $this->sql_res=mysql_query($this->sql_query,$this->sql_conn_id);    // обработка ошибок    $this->sql_errno=mysql_errno($this->sql_conn_id);    if($this->sql_errno)    {     $this->sql_err=mysql_error($this->sql_conn_id);     return(112);    }    return(0);   } ?>

Эта функция выполняет sql запрос и возвращает "0", если все удачно или код 112 - ошибка SQL-запроса (добавляем этот код в errors.txt).

Обратите внимание на то, что подключаться к базе мы будем именно из этой функции. Чтобы не следить в коде программы за своевременным подключением к SQL, мы проверяем идентификатор подключения $sql_conn_id, и если тот оказывается пустым, производим попытку подключиться к SQL.

Уже можно видеть механизм передачи кода ошибки по цепочке. Если ошибка произошла при подключении к базе (код 111), то он будет возвращен и функцией sql_execute() как 111. То есть пользователь и администратор узнают истинную причину возникшей ошибки, не взирая на название функции, возвратившей ошибку.

Чтобы упростить вызов sql_execute(), избавившись от необходимости заранее присваивать переменной $sql_query значения, сделаем функцию-наследника:

<?   function sql_run($query)   {    $this->sql_query=$query;    $err=$this->sql_execute();    if($err) return($err);    return(0);   } ?>

Кто-то из вас спросит: "а почему бы сразу не сделать одну sql_run?", - отвечаю - затем, что случаи разные бывают. Если в процессе написания программы нам функция sql_execute() никак не пригодится, мы ее купируем.

Ну и...

<?   function sql_close()   {    if($this->sql_conn_id) @mysql_close($this->sql_conn_id);    return(0);   } ?>

Надеюсь, тут пояснять нечего, да и вызывать мы эту функцию будем весьма редко, так как при persistent connection (mysql_pconnect) она не производит закрытия соединения, а при обычном соединении закрытие sql-соединения производится автоматически, когда скрипт завершает свою работу.

Примечание: Если вы не знаете, символ "@" используется для блокирования вывода всевозможных предупреждений в стандартный output, на экран или в браузер, проще говоря. Мы сами анализируем все возможные ошибки, поэтому дополнительная информация от php-интерпретатора в браузере - нам без надобности.

Ну вот, собственно, sql-класс готов, можно его использовать в бою. Шагаем дальше!





[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin