Bases de datos en la Web
PERL
Introducción
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










































