PHPLIB — это некоторые библиотеки расширения PHP. Мы можем использовать его для легкого выполнения различных операций с базой данных. Однако, если вы хотите использовать несколько баз данных, это будет за пределами ваших возможностей. Это лучшее из обоих миров. Вы можете использовать несколько баз данных при использовании PHPLIB, а также узнать об объектно-ориентированном программировании и о том, как расширить библиотеку. Это стоит прочитать.
Управление базой данных
Вы можете поместить любую таблицу в большую базу данных. Однако со временем база данных будет становиться все больше и больше. Возможно, сервер не сможет справиться с работой ввода-вывода или может не хватить памяти для обработки всех обращений? Очень сложно разделить существующие данные. Целесообразно начать с отдельных баз данных и реализовать эффективное управление базами данных. Если у вас есть веб-сайт, на котором продаются книги, у вас, вероятно, есть список авторов, список цен на книги, а также список текущих запасов и заказов. По мере роста вашего бизнеса заказы будут продолжать расти, и для обработки каждого заказа требуется много дискового доступа. Скорее всего, в какой-то момент вы занесете все свои заказы в систему учета.
Теперь поместите заказы в отдельную базу данных. Поскольку запасы также обновляются посредством заказов, количества запасов также помещаются в ту же базу данных.
Список авторов и список книг — это статичная информация, которую нужно часто читать, но редко обновлять. На практике обновление записи об авторе может потребоваться только один раз в 5 лет, только когда автор пишет новую книгу (или умирает). Сервер, на котором размещаются эти данные, может быть настроен совершенно иначе, чем сервер, на котором размещена база данных заказов.
Содержит PHPLIB
PHPLIB осуществляет доступ к базам данных SQL через класс DB_Sql. В зависимости от типа базы данных, которую вам нужно использовать, включите в свой код разные файлы inc. В этом примере я использую версию MySQL.
Чтобы использовать DB_Sql в своем коде, установите файлы PHPLIB в отдельный каталог. Затем найдите каталог cgi-bin и создайте каталог phplib рядом с каталогом cgi-bin. Затем скопируйте все файлы PHPLIB .inc в каталог phplib. Наконец, измените файл php.inc, просто измените строку «include_path=" на каталог phplib.
include_path — это каталог, который PHP ищет при использовании include() или require(). На моей рабочейстанции
NT путь включения следующий:
include_path = ".;i:/project52/includes;i:/project52/phplib";
В вашей системе
добавьтеinclude_path = ".;/home/httpd/includes;/home/httpd/phplib"
вверху каждой страницы PHP
.
<? php
требуется (common.php);
? >
common.php3 размещается в каталоге include и содержит все данные и функции, используемые каждой страницей. В этом примере common.php:
<? php
требуется (db_mysql.inc);
требуется (ct_sql.inc);
требуется (session.inc);
требуется (auth.inc);
требуется (perm.inc);
требуется (user.inc);
требуется (page.inc);
? >
Если вы хотите узнать назначение каждого файла inc, вы можете прочитать документацию PHPLIB по адресу http://phplib.netuse.de . Db_mysql.inc содержит определения всех классов DB_SQL. Если вы хотите использовать PostGreSQL вместо MySQL, просто используйте db_pgsql.inc вместо db_mysql.inc. Существует еще 10 файлов .inc для использования с MS SQL, Oracle, Sybase или другими базами данных.
Обратите внимание, что в этом примере require() и include() абсолютно одинаковы. Однако, если они помещены в код или используются в операторе if, использование Require() и include совершенно различно и приводит к разным результатам работы.
Расширение PHPLIB
PHPLIB обращается к базе данных через объект, созданный классом DB_Sql. Db_mysql.inc содержит класс DB_Sql, модифицированный для MySQL. Мы расширим DB_sql, добавив код в common.php после строки, содержащей db_mysql.inc.
DB_Sql содержит множество функций для запросов. Нам нужно изменить:
<? php
/* public: управление соединениями*/
function Connect($Database = "", $Host = "", $User = "", $Password = "") {
/* Обработка соединения по умолчанию */
если ("" == $База данных)
$Database = $this->Database;
если ("" == $Хост)
$Host = $this->Host;
если ("" == $Пользователь)
$User = $this->Пользователь;
if ("" == $Пароль)
$Password = $this->Password
/* Установить соединение и выбрать базу данных*/;
если ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) не удалось.");
вернуть 0;
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("невозможно использовать базу данных ".$this->Database);
вернуть 0;
}
}
Верните $this->Link_ID;
}
? >
Найдите функцию Connect() в вашем db_mysql.inc (или других файлах .inc, связанных с базой данных), затем скопируйте ее в common.php и поместите за кодом, содержащим db_mysql.inc. В конце вы также должны добавить. он инкапсулирован как определение класса.
Мне показалось, что код немного сложно читать, поэтому я сначала сделал скопированный код более читабельным:
<? php
/* public: управление соединениями*/
function Connect($Database = "", $Host = "", $User = "", $Password = "") {
/* Обработка соединения по умолчанию */
if ("" == $Database) {
$Database = $this->Database;
}
если ("" == $Host) {
$Host = $this->Host;
}
если ("" == $Пользователь) {
$User = $this->Пользователь;
}
if ("" == $Пароль) {
$Пароль = $this->Пароль;
}
/* Устанавливаем соединение и выбираем базу данных */
если ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) не удалось.");
вернуть 0;
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("невозможно использовать базу данных".$this->Database);
вернуть 0;
}
}
верните $this->Link_ID;
}
? >
Я скорректировал положение скобок и добавил скобку до и после одинарной строки. В операторе PHP if вам не нужны круглые скобки, если имеется только одна строка кода, но если вы добавите еще одну строку кода, немедленно возникнет ошибка. Поэтому я предлагаю вам добавить скобку, чтобы избежать ошибок при дальнейшем добавлении кода.
Прежде чем изменять код подключения, вы должны сначала понять, как работает метод Connect(). Он проверяет, существует ли соединение в данный момент. Если соединения нет, он создает соединение. Перед каждым запросом к базе данных сначала запускайте функцию Connect(). К сожалению, он выбирает базу данных только при первом подключении. Если ваша страница PHP использует более одной базы данных, метод Connect() не выберет другую базу данных.
Есть несколько способов изменить код. Нам нужно выбрать метод, который оказывает наименьшее влияние на PHPLIB и позволяет отображать состояние подключения к базе данных, когда нам нужно проанализировать проблему. Нам нужно сохранить идентификатор соединения и имя базы данных за пределами PHPLIB. Просто добавьте в common.php:
<? php
$db_connection = 0 // Идентификатор подключения к базе данных;
$db_database = "" // Текущее состояние базы данных? >
Далее мы изменим PHPLIB, чтобы в этих переменных хранились идентификатор соединения и имя базы данных. Вы можете установить и использовать то же имя переменной в другом коде. Если при анализе проблемы вам необходимо узнать, какая база данных используется, просто вставьте на страницу следующий код:
<? php
Print("db_database: ". $db_database. "");
? >
Как мы можем заставить метод Connect() использовать эти новые переменные? Мы можем добавить строку вверху:
<? php
{
глобальные переменные $db_connect, $db_database;
/* Обработка значений по умолчанию */
? >
С помощью этих кодов к новым переменным можно получить доступ с помощью функции Connect().
После определения $db_database добавьте:
<? php
function db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {
глобальные переменные $db_connect;
if(!empty($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user, $db_connect_pass);
}
возврат ($ db_connect);
}
функция db_database($db_database_new="") {
глобальные переменные $db_database;
if(!empty($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
}
возврат ($ db_database);
}
? >
Пока вы определяете эти общедоступные функции один раз, вы можете использовать эти общедоступные переменные в разных местах без добавления глобальных объявлений. Ниже приведены общедоступные функции, использующие указанную выше функцию базы данных:
<? php
function Connect($Database = "", $Host = "", $User = "", $Password = "") {
/* Обработка соединения по умолчанию */
if ("" == $Database) {
$Database = $this->Database;
}
если ("" == $Host) {
$Host = $this->Host;
}
если ("" == $Пользователь) {
$User = $this->Пользователь;
}
if ("" == $Пароль) {
$Пароль = $this->Пароль;
}
/* Устанавливаем соединение и выбираем базу данных */
если (0 == db_connect()) {
$this->Link_ID = db_connect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) не удалось.");
вернуть 0;
}
}
если (0 != db_connect()) {
if($Database != db_database()) {
$this->Database = db_database($Database))
if(empty($this->Database)) {
$this->halt("невозможно использовать базу данных" . $this->Database);
вернуть 0;
}
}
}
верните $this->Link_ID;
}
? >
Обратите внимание на следующие изменения:
Проверка базы данных отделена от проверки соединения, так что даже если метод Connect() имеет текущее соединение, он все равно может проверить, следует ли перейти на другую базу данных. Это означает, что db_connect() сравнивает с 0 в два раза чаще, чем раньше, но эта дополнительная обработка необходима.
Мы сохраняем подключение к базе данных и выбор базы данных за пределами PHPLIB, поэтому вы можете использовать одну и ту же функцию выбора базы данных в любом месте вашего PHP-кода.
Однако существует ограничение текущей обработки. Здесь мы предполагаем, что для всех баз данных используются один и тот же хост, пользователь и пароль. Если ваша база данных имеет разные разрешения для разных пользователей, вам необходимо установить специальное соединение для доступа к ней. Как? Просто определите следующие переменные:
<? php
$db_host = "";
$db_user = "";
$db_pass = "";
? >
Расширив функцию db_database(), сравните текущего пользователя и хост с определенным пользователем и хостом. Вы также можете добавить:
<? php
$db_type = "";
? >
Эта переменная используется для хранения типа базы данных: MySQL или Oracle и т. д. Таким образом, вы можете получить доступ к нескольким базам данных.
Но изменить код для работы с несколькими разными типами баз данных довольно сложно. Вам также необходимо изменить функцию запроса, а также функции соединения и выбора. Возможно, вы сможете подключиться через ODBC PHP, а затем использовать параметры ODBC PHPLIB для его обработки. ODBC обрабатывает несколько баз данных одинаковым образом, поэтому он будет медленнее. ODBC позволяет использовать один и тот же код для обработки нескольких разных типов баз данных. Но возникнут проблемы, когда нужно будет использовать даты в разных форматах обработки, а также будут некоторые странные различия между базами данных. ODBC только упрощает соединение, но не изменяет способ интерпретации данных и SQL базой данных.
Теперь давайте узнаем, как переопределить класс объекта. Функция Connect() инкапсулирована в определение класса:
<? php
класс DB_Sql {
}
? >
Когда мы копируем эту функцию в common.php, мы должны переопределить класс DB_Sql. Мы можем инкапсулировать функцию Connect() следующим образом:
<? php
класс db_DB_Sql расширяет DB_Sql {
}
? >
Чтобы узнать больше о работе «расширений», мы можем взглянуть на раздел об объектах и классах в документации PHP. Проще говоря: любое определение в расширении заменяет и отменяет все предыдущие определения.
Теперь можно использовать db_DB_Sql. Когда вы настраиваете PHPLIB, вы делаете следующее заявление:
<? php
$x = новый DB_Sql;
? > Измените его на: <? php
$x = новый db_DB_Sql;
? >
Таким образом вы сможете использовать модифицированный класс вместо предыдущего.
При возникновении ошибки при подключении к базе данных вы можете вывести текущий статус подключения во внешней функции. Если в операторе SQL возникает ошибка, вы также можете скопировать функцию query() из DB_Sql в db_DB_Sql в common.PHP, а затем вставить выходной оператор, чтобы увидеть текущий оператор SQL.
Вы также можете записать информацию об ошибках или диагностическую информацию в файл на диске. Определив
$db_log_file = "t:/diag.txt"
или аналогичный текстовый файл. Если вы используете Windows, вам необходимо убедиться, что каталог существует, иначе вы получите сообщение об ошибке.
Затем определите функцию:
<? php
функция db_log($db_log_message) {
глобальные переменные $db_log_file;
$db_log_f = fopen($db_log_file, "а");
fwrite($db_log_f, date("Y md H:i:s")." ".$db_log_message."rn");
fclose($db_log_f);
}
? >
Там, где необходимо записать информацию, добавьте следующий код:
<? php
db_log("текущая база данных: " . db_database());
? >
На самом деле вы можете использовать встроенные или системные файлы журналов. Но тогда вам придется найти небольшую часть информации во множестве файлов. Таким образом, этот отдельный файл журнала поможет вам при тестировании. Я предлагаю написать следующий код до и после записи:
<? php
db_log("текущая база данных: " . db_database());
db_database("каталог книг");
db_log("текущая база данных: " . db_database());
? >
При доступе к данным не забудьте использовать правильную базу данных, а не базу данных, определенную в PHPLIB. Вы можете создать функцию-оболочку для базы данных или изменить используемую функцию. Если вы используете mysql_query(), вы можете сначала использовать db_database(), вы можете использовать
<? php
$result = mysql_db_query(db_database("bookcatalogue"), "выбрать * из?",
db_connect());
? > что предполагает функцию: <? php
функция db_query($db_query_database, $db_query_sql) {
return(mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
? >
вместо
<? php
db_database("каталог книг");
$result = mysql_query("выбрать * из?", db_connect());
? Теперь
вы можете это сделать
. Используйте PHPLIB (или подобное программное обеспечение) для доступа к нескольким базам данных.
.расширить класс/объект
.Вставьте диагностические тесты
.Создание файлов журналов