PHPLIB est une bibliothèque d'extension de PHP. Nous pouvons l'utiliser pour effectuer facilement diverses opérations sur la base de données. Cependant, si vous souhaitez utiliser plusieurs bases de données, cela dépassera vos capacités. Vous avez le meilleur des deux mondes. Vous pouvez utiliser plusieurs bases de données tout en utilisant PHPLIB, et vous pouvez également en apprendre davantage sur la programmation orientée objet et sur la manière d'étendre la bibliothèque.
Gestion de base de données
Vous pouvez placer n'importe quelle table dans une grande base de données. Cependant, au fil du temps, la base de données deviendra de plus en plus grande. Le serveur pourrait ne pas être en mesure de suivre le travail d'E/S ou ne pas avoir suffisamment de mémoire pour gérer tous les accès ? Il est très difficile de séparer les données existantes. Il est sage de commencer avec des bases de données distinctes et de mettre en œuvre une gestion efficace des bases de données. Si vous possédez un site Web qui vend des livres, vous disposez probablement d'une liste d'auteurs, d'une liste de prix des livres et d'une liste de l'inventaire et des commandes en cours. À mesure que votre entreprise se développe, les commandes continueront d'augmenter et le traitement de chaque commande nécessite un accès important au disque. Il est fort probable que vous placerez toutes vos commandes dans un système comptable à un moment donné.
Maintenant, placez les commandes dans une base de données distincte. Puisque l'inventaire est également mis à jour via les commandes, les quantités en stock sont également placées dans la même base de données.
La liste des auteurs et la liste des livres sont des informations statiques qui doivent être lues fréquemment mais rarement mises à jour. En pratique, la mise à jour du dossier d'un auteur ne doit être effectuée qu'une fois tous les cinq ans, uniquement lorsque l'auteur écrit un nouveau livre (ou décède). Le serveur hébergeant ces données peut être configuré de manière complètement différente du serveur hébergeant la base de données des commandes.
Contient PHPLIB
PHPLIB accède aux bases de données SQL via une classe appelée DB_Sql. Selon le type de base de données que vous devez utiliser, incluez différents fichiers inc dans votre code. Dans cet exemple, j'utilise la version MySQL.
Afin d'utiliser DB_Sql dans votre code, installez les fichiers PHPLIB dans leur propre répertoire. Ensuite, recherchez votre répertoire cgi-bin et créez le répertoire phplib à côté du répertoire cgi-bin. Ensuite, copiez tous les fichiers PHPLIB .inc dans le répertoire phplib. Enfin, modifiez le fichier php.inc, remplacez simplement la ligne "include_path=" par le répertoire phplib.
include_path est le répertoire recherché par PHP lors de l'utilisation de include() ou require(). Sur mon poste de travail NT, le chemin d'inclusion est :
include_path = ".;i:/project52/includes;i:/project52/phplib"
sous Linux. Sur votre système,
ajoutezinclude_path = ".;/home/httpd/includes;/home/httpd/phplib";
en haut de chaque page PHP.
<? php
require(common.php);
? >
common.php3 est placé dans le répertoire include et contient toutes les données et fonctions utilisées par chaque page. Dans cet exemple, common.php est :
<? php
require(db_mysql.inc);
require(ct_sql.inc);
require(session.inc);
require(auth.inc);
require(perm.inc);
require(user.inc);
require(page.inc);
? >
Si vous souhaitez connaître le but de chaque fichier inc, vous pouvez lire la documentation PHPLIB sur http://phplib.netuse.de . Db_mysql.inc contient les définitions de toutes les classes DB_SQL. Si vous souhaitez utiliser PostGreSQL au lieu de MySQL, utilisez simplement db_pgsql.inc au lieu de db_mysql.inc. Il existe 10 autres fichiers .inc à utiliser avec MS SQL, Oracle, Sybase ou d'autres bases de données.
Notez que dans cet exemple, require() et include() sont exactement les mêmes. Cependant, si elles sont placées dans le code ou utilisées dans une instruction if, l'utilisation de Require() et include sont complètement différentes et ont des résultats d'exécution différents.
Extension de PHPLIB
PHPLIB accède à la base de données via un objet généré par la classe DB_Sql. Db_mysql.inc contient la classe DB_Sql modifiée pour MySQL. Nous allons étendre DB_sql en ajoutant du code à common.php après la ligne contenant db_mysql.inc.
DB_Sql contient de nombreuses fonctions d'interrogation. Ce que nous devons modifier est :
< ? php
/* public : gestion des connexions*/
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* Gérer la connexion par défaut */
si ("" == $Base de données)
$Base de données = $this->Base de données ;
si ("" == $Hôte)
$Hôte = $this->Hôte ;
si ("" == $Utilisateur)
$Utilisateur = $this->Utilisateur ;
si ("" == $Mot de passe)
$Password = $this->Password;
/* Établir la connexion et sélectionner la base de données*/
si ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
si ($this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) a échoué.");
renvoie 0 ;
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("ne peut pas utiliser la base de données ".$this->Database);
renvoie 0 ;
}
}
return $this->Link_ID ;
}
? >
Recherchez la fonction connect() dans votre db_mysql.inc (ou d'autres fichiers .inc liés à la base de données), puis copiez-la dans common.php et placez-la derrière le code qui contient db_mysql.inc. À la fin, vous devez également ajouter. il est encapsulé en tant que définition de classe.
J'ai trouvé le code un peu difficile à lire, j'ai donc d'abord rendu le code copié plus lisible :
<? php
/* public : gestion des connexions*/
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* Gérer la connexion par défaut */
si ("" == $Base de données) {
$Base de données = $this->Base de données ;
}
si ("" == $Hôte) {
$Hôte = $this->Hôte ;
}
si ("" == $Utilisateur) {
$Utilisateur = $this->Utilisateur ;
}
si ("" == $Mot de passe) {
$Mot de passe = $this->Mot de passe ;
}
/* Établir la connexion et sélectionner la base de données */
si ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
si ($this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) a échoué.");
renvoie 0 ;
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("ne peut pas utiliser la base de données ".$this->Database);
renvoie 0 ;
}
}
retourner $this->Link_ID ;
}
? >
J'ai ajusté la position des crochets et ajouté une accolade avant et après la ligne unique. Dans l'instruction if de PHP, vous n'avez pas besoin de parenthèses s'il n'y a qu'une seule ligne de code, mais si vous ajoutez une ligne de code supplémentaire, une erreur se produira immédiatement. Par conséquent, je vous suggère d'ajouter un crochet pour éviter les erreurs lors de l'ajout de code ultérieur.
Avant de modifier le code de connexion, vous devez d'abord comprendre comment fonctionne connect(). Il vérifie si une connexion existe actuellement. S'il n'y a pas de connexion, il crée une connexion. Avant chaque requête de base de données, exécutez d’abord cette fonction connect(). Malheureusement, il ne sélectionne la base de données que lors de la première connexion. Si votre page PHP utilise plusieurs bases de données, connect() ne sélectionnera pas une autre base de données.
Il existe différentes manières de modifier le code. Nous devons choisir une méthode qui a le moins d'impact sur PHPLIB et qui nous permet d'afficher l'état de connexion à la base de données lorsque nous devons analyser le problème. Nous devons enregistrer l'identifiant de connexion et le nom de la base de données en dehors de PHPLIB. Ajoutez simplement common.php :
<? php
$db_connection = 0; // ID de connexion à la base de données
$db_database = "" // Statut actuel de la base de données ? >
Ensuite, nous modifierons PHPLIB pour stocker l'identifiant de connexion et le nom de la base de données dans ces variables. Vous pouvez définir et utiliser le même nom de variable dans un autre code. Lors de l'analyse du problème, si vous avez besoin de savoir quelle base de données est utilisée, insérez simplement le code suivant dans la page :
<? php
Print(" db_database : " . $db_database . "");
? >
Comment faire en sorte que connect() utilise ces nouvelles variables ? On peut ajouter une ligne en haut :
<? php
{
globales $db_connect, $db_database ;
/* Gérer les valeurs par défaut */
? >
Grâce à ces codes, les nouvelles variables sont accessibles par connect()
Après avoir défini $db_database, ajoutez :
<? php
function db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {
globales $db_connect;
si(!empty($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user, $db_connect_pass);
}
return($db_connect);
}
fonction db_database($db_database_new="") {
globales $db_database ;
si(!empty($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
}
return($db_database);
}
? >
Tant que vous définissez ces fonctions publiques une fois, vous pouvez utiliser ces variables publiques à différents endroits sans ajouter de déclarations globales. Voici les fonctions publiques utilisant la fonction db ci-dessus :
<? php
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* Gérer la connexion par défaut */
si ("" == $Base de données) {
$Base de données = $this->Base de données ;
}
si ("" == $Hôte) {
$Hôte = $this->Hôte ;
}
si ("" == $Utilisateur) {
$Utilisateur = $this->Utilisateur ;
}
si ("" == $Mot de passe) {
$Mot de passe = $this->Mot de passe ;
}
/* Établir la connexion et sélectionner la base de données */
si (0 == db_connect()) {
$this->Link_ID = db_connect($Host, $User, $Password);
si ($this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) a échoué.");
renvoie 0 ;
}
}
si (0 != db_connect()) {
si($Base de données != db_database()) {
$this->Base de données = db_database($Base de données))
if(empty($this->Base de données)) {
$this->halt("ne peut pas utiliser la base de données " . $this->Database);
renvoie 0 ;
}
}
}
retourner $this->Link_ID ;
}
? >
Faites attention aux changements suivants :
Le test de la base de données est séparé du test de la connexion, de sorte que même si connect() a une connexion actuelle, il peut toujours vérifier s'il faut passer à une autre base de données. Cela signifie que db_connect() se compare à 0 deux fois plus souvent qu'auparavant, mais ce traitement supplémentaire est nécessaire.
Nous conservons la connexion à la base de données et la sélection de la base de données en dehors de PHPLIB afin que vous puissiez utiliser la même fonction de sélection de base de données n'importe où dans votre code PHP.
Cependant, il existe une limitation du traitement actuel. Nous supposons ici que le même hôte, utilisateur et mot de passe sont utilisés pour toutes les bases de données. Si votre base de données dispose d'autorisations différentes pour différents utilisateurs, vous devez établir une connexion spéciale pour y accéder. Comment? Définissez simplement les variables suivantes :
<? php
$db_host = "";
$db_user = "";
$db_pass = "";
? >
En étendant la fonction db_database(), comparez l'utilisateur et l'hôte actuels avec un certain utilisateur et un certain hôte. Vous pouvez également ajouter :
<? php
$db_type = "";
? >
Cette variable permet de stocker le type de base de données, mysql ou Oracle, etc. De cette façon, vous pouvez accéder à plusieurs bases de données.
Mais changer le code pour gérer plusieurs types de bases de données différents est assez compliqué. Vous devez également modifier la fonction de requête, ainsi que les fonctions de jointure et de sélection. Vous pourrez peut-être vous connecter via l'ODBC de PHP, puis utiliser les options ODBC de PHPLIB pour le gérer. ODBC gère plusieurs bases de données de manière commune, il sera donc plus lent. ODBC vous permet d'utiliser le même code pour gérer plusieurs types de bases de données différents. Mais il y aura des problèmes lorsqu'il faudra utiliser des dates dans différents formats de traitement, et il y aura également d'étranges différences entre les bases de données. ODBC simplifie uniquement la connexion, mais ne modifie pas la façon dont la base de données interprète les données et SQL.
Apprenons maintenant à redéfinir une classe d'objets. La fonction connect() est encapsulée dans une définition de classe :
<? php
classe DB_Sql {
}
? >
Lorsque nous copions cette fonction dans common.php, nous devons redéfinir la classe DB_Sql. Nous pouvons encapsuler connect() comme ceci :
<? php
la classe db_DB_Sql étend DB_Sql {
}
? >
Pour en savoir plus sur le fonctionnement des "extends", on peut jeter un oeil à la section sur les objets et les classes dans la documentation PHP. En termes simples : toute définition de l’extension remplace et remplace toutes les définitions précédentes.
db_DB_Sql peut désormais être utilisé. Lorsque vous configurez PHPLIB, vous effectuez la déclaration suivante :
<? php
$x = nouveau DB_Sql ;
? > Remplacez-le par : <? php
$x = nouveau db_DB_Sql ;
? >
De cette façon, vous pouvez utiliser la classe modifiée à la place de la précédente.
Lorsqu'une erreur se produit lors de la connexion à la base de données, vous pouvez afficher l'état actuel de la connexion dans une fonction externe. Si une erreur se produit dans l'instruction SQL, vous pouvez également copier la fonction query() dans DB_Sql vers db_DB_Sql dans common.PHP, puis insérer une instruction de sortie pour voir quelle est l'instruction SQL actuelle.
Vous pouvez également écrire des informations d'erreur ou de diagnostic dans un fichier disque. En définissant
$db_log_file = "t:/diag.txt"
ou un fichier texte similaire. Si vous utilisez Windows, vous devez vous assurer que le répertoire existe, sinon vous recevrez un message d'erreur.
Définissez ensuite une fonction :
<? php
fonction 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);
}
? >
Là où vous devez enregistrer des informations, ajoutez le code suivant :
<? php
db_log("base de données actuelle : " . db_database());
? >
En fait, vous pouvez utiliser des fichiers journaux intégrés ou système. Mais il faut ensuite trouver une petite information dans un grand nombre de fichiers. Ce fichier journal distinct vous aide donc à effectuer les tests. Je suggère d'écrire le code suivant avant et après l'enregistrement :
<? php
db_log("base de données actuelle : " . db_database());
db_database("livrecatalogue");
db_log("base de données actuelle : " . db_database());
? >
Lors de l'accès aux données, pensez à utiliser la bonne base de données, et non la base de données définie dans PHPLIB. Vous pouvez créer une fonction wrapper pour la base de données ou modifier la fonction que vous utilisez. Si vous utilisez mysql_query(), vous pouvez d'abord utiliser db_database(), vous pouvez utiliser
<? php
$result = mysql_db_query(db_database("bookcatalogue"), "select * from?",
db_connect());
? > qui suggère la fonction : <? php
fonction db_query($db_query_database, $db_query_sql) {
return(mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
? >
au lieu de
<? php
db_database("livrecatalogue");
$result = mysql_query("select * from?", db_connect());
?
maintenant
le faire
. Utilisez PHPLIB (ou un logiciel similaire) pour accéder à plusieurs bases de données.
.extend classe/objet
.Insérer des tests de diagnostic
.Créer des fichiers journaux