PHPLIB son algunas bibliotecas de extensión de PHP. Podemos usarlas para realizar fácilmente varias operaciones en la base de datos. Sin embargo, si desea usar varias bases de datos, estará más allá de sus capacidades. Este artículo presenta cómo extender PHPLIB para permitirle usar. Tiene lo mejor de ambos mundos. Puede usar múltiples bases de datos mientras usa PHPLIB, y también puede aprender sobre programación orientada a objetos y cómo ampliar la biblioteca.
Gestión de bases de datos
Puede colocar cualquier tabla en una base de datos grande. Sin embargo, con el tiempo, la base de datos se hará cada vez más grande. Es posible que el servidor no pueda seguir el ritmo del trabajo de IO o que no tenga suficiente memoria para hacer frente a todos los accesos. Es muy difícil separar los datos existentes. Es aconsejable comenzar con bases de datos separadas e implementar una gestión eficiente de las bases de datos. Si tiene un sitio web que vende libros, probablemente tenga una lista de autores, una lista de precios de libros y una lista de inventario y pedidos actuales. A medida que su negocio crezca, los pedidos seguirán creciendo y procesar cada pedido requiere mucho acceso al disco. Lo más probable es que en algún momento coloques todos tus pedidos en un sistema de contabilidad.
Ahora coloque los pedidos en una base de datos separada. Dado que el inventario también se actualiza mediante pedidos, las cantidades del inventario también se colocan en la misma base de datos.
La lista de autores y la lista de libros son información estática que debe leerse con frecuencia pero rara vez se actualiza. En la práctica, es posible que solo sea necesario actualizar el registro de un autor una vez cada cinco años, únicamente cuando el autor escribe un nuevo libro (o muere). El servidor que aloja estos datos se puede configurar de forma completamente diferente al servidor que aloja la base de datos de pedidos.
Contiene PHPLIB
PHPLIB accede a bases de datos SQL a través de una clase llamada DB_Sql. Dependiendo del tipo de base de datos que necesite utilizar, incluya diferentes archivos inc en su código. En este ejemplo estoy usando la versión MySQL.
Para utilizar DB_Sql en su código, instale los archivos PHPLIB en su propio directorio. Luego, busque su directorio cgi-bin y cree el directorio phplib al lado del directorio cgi-bin. A continuación, copie todos los archivos PHPLIB .inc al directorio phplib. Finalmente, modifique el archivo php.inc, simplemente cambie la línea "include_path=" al directorio phplib.
include_path es el directorio que PHP busca cuando usa include() o require(). En mi estación de trabajo NT, la ruta de inclusión es:
include_path
= ".;i:/project52/includes;i:/project52/phplib";
En su sistema,
agregueinclude_path = ".;/home/httpd/includes;/home/httpd/phplib"
;
<? PHP
requerir(común.php);
? >
common.php3 se coloca en el directorio de inclusión y contiene todos los datos y funciones utilizados por cada página. En este ejemplo, common.php es:
<? PHP
requerir(db_mysql.inc);
requerir(ct_sql.inc);
requerir(sesión.inc);
requerir(auth.inc);
requerir(perm.inc);
requerir(usuario.inc);
requerir(página.inc);
? >
Si desea conocer el propósito de cada archivo inc, puede leer la documentación PHPLIB en http://phplib.netuse.de . Db_mysql.inc contiene las definiciones de todas las clases DB_SQL. Si desea utilizar PostGreSQL en lugar de MySQL, simplemente utilice db_pgsql.inc en lugar de db_mysql.inc. Hay otros 10 archivos .inc para usar con MS SQL, Oracle, Sybase u otras bases de datos.
Tenga en cuenta que en este ejemplo, require() e include() son exactamente iguales. Sin embargo, si se coloca en el código o se usa en una declaración if, el uso de Require() e include son completamente diferentes y tienen diferentes resultados de ejecución.
Extendiendo PHPLIB
PHPLIB accede a la base de datos a través de un objeto generado por la clase DB_Sql. Db_mysql.inc contiene la clase DB_Sql modificada para MySQL. Ampliaremos DB_sql agregando código a common.php después de la línea que contiene db_mysql.inc.
DB_Sql contiene muchas funciones para realizar consultas. Lo que debemos modificar es:
<? PHP
/* público: gestión de conexión*/
función conectar($Base de datos = "", $Host = "", $Usuario = "", $Contraseña = "") {
/* Manejar la conexión predeterminada */
si ("" == $Base de datos)
$Base de datos = $this->Base de datos;
si ("" == $Anfitrión)
$Host = $this->Host;
si ("" == $Usuario)
$Usuario = $this->Usuario;
si ("" == $Contraseña)
$Contraseña = $this->Contraseña
/* Establecer conexión y seleccionar base de datos*/
si (0 == $this->Link_ID) {
$this->Link_ID=mysql_pconnect($Host, $Usuario, $Contraseña);
si (!$this->Link_ID) {
$this->halt("pconnect($Host, $Usuario, $Contraseña) falló.");
devolver 0;
}
if ( !@mysql_select_db($Base de datos,$this->Link_ID )) {
$this->halt("no se puede usar la base de datos ".$this->Database);
devolver 0;
}
}
devolver $this->Link_ID;
}
? >
Busque la función connect() en su db_mysql.inc (u otros archivos .inc relacionados con la base de datos), luego cópiela en common.php y colóquela detrás del código que contiene db_mysql.inc. Al final, también debe agregar. Se encapsula como una definición de clase.
Encontré el código un poco difícil de leer, así que primero hice que el código copiado fuera más legible:
<? PHP
/* público: gestión de conexión*/
función conectar($Base de datos = "", $Host = "", $Usuario = "", $Contraseña = "") {
/* Manejar la conexión predeterminada */
si ("" == $Base de datos) {
$Base de datos = $this->Base de datos;
}
si ("" == $Anfitrión) {
$Host = $this->Host;
}
si ("" == $Usuario) {
$Usuario = $this->Usuario;
}
if ("" == $Contraseña) {
$Contraseña = $this->Contraseña;
}
/* Establecer conexión y seleccionar base de datos */
si (0 == $this->Link_ID) {
$this->Link_ID=mysql_pconnect($Host, $Usuario, $Contraseña);
si (!$this->Link_ID) {
$this->halt("pconnect($Host, $Usuario, $Contraseña) falló.");
devolver 0;
}
if ( !@mysql_select_db($Base de datos,$this->Link_ID )) {
$this->halt("no se puede usar la base de datos ".$this->Database);
devolver 0;
}
}
devolver $this->Link_ID;
}
? >
Ajusté la posición de los corchetes y agregué una llave antes y después de la línea única. En la declaración if de PHP, no necesita paréntesis si solo hay una línea de código, pero si agrega una línea más de código, se producirá un error de inmediato. Por lo tanto, le sugiero que agregue un corchete para evitar errores al agregar código más adelante.
Antes de cambiar el código de conexión, primero debe comprender cómo funciona connect(). Comprueba si existe una conexión actualmente. Si no hay conexión, crea una. Antes de cada consulta de base de datos, primero ejecute esta función connect(). Desafortunadamente, solo selecciona la base de datos cuando se conecta por primera vez. Si su página PHP usa más de una base de datos, connect() no seleccionará otra base de datos.
Hay algunas formas diferentes de cambiar el código. Necesitamos elegir un método que tenga el menor impacto en PHPLIB y nos permita mostrar el estado de la conexión de la base de datos cuando necesitemos analizar el problema. Necesitamos guardar la identificación de la conexión y el nombre de la base de datos fuera de PHPLIB. Simplemente agregue common.php:
<? PHP
$db_connection = 0; // ID de la conexión a la base de datos
$db_database = ""; // ¿Estado actual de la base de datos? >
A continuación, modificaremos PHPLIB para almacenar la identificación de la conexión y el nombre de la base de datos en estas variables. Puede configurar y usar el mismo nombre de variable en otro código. Al analizar el problema, si necesita saber qué base de datos se está utilizando, simplemente inserte el siguiente código en la página:
<? PHP
Print(" db_database: " . $db_database . "");
? > ¿
Cómo podemos hacer que connect() utilice estas nuevas variables? Podemos agregar una línea en la parte superior:
<? PHP
{
globales $db_connect, $db_database;
/* Manejar valores predeterminados */
? >
A través de estos códigos, se puede acceder a las nuevas variables mediante connect().
Después de definir $db_database, agregue:
<? PHP
función 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);
}
retorno($db_connect);
}
función db_database($db_database_new="") {
globales $db_database;
if(!empty($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
}
retorno($db_database);
}
? >
Siempre que defina estas funciones públicas una vez, puede usar estas variables públicas en diferentes lugares sin agregar declaraciones globales. Las siguientes son las funciones públicas que utilizan la función db anterior:
<? PHP
función conectar($Base de datos = "", $Host = "", $Usuario = "", $Contraseña = "") {
/* Manejar la conexión predeterminada */
si ("" == $Base de datos) {
$Base de datos = $this->Base de datos;
}
si ("" == $Anfitrión) {
$Host = $this->Host;
}
si ("" == $Usuario) {
$Usuario = $this->Usuario;
}
if ("" == $Contraseña) {
$Contraseña = $this->Contraseña;
}
/* Establecer conexión y seleccionar base de datos */
si (0 == db_connect()) {
$this->Link_ID = db_connect($Host, $Usuario, $Contraseña);
si (!$this->Link_ID) {
$this->halt("pconnect($Host, $Usuario, $Contraseña) falló.");
devolver 0;
}
}
si (0 != db_connect()) {
if($Base de datos!= db_database()) {
$this->Base de datos = db_database($Base de datos))
if(vacío($this->Base de datos)) {
$this->halt("no se puede usar la base de datos". $this->Database);
devolver 0;
}
}
}
devolver $this->Link_ID;
}
? >
Preste atención a los siguientes cambios:
La prueba de la base de datos está separada de la prueba de la conexión, de modo que incluso si connect() tiene una conexión actual, aún puede verificar si desea cambiar a otra base de datos. Esto significa que db_connect() se compara con 0 el doble de veces que antes, pero este procesamiento adicional es necesario.
Mantenemos la conexión de la base de datos y la selección de la base de datos fuera de PHPLIB para que pueda usar la misma función de selección de la base de datos en cualquier parte de su código PHP.
Sin embargo, existe una limitación del procesamiento actual. Aquí suponemos que se utilizan el mismo host, usuario y contraseña para todas las bases de datos. Si su base de datos tiene diferentes permisos para diferentes usuarios, debe establecer una conexión especial para acceder a ella. ¿Cómo? Simplemente defina las siguientes variables:
<? PHP
$db_host = "";
$db_user = "";
$db_pass = "";
? >
Al extender la función db_database(), compare el usuario y el host actuales con un determinado usuario y host. También puedes agregar:
<? PHP
$db_type = "";
? >
Esta variable se utiliza para almacenar el tipo de base de datos, mysql u Oracle, etc. De esta manera puede acceder a múltiples bases de datos.
Pero cambiar el código para manejar múltiples tipos diferentes de bases de datos es bastante complicado. También debes cambiar la función de consulta, así como las funciones de unión y selección. Es posible que pueda conectarse a través de ODBC de PHP y luego usar las opciones ODBC de PHPLIB para manejarlo. ODBC maneja múltiples bases de datos de forma común, por lo que será más lento. ODBC le permite utilizar el mismo código para manejar múltiples tipos diferentes de bases de datos. Pero habrá problemas cuando sea necesario utilizar fechas en diferentes formatos de procesamiento, y también habrá algunas diferencias extrañas entre las bases de datos. ODBC sólo simplifica la conexión, pero no modifica la forma en que la base de datos interpreta los datos y SQL.
Ahora aprendamos cómo redefinir una clase de objeto. La función connect() está encapsulada en una definición de clase:
<? PHP
clase DB_Sql {
}
? >
Cuando copiamos esta función a common.php, debemos redefinir la clase DB_Sql. Podemos encapsular connect() así:
<? PHP
clase db_DB_Sql extiende DB_Sql {
}
? >
Para aprender más sobre el funcionamiento de "extends", podemos echar un vistazo a la sección sobre objetos y clases en la documentación de PHP. En pocas palabras: cualquier definición en la extensión reemplaza y anula todas las definiciones anteriores.
Ahora se puede utilizar db_DB_Sql. Cuando configura PHPLIB, realiza la siguiente declaración:
<? PHP
$x = nuevo DB_Sql;
? > Cámbielo a: <? PHP
$x = nuevo db_DB_Sql;
? >
De esta manera puedes usar la clase modificada en lugar de la anterior.
Cuando se produce un error al conectarse a la base de datos, puede generar el estado de conexión actual en una función externa. Si ocurre un error en la declaración SQL, también puede copiar la función query() en DB_Sql a db_DB_Sql en common.PHP y luego insertar una declaración de salida para ver cuál es la declaración SQL actual.
También puede escribir información de error o diagnóstico en un archivo de disco. Al definir
$db_log_file = "t:/diag.txt"
o un archivo de texto similar. Si utiliza Windows, debe asegurarse de que el directorio exista; de lo contrario, recibirá un mensaje de error.
Luego define una función:
<? PHP
función db_log($db_log_message) {
globales $db_log_file;
$db_log_f = fopen($db_log_file, "a");
fwrite($db_log_f, fecha("Y md H:i:s")." ".$db_log_message."rn");
fclose($db_log_f);
}
? >
Donde necesites registrar información, agrega el siguiente código:
<? PHP
db_log("base de datos actual: " . db_database());
? >
En realidad, puede utilizar archivos de registro integrados o del sistema. Pero luego tienes que encontrar una pequeña porción de información en muchos archivos. Por lo tanto, este archivo de registro independiente le ayudará con las pruebas. Sugiero escribir el siguiente código antes y después de grabar:
<? PHP
db_log("base de datos actual: " . db_database());
db_database("catálogo de libros");
db_log("base de datos actual: " . db_database());
? >
Al acceder a los datos, recuerde utilizar la base de datos correcta, no la base de datos definida en PHPLIB. Puede crear una función contenedora para la base de datos o cambiar la función que utiliza. Si usa mysql_query(), puede usar db_database() primero, puede usar
<? PHP
$resultado = mysql_db_query(db_database("bookcatalogue"), "seleccionar * de?",
db_connect());
? > que sugiere la función: <? PHP
función db_query($db_query_database, $db_query_sql) {
retorno(mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
? >
en lugar de
<? PHP
db_database("catálogo de libros");
$resultado = mysql_query("seleccionar * de?", db_connect());
? Ahora
puedes hacerlo
. Usa PHPLIB (o software similar) para acceder a múltiples bases de datos.
.extender clase/objeto
.Insertar pruebas diagnósticas
.Crear archivos de registro