Manejo de Base de datos en PHP
- 1) Introducción al manejo de base de datos por php
- 2) Funciones nativas v/s clase de abstracción
- 3) Uso de AdoDB
1) Introducción al manejo de base de datos por php
Php cuenta con soporte nativo para variadas bases de datos. Entre otras, tenemos:
- MySQL
- Oracle
- PostgreSQL
- MSSQL Server
- DBM
- DBase
- Frontbase
- filePro
- SQLite
Si no se cuenta con soporte nativo, se puede ocupar la capa de abstracción ODBC.
2) Funciones nativas v/s clase de abstracción
PHP cuenta, para acceder a cada base de datos, con un conjunto específico de funciones, muchas veces un port directo de sus versiones de C/C++. Por ello, son muy rápidas y estables. El problema se produce cuando se necesita, por alguna razón, portar de una base de datos a otra; si no se toman las precauciones convenientes, podría darse de tener que alterar todo el código PHP y SQL!
Para evitar esto, es mejor utilizar una clase de abstracción, que a través de una interfaz común, nos permita acceder a cualquier base de datos de manera común, ocultando al desarrollador los detalles de la implementación. Más aún, esta clase puede contar con funciones de generación de SQL que nos permitan crear instrucciones genéricas, que serán portadas al formato espécifico de la base requerida.
Para efectos de este curso, utilizaremos la clase de abstracción AdoDB, la cual puede ser obtenida en http://php.weblogs.com/ADOdb.
Esta clase, aparte de poseer soporte para MySQL, PostgreSQL, Interbase, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, SAP DB, SQLite, Sybase, DB2 y ODBC, cuenta con funciones para crear SQL fácilmente portable y utilidades que permiten monitorear el estado de la base de datos, crear sesiones con soporte en base de datos, presentar resultsets en pantalla y generar archivos cvs, por ejemplo.
3) Uso de AdoDB
3.1) Instalación
Una vez descargados los archivos desde http://php.weblogs.com/ADOdb#downloads, procederemos a extraerlos en c:\php\includes\adodb. Al ponerlos en el directorio de includes, la clase estará disponible para todos los scripts de php, cualquiera sea esta su ubicación
3.2) Conexión
Para nuestro ejemplo, supondremos una base de datos MySQL instalada en el mismo computador que el servidor http. La base de datos tendrá por nombre test y el usuario será usuario, con password password. El código para la conexión sería el siguiente
- include('adodb/adodb.inc.php');
- $driver="mysql";
- $db = ADONewConnection($driver);
- $db->debug = true; // para activar las funciones de debug
- $server="localhost";
- $user="usuario";
- $password="password";
- $database="test";
- $db->Connect($server, $user, $password, $database);
Si todo está en orden, la variable $db se conectará al servidor y nos permitirá realizar todas las acciones requeridas.
3.3) Recolección de datos
Existen variadas formas de recuperar la información desde una consulta SELECT. La forma general es la siguiente
- $rs=$db->execute("SELECT * from tabla");
- print_r($rs->getArray());
Como vemos, a partir de una instrucción SQL ejecutada por el método execute, se obtiene un objeto ADORecordSet, que contiene el resultado de nuestro query. En caso de error, obtendremos false.
Para ver los resultados de nuestra consulta, supongamos que la tabla tabla tiene la siguiente estructura y datos
| id | nombre | telefono |
| 1 | Carlos Perez | 233333 |
| 2 | Juan Salgado | 112233 |
| 3 | Ramiro Smith | 394755 |
$rs por defecto nos entregará un array númerico de dos dimensiones, correspondiendo la primera a las tuplas y la segunda a los campos. Tendremos, entonces:
- $rs=$db->execute("SELECT * from tabla");
- echo "<pre>";
- print_r($rs->getArray());
- echo "</pre>";
la salida
--------------------------------------------------------------------------------
(mysql): SELECT * from tabla
--------------------------------------------------------------------------------
Array
(
[0] => Array
(
[0] => 1
[id] => 1
[1] => Carlos Pérez
[nombre] => Carlos Pérez
[2] => 233333
[telefono] => 233333
)
[1] => Array
(
[0] => 2
[id] => 2
[1] => Juan Salgado
[nombre] => Juan Salgado
[2] => 112233
[telefono] => 112233
)
[2] => Array
(
[0] => 3
[id] => 3
[1] => Ramiro Smith
[nombre] => Ramiro Smith
[2] => 394755
[telefono] => 394755
)
)
Como vemos, obtenemos un array bi-dimensional, donde la primera dimensión corresponde a las tuplas y la segunda a las columnas, siendo asignado tanto un índice numérico como uno asociativo a cada una de estas. Este comportamiento para las columnas depende de la base de datos, así que es mejor especificar ya sea un índice numérico o asociativo. Para ello, utilizaremos la instrucción
- $db->SetFetchMode(ADODB_FETCH_NUM);
- $db->SetFetchMode(ADODB_FETCH_ASSOC);
Si utilizamos la segunda, preferible ya que nos asegura la funcionalidad del script ante cualquier cambio en la base de datos, tendremos:
- $db->SetFetchMode(ADODB_FETCH_ASSOC);
- $rs=$db->execute("SELECT * from tabla");
- echo "<pre>";
- print_r($rs->getArray());
- echo "</pre>";
la salida
Array
(
[0] => Array
(
[id] => 1
[nombre] => Carlos Pérez
[telefono] => 233333
)
[1] => Array
(
[id] => 2
[nombre] => Juan Salgado
[telefono] => 112233
)
[2] => Array
(
[id] => 3
[nombre] => Ramiro Smith
[telefono] => 394755
)
)
Una opción interesante de AdoDb es la posibilidad de establecer como clave en las tuplas el primer campo de la serie. Como generalmente este es el id, nos permitirá a futuro localizar rápidamente una tupla en particular. Para ello, utilizamos la función $rs->getAssoc()
- $db->SetFetchMode(ADODB_FETCH_ASSOC);
- $rs=$db->execute("SELECT * from tabla");
- echo "<pre>";
- print_r($rs->getAssoc());
- echo "</pre>";
la salida
Array
(
[1] => Array
(
[nombre] => Carlos Pérez
[telefono] => 233333
)
[2] => Array
(
[nombre] => Juan Salgado
[telefono] => 112233
)
[3] => Array
(
[nombre] => Ramiro Smith
[telefono] => 394755
)
)
Ahora bien, existen ciertos atajos en los casos que queramos obtener los valores para una tupla, un campo o un solo valor. Para el código
- Falla de Connect() o PConnect()
- Error de función Execute
- Generación de un ciclo infinito en GenId()
3.6) Recolección de metadatos
Adodb presenta múltiples funciones para recolectar información sobre la estructura de la base de datos.
MetaDatabases()
Entrega una lista de las bases de datos disponibles, como un array.
MetaTables($ttype = false, $showSchema = false, $mask=false)
Retorna un array de tablas y vistas para la base de datos en curso. Para mostrar sólo las tablas, se debe usar $db->MetaTables('TABLES'). Para mostrar sólo vistas, se usa $db->MetaTables('VIEWS'). La variable $showSchema sólo es válida para DB2, y cuando se define a true, se agregará a la tabla, ej. "SCHEMA.TABLE".
MetaColumns($table)
Retorna un array de ADOFieldObject, cada un correspondiente a un campo por cada columna en $table.
MetaColumnNames($table)
Retorna un array con los nombres de las columnas para $table.
MetaPrimaryKeys($table, $owner=false)
Retorna un array con los nombres de las columnas que son claves primarias para $table.
3.7) Consejos para la portabilidad de la aplicación
Si bien AdoDb nos ayuda a que el código PHP se mantenga estable, aunque la base de datos cambie, es muy difícil crear una aplicación no trivial con instrucciones SQL estándar.
SELECT con límites
La forma en la cual las Db manejan la obtención de un número de tuplas específico varía mucho. Es mejor usar la instrucción de adodb selectLimit()
$connection->SelectLimit('select * from table', 10,5); //Recoge 10 filas, con offset 5
Inserts
Cuando se crean nuevos registros, se deben generar id únicos para cada uno. Hay dos técnicas comunes: (1) autoincremento y (2) secuencias.
Las columnas con autoincremento son utilizadas por MySQL, Sybase, Microsoft Access y SQL Server. Otras bases de datos no cuentan con ellas; de este modo, si queremos hacer portable nuestra aplicación, deberemos usar secuencias. Las secuencias son funciones especiales que retornan un número único que se incrementa cada vez que se llama, útil para ser usados como claves en la base de datos. En AdoDb se utiliza la función GenId(). Toma como parámetro el nombre de la secuencia.
-
- $id = $db->GenID('secuencia');
- $connection->Execute("insert into table (id, firstname, lastname) values
- ($id, $firstname, $lastname)");
-
Funciones generadores de SQL
AdoDb cuenta con variadas funciones para generar SQL portable.
Function
Description
DBDate($date)
A partir de un timestamp UNIX o una fecha ISO retorna una fecha string formateado para un INSERT/UPDATE
DBTimeStamp($date)
A partir de un timestamp UNIX o una fecha ISO retorna un timestamp formateado para INSERT/UPDATE
SQLDate($date, $fmt)
Genera una fecha usando una máscara $fmt , para usar en instrucciones SELECT .
OffsetDate($date, $ndays)
Genera una fecha $date con diferencia de $ndays.
Concat($s1, $s2, ...)
Genera código portable para concatenar strings.
IfNull($fld, $replaceNull)
Returna un string que es equivalente al MySQL IFNULL o al Oracle NVL.
$db->sysDate
Propiedad que contiene la función SQL que retorna la fecha de hoy
$db->sysTimeStamp
Propiedad que contiene la función SQL que retorna el timestamp actual (fecha+hora).
$db->concat_operator
Propiedad que contiene el operador de concatenación
$db->upperCase
Propiedad que contiene el nombre de la función strtoupper SQL .
$db->substr
Propiedad que contiene el nombre de la función substr SQL .
$db->random
Propiedad que contiene el SQL para generar un número aleatorio entre 0.00 y 1.00
SQL como ejercicio de localización
En cualquier aplicación de mediana a gran envergadura, si se desea hacerla realmente portable, es necesario tratar el código SQL como un ejercicio de localización. Esto es, se pueden almacenar en distintos archivos los querys específicos para cada base de datos e incluirlos de acuerdo al driver que estemos utilizando. Desde una perspectiva de patrones de diseño, esto correspondería al patrón Estrategia
- 1379 lecturas

Duda:
¿Existe algún módulo de PHP especializado en el manejo de los metadatos de los documentos de Office?
Es decir, que pueda por ejemplo extraer la fecha de creación del documento. He estado buscando sobre el tema pero hasta el momento no he encontrado información clara, agradecería me puedas orientar al respecto, gracias.
Revisa el paquete OLE de PEAR, que permite leer archivos OLE. Este es el formato de los archivos de Office del 2003 hacia atrás.
Enviar un comentario nuevo