Bases de datos en la Web

En este caso vamos a utilizar Perl 5 y su librer�a DBI ( Database Independent Interface ) para crear un script CGI que nos permita conectar con nuestra base de datos. Esta librer�a viene gratuita con la distribuci�n normal de Perl5.

.��Qu� usamos?

Ya ten�amos instalado Perl como vimos en el cap�tulo anterior . En este caso vamos a utilizar la otra base de datos de la que dispon�amos. Es decir vamos a utilizar la base de datos en formato DBase III. Tambi�n vamos a cambiar el servidor PWS por el Sambar Web Server que ten�amos instalado. No es por nada en particular, s�lo para ir alternando entre las distintas tecnolog�as, bases de datos y servidores web para que ve�is que no hay ning�n problema. En particular con el DBI de Perl podemos acceder a cualquier base de datos OBDC tan s�lo con modificar unas pocas l�neas de c�digo. Esto ya lo veremos.

.�El M�dulo DBI

El m�dulo DBI es de incre�ble utilidad porque nos abstrae de c�mo comunicarnos con cualquier tipo de bases de datos . El m�dulo DBI nos facilita una interfaz para que podamos enviar comandos SQL a cualquier Base de Datos. Escribimos un c�digo standard que nos sirve para todas sin tener que reescribir ni una sola l�nea.

El secreto est� en la librer�a DBD (Database Dependent) que viene con la distribuci�n standard de Perl 5. Esta librer�a permite al DBI comunicarse con cualquier base de datos que necesite. Veamos gr�ficamente c�mo trabaja todo el conjunto:

Descripci�n gr�fica del proceso

El CGI habla con el m�dulo DBI y este lo hace con DBD que tiene un driver para comunicarse con la base de datos. Aunque para nosotros que vamos a programar en Windows 9x no nos importa mucho mientras tenga el driver para OBDC ya que el sistema operativo se encargar� de lo dem�s. Esto si es muy �til para los que programen en Linux o Unix.

.�API DBI

� C�mo se usa el m�dulo DBI?.

Es la pregunta del mill�n de d�lares. No es tan dif�cil aqu� vamos a ver las caracter�sticas y m�todos m�s comunes que nos hacen falta para nuestra aplicaci�n y al final os dejo una tabla con todas las dem�s para el que quiera apurar hasta el m�ximo.

Lo primero es cargar el m�dulo DBI. Esto se hace con la directiva USE de perl.

Despu�s el objeto conexi�n con la base de datos d�ndole el nombre de la base de datos, el del usuario, el password y el driver a usar. En nuestro ejemplo se har�a como sigue:

use DBI;
    $dbHandle = (DBI->connect('DBI:ODBC:Ejemplo2', 
                              'Alejandro", 
                              '12mw_l'));

Donde el nombre de la base de datos es Ejemplo2 y el driver es el ODBC. El usuario y el password no hacen falta si en el ODBC no lo configurasteis.

Lo que queremos hacer normalmente con la base de datos ( en adelante BD ) despu�s de conectar con ella suele ser consultarla. Para ello preparamos la sentencia sql y la ejecutamos. Esto se hace :

use DBI;
    $dbHandle = (DBI->connect('DBI:ODBC:Ejemplo2', 
                         'Alejandro", 
                         '12mw_l'));
    $sql = "SELECT * FROM Clientes";
    $statementHandle = $dbHandle->prepare($sql);
    $statementHandle->execute() || 
                   die $statementHandle->errstr;

Ya hemos ejecutado la consulta pero no hemos recogido los datos. Para esto vamos a utilizar un array.

El m�todo fetchall_arrayref() nos devuelve todas las filas devueltas por la consulta en un array.

use DBI;
    $dbHandle = (DBI->connect('DBI:ODBC:Ejemplo2', 
                         'Alejandro", 
                         '12mw_l'));
    $sql = "SELECT * FROM Clientes";
    $statementHandle = $dbHandle->prepare($sql);
    $statementHandle->execute() || 
                   die $statementHandle->errstr;

$arrayRef = $statementHandle->fetchall_arrayref;
    $dbh->disconnect();

cabar s�lo ten�is que desconectar con el m�todo disconnet();

