PHPLIB ist eine Erweiterungsbibliothek von PHP, mit der wir problemlos verschiedene Vorgänge in der Datenbank ausführen können. Wenn Sie jedoch mehrere Datenbanken verwenden möchten, wird in diesem Artikel beschrieben, wie Sie PHPLIB erweitern können Sie haben das Beste aus beiden Welten, während Sie PHPLIB verwenden, und Sie können auch etwas über objektorientierte Programmierung lernen und erfahren, wie Sie die Bibliothek erweitern können.
Datenbankverwaltung
Sie können jede beliebige Tabelle in eine große Datenbank einfügen. Mit der Zeit wird die Datenbank jedoch immer größer. Der Server kann mit der IO-Arbeit nicht Schritt halten oder verfügt möglicherweise nicht über genügend Speicher, um alle Zugriffe zu bewältigen. Es ist sehr schwierig, vorhandene Daten zu trennen. Es ist ratsam, mit separaten Datenbanken zu beginnen und eine effiziente Datenbankverwaltung zu implementieren. Wenn Sie eine Website haben, auf der Bücher verkauft werden, verfügen Sie wahrscheinlich über eine Liste der Autoren, eine Liste der Buchpreise und eine Liste des aktuellen Lagerbestands und der Bestellungen. Wenn Ihr Unternehmen wächst, nehmen die Bestellungen weiter zu, und die Verarbeitung jeder Bestellung erfordert viel Festplattenzugriff. Höchstwahrscheinlich werden Sie irgendwann alle Ihre Bestellungen in ein Buchhaltungssystem eingeben.
Legen Sie nun die Bestellungen in einer separaten Datenbank ab. Da der Lagerbestand auch über Bestellungen aktualisiert wird, werden auch die Lagerbestände in derselben Datenbank abgelegt.
Die Autorenliste und die Buchliste sind statische Informationen, die häufig gelesen, aber selten aktualisiert werden müssen. In der Praxis muss die Aktualisierung der Aufzeichnungen eines Autors möglicherweise nur alle fünf Jahre erfolgen, und zwar nur dann, wenn der Autor ein neues Buch schreibt (oder stirbt). Der Server, auf dem diese Daten gehostet werden, kann völlig anders konfiguriert werden als der Server, auf dem sich die Bestelldatenbank befindet.
Enthält PHPLIB
PHPLIB greift über eine Klasse namens DB_Sql auf SQL-Datenbanken zu. Abhängig von der Art der Datenbank, die Sie verwenden müssen, fügen Sie unterschiedliche INC-Dateien in Ihren Code ein. In diesem Beispiel verwende ich die MySQL-Version.
Um DB_Sql in Ihrem Code zu verwenden, installieren Sie die PHPLIB-Dateien in einem eigenen Verzeichnis. Suchen Sie dann Ihr cgi-bin-Verzeichnis und erstellen Sie das phplib-Verzeichnis neben dem cgi-bin-Verzeichnis. Als nächstes kopieren Sie alle PHPLIB .inc-Dateien in das phplib-Verzeichnis. Ändern Sie abschließend die Datei php.inc. Ändern Sie einfach die Zeile „include_path =“ in das Verzeichnis phplib.
include_path ist das Verzeichnis, nach dem PHP sucht, wenn include() oder require() verwendet wird. Auf meiner NT-Workstation lautet der Include-Pfad:
include_path = ".;i:/project52/includes;i:/project52/phplib"
;
Fügen Sieauf Ihrem System
oben auf jeder PHP-Seite
include_path = ".;/home/httpd/includes;/home/httpd/phplib";
<? php
erfordern(common.php);
? >
common.php3 wird im Includes-Verzeichnis abgelegt und enthält alle von jeder Seite verwendeten Daten und Funktionen. In diesem Beispiel lautet common.php:
<? php
require(db_mysql.inc);
require(ct_sql.inc);
require(session.inc);
require(auth.inc);
require(perm.inc);
require(user.inc);
require(page.inc);
? >
Wenn Sie den Zweck jeder Inc-Datei wissen möchten, können Sie die PHPLIB-Dokumentation unter http://phplib.netuse.de lesen. Db_mysql.inc enthält die Definitionen aller DB_SQL-Klassen. Wenn Sie PostGreSQL anstelle von MySQL verwenden möchten, verwenden Sie einfach db_pgsql.inc anstelle von db_mysql.inc. Es gibt 10 weitere .inc-Dateien zur Verwendung mit MS SQL, Oracle, Sybase oder anderen Datenbanken.
Beachten Sie, dass in diesem Beispiel require() und include() genau gleich sind. Wenn sie jedoch im Code platziert oder in einer if-Anweisung verwendet werden, ist die Verwendung von Require() und include völlig unterschiedlich und führt zu unterschiedlichen Ausführungsergebnissen.
Erweitern von PHPLIB
PHPLIB greift über ein von der DB_Sql-Klasse generiertes Objekt auf die Datenbank zu. Db_mysql.inc enthält die für MySQL modifizierte DB_Sql-Klasse. Wir werden DB_sql erweitern, indem wir nach der Zeile, die db_mysql.inc enthält, Code zu common.php hinzufügen.
DB_Sql enthält viele Funktionen zum Abfragen. Was wir ändern müssen, ist:
<? php
/* public: Verbindungsverwaltung*/
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* Standardverbindung verarbeiten */
if ("" == $Database)
$Database = $this->Database;
if ("" == $Host)
$Host = $this->Host;
if ("" == $User)
$User = $this->User;
if ("" == $Password)
$Password = $this->Password;
/* Verbindung herstellen und Datenbank auswählen*/
if ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) fehlgeschlagen.");
0 zurückgeben;
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("Datenbank kann nicht verwendet werden".$this->Database);
0 zurückgeben;
}
}
return $this->Link_ID;
}
? >
Suchen Sie die Funktion connect() in Ihrer db_mysql.inc (oder anderen datenbankbezogenen .inc-Dateien), kopieren Sie sie dann nach common.php und fügen Sie sie hinter den Code ein, der db_mysql.inc enthält. Am Ende müssen Sie auch hinzufügen Es ist als Klassendefinition gekapselt.
Ich fand den Code etwas schwer lesbar, daher habe ich zunächst den kopierten Code lesbarer gemacht:
<? php
/* public: Verbindungsverwaltung*/
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* Standardverbindung verarbeiten */
if ("" == $Database) {
$Database = $this->Database;
}
if ("" == $Host) {
$Host = $this->Host;
}
if ("" == $User) {
$User = $this->User;
}
if ("" == $Password) {
$Password = $this->Password;
}
/* Verbindung herstellen und Datenbank auswählen */
if ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) fehlgeschlagen.");
0 zurückgeben;
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("Datenbank kann nicht verwendet werden".$this->Database);
0 zurückgeben;
}
}
return $this->Link_ID;
}
? >
Ich habe die Position der Klammern angepasst und vor und nach der einzelnen Zeile eine geschweifte Klammer eingefügt. In der if-Anweisung von PHP benötigen Sie keine Klammern, wenn nur eine Codezeile vorhanden ist. Wenn Sie jedoch eine weitere Codezeile hinzufügen, tritt sofort ein Fehler auf. Daher empfehle ich Ihnen, eine Klammer hinzuzufügen, um Fehler beim späteren Hinzufügen von Code zu vermeiden.
Bevor Sie den Connect-Code ändern, müssen Sie zunächst verstehen, wie connect() funktioniert. Es prüft, ob derzeit eine Verbindung besteht. Wenn keine Verbindung besteht, wird eine Verbindung hergestellt. Führen Sie vor jeder Datenbankabfrage zunächst diese connect()-Funktion aus. Leider wird die Datenbank nur beim ersten Herstellen einer Verbindung ausgewählt. Wenn Ihre PHP-Seite mehr als eine Datenbank verwendet, wählt connect() keine andere Datenbank aus.
Es gibt verschiedene Möglichkeiten, den Code zu ändern. Wir müssen eine Methode wählen, die PHPLIB am wenigsten beeinträchtigt und es uns ermöglicht, den Datenbankverbindungsstatus anzuzeigen, wenn wir das Problem analysieren müssen. Wir müssen die Verbindungs-ID und den Datenbanknamen außerhalb von PHPLIB speichern. Fügen Sie einfach common.php hinzu:
<? php
$db_connection = 0; // ID der Datenbankverbindung
$db_database = ""; // Aktueller Datenbankstatus? >
Als nächstes ändern wir PHPLIB, um die Verbindungs-ID und den Datenbanknamen in diesen Variablen zu speichern. Sie können denselben Variablennamen in anderem Code festlegen und verwenden. Wenn Sie bei der Problemanalyse wissen möchten, welche Datenbank verwendet wird, fügen Sie einfach den folgenden Code in die Seite ein:
<? php
Print(" db_database: " . $db_database . "");
? >
Wie können wir connect() dazu bringen, diese neuen Variablen zu verwenden? Wir können oben eine Zeile hinzufügen:
<? php
{
Globals $db_connect, $db_database;
/* Standardwerte behandeln */
? >
Über diese Codes kann mit connect() auf die neuen Variablen zugegriffen werden.
Fügen Sie nach der Definition von $db_database Folgendes hinzu:
<? php
Funktion db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {
Globals $db_connect;
if(!empty($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user, $db_connect_pass);
}
return($db_connect);
}
Funktion db_database($db_database_new="") {
Globals $db_database;
if(!empty($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
}
return($db_database);
}
? >
Solange Sie diese öffentlichen Funktionen einmal definieren, können Sie diese öffentlichen Variablen an verschiedenen Stellen verwenden, ohne globale Deklarationen hinzuzufügen. Im Folgenden sind die öffentlichen Funktionen aufgeführt, die die obige Datenbankfunktion verwenden:
<? php
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* Standardverbindung verarbeiten */
if ("" == $Database) {
$Database = $this->Database;
}
if ("" == $Host) {
$Host = $this->Host;
}
if ("" == $User) {
$User = $this->User;
}
if ("" == $Password) {
$Password = $this->Password;
}
/* Verbindung herstellen und Datenbank auswählen */
if (0 == db_connect()) {
$this->Link_ID = db_connect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) fehlgeschlagen.");
0 zurückgeben;
}
}
if (0 != db_connect()) {
if($Database != db_database()) {
$this->Database = db_database($Database))
if(empty($this->Database)) {
$this->halt("Datenbank kann nicht verwendet werden". $this->Database);
0 zurückgeben;
}
}
}
return $this->Link_ID;
}
? >
Beachten Sie folgende Änderungen:
Der Test der Datenbank ist vom Test der Verbindung getrennt, sodass connect() auch dann prüfen kann, ob eine aktuelle Verbindung besteht, ob zu einer anderen Datenbank gewechselt werden soll. Das bedeutet, dass db_connect() doppelt so oft mit 0 verglichen wird wie zuvor, diese zusätzliche Verarbeitung ist jedoch notwendig.
Wir halten die Datenbankverbindung und Datenbankauswahl außerhalb von PHPLIB, sodass Sie überall in Ihrem PHP-Code dieselbe Datenbankauswahlfunktion verwenden können.
Allerdings gibt es eine Einschränkung der aktuellen Verarbeitung. Dabei gehen wir davon aus, dass für alle Datenbanken der gleiche Host, Benutzer und Passwort verwendet wird. Wenn Ihre Datenbank unterschiedliche Berechtigungen für verschiedene Benutzer hat, müssen Sie eine spezielle Verbindung herstellen, um darauf zuzugreifen. Wie? Definieren Sie einfach die folgenden Variablen:
<? php
$db_host = "";
$db_user = "";
$db_pass = "";
? >
Vergleichen Sie durch Erweitern der Funktion db_database() den aktuellen Benutzer und Host mit einem bestimmten Benutzer und Host. Sie können auch Folgendes hinzufügen:
<? php
$db_type = "";
? >
Diese Variable wird zum Speichern des Datenbanktyps, MySQL oder Oracle usw. verwendet. Auf diese Weise können Sie auf mehrere Datenbanken zugreifen.
Aber den Code so zu ändern, dass er mehrere verschiedene Datenbanktypen verarbeiten kann, ist ziemlich kompliziert. Außerdem müssen Sie die Abfragefunktion sowie die Join- und Auswahlfunktionen ändern. Möglicherweise können Sie eine Verbindung über PHPs ODBC herstellen und dann die ODBC-Optionen von PHPLIB verwenden, um damit umzugehen. ODBC verarbeitet mehrere Datenbanken auf gemeinsame Weise und ist daher langsamer. Mit ODBC können Sie denselben Code verwenden, um mehrere verschiedene Datenbanktypen zu verwalten. Es wird jedoch Probleme geben, wenn Datumsangaben in unterschiedlichen Verarbeitungsformaten verwendet werden müssen, und es wird auch einige seltsame Unterschiede zwischen Datenbanken geben. ODBC vereinfacht nur die Verbindung, verändert aber nicht die Art und Weise, wie die Datenbank Daten und SQL interpretiert.
Jetzt lernen wir, wie man eine Objektklasse neu definiert. Die Funktion connect() ist in einer Klassendefinition gekapselt:
<? php
Klasse DB_Sql {
}
? >
Wenn wir diese Funktion nach common.php kopieren, müssen wir die DB_Sql-Klasse neu definieren. Wir können connect() wie folgt kapseln:
<? php
Klasse db_DB_Sql erweitert DB_Sql {
}
? >
Um mehr über die Funktionsweise von „extends“ zu erfahren, können wir einen Blick auf den Abschnitt über Objekte und Klassen in der PHP-Dokumentation werfen. Einfach ausgedrückt: Jede Definition in der Erweiterung ersetzt und überschreibt alle vorherigen Definitionen.
db_DB_Sql kann jetzt verwendet werden. Wenn Sie PHPLIB konfigurieren, geben Sie die folgende Anweisung ab:
<? php
$x = new DB_Sql;
? > Ändern Sie es in: <? php
$x = new db_DB_Sql;
? >
Auf diese Weise können Sie die geänderte Klasse anstelle der vorherigen verwenden.
Wenn bei der Verbindung zur Datenbank ein Fehler auftritt, können Sie den aktuellen Verbindungsstatus in einer externen Funktion ausgeben. Wenn in der SQL-Anweisung ein Fehler auftritt, können Sie auch die Funktion query() in DB_Sql nach db_DB_Sql in common.PHP kopieren und dann eine Ausgabeanweisung einfügen, um zu sehen, was die aktuelle SQL-Anweisung ist.
Sie können Fehler- oder Diagnoseinformationen auch in eine Festplattendatei schreiben. Durch die Definition von
$db_log_file = "t:/diag.txt"
oder einer ähnlichen Textdatei. Wenn Sie Windows verwenden, müssen Sie sicherstellen, dass das Verzeichnis vorhanden ist, andernfalls erhalten Sie eine Fehlermeldung.
Definieren Sie dann eine Funktion:
<? php
Funktion db_log($db_log_message) {
Globals $db_log_file;
$db_log_f = fopen($db_log_file, "a");
fwrite($db_log_f, date("Y md H:i:s")." ".$db_log_message."rn");
fclose($db_log_f);
}
? >
Wo Sie Informationen aufzeichnen müssen, fügen Sie den folgenden Code hinzu:
<? php
db_log("aktuelle Datenbank: " . db_database());
? >
Tatsächlich können Sie integrierte oder Systemprotokolldateien verwenden. Aber dann muss man in vielen Dateien eine kleine Information finden. Daher hilft Ihnen diese separate Protokolldatei beim Testen. Ich schlage vor, vor und nach der Aufnahme den folgenden Code zu schreiben:
<? php
db_log("aktuelle Datenbank: " . db_database());
db_database("bookcatalog");
db_log("aktuelle Datenbank: " . db_database());
? >
Denken Sie beim Zugriff auf Daten daran, die richtige Datenbank zu verwenden, nicht die in PHPLIB definierte Datenbank. Sie können eine Wrapper-Funktion für die Datenbank erstellen oder die von Ihnen verwendete Funktion ändern. Wenn Sie mysql_query() verwenden, können Sie zuerst db_database() verwenden, Sie können
<? php
$result = mysql_db_query(db_database("bookcatalogue"), "select * from?",
db_connect());
? > was die Funktion nahelegt: <? php
Funktion db_query($db_query_database, $db_query_sql) {
return(mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
? >
statt
<? php
db_database("bookcatalog");
$result = mysql_query("select * from?", db_connect());
? Jetzt
können Sie
PHPLIB (oder eine ähnliche Software) verwenden, um auf mehrere Datenbanken zuzugreifen
.Klasse/Objekt erweitern
.Diagnosetests einfügen
.Protokolldateien erstellen