Bases de datos en la Web

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

.Qu usamos?

Ya tenamos instalado Perl como vimos en el captulo anterior . En este caso vamos a utilizar la otra base de datos de la que disponamos. Es decir vamos a utilizar la base de datos en formato DBase III. Tambin vamos a cambiar el servidor PWS por el Sambar Web Server que tenamos instalado. No es por nada en particular, slo para ir alternando entre las distintas tecnologas, bases de datos y servidores web para que veis que no hay ningn problema. En particular con el DBI de Perl podemos acceder a cualquier base de datos OBDC tan slo con modificar unas pocas lneas de cdigo. Esto ya lo veremos.

.El Mdulo DBI

El mdulo DBI es de increble utilidad porque nos abstrae de cmo comunicarnos con cualquier tipo de bases de datos . El mdulo DBI nos facilita una interfaz para que podamos enviar comandos SQL a cualquier Base de Datos. Escribimos un cdigo standard que nos sirve para todas sin tener que reescribir ni una sola lnea.

El secreto est en la librera DBD (Database Dependent) que viene con la distribucin standard de Perl 5. Esta librera permite al DBI comunicarse con cualquier base de datos que necesite. Veamos grficamente cmo trabaja todo el conjunto:

Descripcin grfica del proceso

El CGI habla con el mdulo 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 dems. Esto si es muy til para los que programen en Linux o Unix.

.API DBI

Cmo se usa el mdulo DBI?.

Es la pregunta del milln de dlares. No es tan difcil aqu vamos a ver las caractersticas y mtodos ms comunes que nos hacen falta para nuestra aplicacin y al final os dejo una tabla con todas las dems para el que quiera apurar hasta el mximo.

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

Despus el objeto conexin con la base de datos dndole el nombre de la base de datos, el del usuario, el password y el driver a usar. En nuestro ejemplo se hara 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 ) despus 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 mtodo 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 slo tenis que desconectar con el mtodo disconnet();

Aqu tenis los dems mtodos 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 cdigo fuente del CGI para que lo modifiques a tu gusto. dbi_demo.cgi

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.