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:
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:
Aqu� tienes el c�digo fuente del CGI para que lo modifiques a tu gusto. dbi_demo.cgi