![]() |
![]() |
| http://kurepin.ru/php/slang.ru/9/ |
|
Строим сайт Глава 9. Подготовительные работы-1: class_init и class_mysql Мне кажется, что мы уже готовы к началу технических работ по созданию сайта. А что, основные классы определены, главные функции расписаны, принцип отображения данных - известен. Можно начинать работать. Не сомневаюсь, что большинство из вас только и ждут этого, полагаю, что сам процесс программирования - это главное. Нет, стерляди мои, это всего лишь довольно тоскливая рутина. Но без нее - никуда. Поехали! Начнем с начала. То есть, надо определить рабочие переменные в class_init. Уже сейчас нам потребуются: highlight_string(' 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; } ?>');?> Полагаю, комментировать тут нечего. Недостающие у вас директории - создайте.
Мы к этому файлу еще ни раз вернемся, чтобы добавить полезных переменных и констант. Теперь давайте разберемся с базой данных. Вернее, с подключением к ней и с оформлением sql-запросов. Класс class_mysql: highlight_string(' 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-ов определит, что надо подключиться к другой базе данных, то достаточно будет переопределить некоторые из перечисленных переменных, чтобы вся система начала работать с другой базой данных, находящейся на любом другом компьютере Интернета.
К строкам: highlight_string(' 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-функций. highlight_string(' 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 значения, сделаем функцию-наследника: highlight_string(' function sql_run($query) { $this->sql_query=$query; $err=$this->sql_execute(); if($err) return($err); return(0); } ?>');?> Кто-то из вас спросит: "а почему бы сразу не сделать одну sql_run?", - отвечаю - затем, что случаи разные бывают. Если в процессе написания программы нам функция sql_execute() никак не пригодится, мы ее купируем. Ну и... highlight_string(' function sql_close() { if($this->sql_conn_id) @mysql_close($this->sql_conn_id); return(0); } ?>');?> Надеюсь, тут пояснять нечего, да и вызывать мы эту функцию будем весьма редко, так как при persistent connection (mysql_pconnect) она не производит закрытия соединения, а при обычном соединении закрытие sql-соединения производится автоматически, когда скрипт завершает свою работу.
Ну вот, собственно, sql-класс готов, можно его использовать в бою. Шагаем дальше! 08.08.04 |
| реклама на сайте |
|
…
|
| copyright ©2000-2002 Ruslan Kurepin |