Aqu� ten�is los dem�s m�todos del DBI

General DBI Class Methods

Name Usage Description
connect()

$dbHandle = DBI-> connect (DBI:$driverName:$dataSource, $usrName, $passwrd);

$dbHandle = DBI-> connect ($dataSource, $usrName, $passwrd, $driverName);

This method establishes a connection to the specified Data Source and returns a database handle object.

Note that if you define the driver name as the fourth parameter, you need not tag the DBI:$driverName along with the $dataSource name.

available_drivers()

@drivers = DBI-> available_drivers();

@drivers = DBI-> available_drivers ($warnFlag);

As you can see, this method returns an array of drivers that the module can see. It gets the list by searching through the @INC array for DBD modules. If you pass a true value as a parameter, warnings about hidden drivers will be quelled.

data_sources() @dataSources = DBI-> data_sources($driver); Returns a list of the data sources available for a given driver if the driver supports the method.
trace()

DBI->trace ($level);

DBI->trace ($level, $file);

Provides tracing functionality such that the $file is appended to with trace information. A Level 0 rating disables tracing and a level 2 tracing provides a detailed trace.
neat() $neatvalue = DBI::neat($value, $maxLength); Formats the specified value such that strings are quoted, undefined values are replaced with "undef", unprintable characters are replaced with a ".", and string will be truncated and ended with "..." if longer than $maxLength
neat_list() $delimitedList = DBI::neatList(\@listRef, $maxlength, $delimiter); Formats an array by calling neat() on each element and forming a string by joining the elements with the specified delimiter.
dump_results() $dbRows = DBI::dump_results ($statementHandle, $maxLength, $lineSeparator, $fieldSeparator, $fileHandle); Gets all the rows from the statement handle object, calls neat_list() on each row and prints the results to $filehandle that is by default.

General Handle Methods

Name Usage Description
err() $result = $handle->err(); Gets the error code returned from the database.
errstr() $result = $handle->errstr(); Gets the error message returned from the database.
state() $state = $handle->state(); Gets the SQLSTATE error code.
trace()

$handle->trace ($level);

$handle->trace ($level, $file);

Provides tracing functionality such that the $file is appended to with trace information. A Level 0 rating disables tracing and a level 2 tracing provides a detailed trace

Database Handle Methods

Name Usage Description
prepare() $statementHandle = dataSourceHandle -> prepare($sql); Prepares a statement for execution.
do() $rowCount = $databaseHandle -> do($sql); Prepares and executes an SQL statement and returns the number of rows returned
commit() $rowCount = $databaseHandle -> commit(); Makes permanent the last set of database changes if supported.
rollback() $rowCount = $databaseHandle -> rollback() Undoes uncommitted changes if supported.
disconnect() $rowCount = $databaseHandle ->disconnect() Disconnects from the database.
ping() $rowCount = $databaseHandle - > ping() Tries to figure out if the database server is still available
quote() $sql = $databaseHandle - > quote($string); Spiffys up a string for an SQL statement

Statement Handle Methods

Name Usage Description
execute() $value = $statementHandle -> execute(); Executes a prepared statement
fetchrow_arrayRef() $arrayRef = $statementHandle -> fetchrow_arrayref(); Gets the next row of data as a reference to an array holding the column values.
fetchrow_array() @array = $statementHandle -> fetchrow_array(); Gets the next row of data as an array.
fetchrow_hashref() $hashRef = $statementHandle -> fetchrow_hashRef(); Gets the next row of data in which the keys to the hash reference are the column names and the values are the column values.
fetchall_arrayref() $reference = $statementHandle -> fetchall_arrayref() Gets all the rows as references in a referenced array.

.�Ejecutando el CGI

Como estamos usando el Sambar Web Server tenemos que situar nuestro cgi el el directorio cgi-bin de nuestro servidor y llamarlo desde nuestro navegador con una llamado como esta: " http://127.1.1.1/cgi-bin/dbi_demo.cgi " lo cual nos debe aparecer como se ve en la figura:

Pantalla que genera el CGI en Perl

Aqu� tienes el c�digo fuente del CGI para que lo modifiques a tu gusto. dbi_demo.cgi

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP