J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1
1
4
4
.
.
A
A
PPÉÉNNDDIICCEE8
8
:
:
C
C
O
O
N
N
E
E
C
C
T
T
I
I
V
V
I
I
D
D
A
A
D
D
C
C
O
O
N
N
B
B
A
A
S
S
E
E
S
S
D
D
E
E
D
D
A
A
T
T
O
O
S
S
La conectividad de un servidor de WWW con un SGBD es una necesidad patente cuando se requiere manejar gran volumen de información estructurada.
También es imprescindible si se desea enganchar un sistema de información existente con un servicio de WWW.
Veremos dos sistemas:
1) El empleado por Internet Information Server (IIS), de Microsoft. Se basa en el conector de bases de datos de Internet.
2) El empleado por PERL, con un módulo (DBI) independiente del sistema de gestión de bases de datos, y otro módulo (DBD) a medida del SGBD concreto.
J J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1
1
4
4
.
.
1
1
.
.
I
I
NNTTEERRNNEETTI
I
NNFFOORRMMAATTIIOONNS
S
EERRVVEERR:
:
EELLC
C
OONNEECCTTOORR D DEEBA
B
ASSEESSDDEEDA
D
ATTOOSSDDEEIN
I
NTTEERRNNEETT.
.
El conector de bases de datos de Internet (IDC),
httpodbc.dll, es una biblioteca dinámica ISAPI que
utiliza ODBC para acceder a las bases de datos.
Esta ilustración muestra los componentes de IIS que intervienen para conectar con las bases de datos.
Microsoft Internet Information Server Servicio WWW Servicio Gopher Servicio FTP httpodbc.dll ODBC Controlador SQL Server Controlador MS Access Otros Servidor SQL Otra BD Base de Datos
Microsoft Internet Information Server Servicio WWW Servicio Gopher Servicio FTP httpodbc.dll ODBC Controlador SQL Server Controlador MS Access Otros Servidor SQL Otra BD Base de Datos
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
El IDC utiliza dos tipos de archivos:
Archivos del IDC (.idc): para controlar la forma de acceso a la base de datos. Contienen
información para conectar con el origen de datos ODBC y ejecutar la instrucción SQL. También indican la ubicación del archivo de plantilla
Archivos de plantilla (.htx): para controlar el modo en que se construye la página
HTML de salida cuando el IDC haya combinado su información con la base de datos 3 motivos para usar IDC:
1) Control de queries: IDC requiere que se especifiquen las queries a realizar, mientras que otros sistemas las suministran
2) Control del esquema de salida. IDC ofrece un mayor control sobre cómo interaccionará el usuario con nuestra página web.
El desarrollador crea tanto el formulario como las páginas utilizadas para inyectar los
resultados de la petición a la base de datos.
3) Reusabilidad. Se pueden copiar los componentes básicos de un IDC (el código fuente de las páginas HTML, ficheros .htx e .idc) para construir rápidamente una variante del formulario de
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Los ejemplos que veremos para ilustrar este sistema se basan en un servidor de WWW (DAACV, www.bbaa.upv.es/daacv/, actualmente en desuso) mediante el que se accede a SQL
Server (de Microsoft).
1
144..11..11..CCARARAACCTTEERRÍÍSSTTIICCAASS DDEELL CCOONNEECCTTOORR 1) Archivos del IDC.
Contienen la información para acceder a la bases de datos. 2) Parámetros.
El caso más sencillo consiste en definir la consulta a ejecutar completamente en un archivo del IDC.
Pueden crearse páginas HTML más potentes mediante la utilización de parámetros.
Los parámetros son los nombres y los valores empleados en el formulario, así como los
especificados directamente en los URLs. Estos nombres y valores pueden utilizarse en instrucciones SQL.
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
P.ej., la siguiente ilustración, da al usuario la opción de personalizar sus búsquedas, pudiendo seleccionar el criterio que desee.
El usuario elige entre una de las actividades disponibles, o inserta directamente el
nombre, o parte de éste, de cualquier creador sobre el que quiera consultar.
La página da el nombre “criterio” a la variable asociada.
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
La sintaxis del campo de entrada y del botón de actividades es:
<FORM METHOD=”POST” ACTION=/scripts/daacv/busquedas.idc> <P><SELECT NAME="actividad" SIZE="1">
<OPTION VALUE="cer">cerámica</OPTION>
<OPTION VALUE ="dis_gra">diseño gráfico</OPTION> <OPTION VALUE ="doc">docencia</OPTION>
<OPTION VALUE ="esc">escultura</OPTION> <OPTION VALUE ="gra">grabado</OPTION>
<OPTION VALUE ="ges_cul">gestión cultural</OPTION > <OPTION VALUE ="his">historia</OPTION>
<OPTION VALUE ="fot">fotografía</OPTION>
<OPTION VALUE ="med_aud">medios audiovisuales</OPTION> <OPTION SELECTED VALUE ="pint">pintura</OPTION>
<OPTION VALUE ="res">restauración</OPTION> </SELECT></P>
<P ALIGN="center">
<INPUT TYPE="submit" NAME="boton1" VALUE="Buscar"></P> </FORM>
En el archivo busquedas.idc se utiliza el parámetro que aparece en negrita:
SQLStatement:
+SELECT id_cre, apellidos_cre, nombre_cre +FROM creadores
+WHERE %actividad% = 1 +ORDER BY apellidos_cre
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Los parámetros deben estar entre % para distinguirlos de un identificador de SQL
El signo de porcentaje es también un carácter comodín de SQL. Para insertar un único
signo “%” en un comodín SQL, se utiliza “%%”.
Cuando el conector encuentra el parámetro en el archivo .idc, sustituye el valor
enviado por el navegador, y envía la instrucción SQL al controlador ODBC.
P.ej., la consulta utilizada para facilitar las búsquedas por nombre es:
+SELECT id_cre, apellidos_cre, nombre_cre +FROM creadores
+WHERE (apellidos_cre LIKE ‘%%%nombre%%%’) +OR (nombre_cre LIKE ‘%%%nombre%%%’)
ORDER BY apellidos_cre
El código HTML que hace posible esta búsqueda es el siguiente:
<FORM action="/scripts/daacv/consulta2.idc" METHOD="post”> <INPUT TYPE="text" SIZE="20" NAME="nombre" VALUE="nombre"> <P ALIGN="center">
<INPUT TYPE="submit" NAME="boton2" VALUE="Buscar"></p> </FORM>
Para devolver todas las entradas que contienen nombre al principio de la palabra:
+SELECT id_cre, apellidos_cre, nombre_cre +FROM creadores
+WHERE (apellidos_cre LIKE ‘%nombre%%%’) +OR (nombre_cre LIKE ‘%nombre%%%’)
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Si quisiéramos devolver las entradas que contengan la cadena al final, usaríamos:
+SELECT id_cre, apellidos_cre, nombre_cre +FROM creadores
+WHERE (apellidos_cre LIKE ‘%%%nombre%’) +OR (nombre_cre LIKE ‘%%%nombre%’)
ORDER BY apellidos_cre
El resultado de estas consultas se proporciona vinculado a otras consultas posteriores.
P.ej., para mostrar la información disponible de un artista, se le da formato como un
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
3) Uso de consultas por lotes y consultas múltiples.
Consultas por lotes.
Si la BD puede procesar simultáneamente varias consultas en una única instrucción SQL, el rendimiento mejora. P.ej., para SQL Server:
SQLStatement:
+SELECT * FROM creadores WHERE creadores.id_cre LIKE ‘%id_cre%’ +SELECT * FROM laboral WHERE laboral.id_cre LIKE ‘%id_cre%’ +SELECT * FROM formacion WHERE formacion.id_cre LIKE ‘%id_cre%’ +SELECT * FROM becas WHERE becas.id_cre LIKE ‘%id_cre%’
+SELECT * FROM part_colectiva WHERE (part_colectiva.id_cre LIKE ‘%id_cre%’) +AND (part_colectiva.colectiva_col = false) ORDER BY anyo_col, titulo_col +SELECT * FROM part_colectiva WHERE (part_colectiva.id_cre LIKE ‘%id_cre%’) +AND (part_colectiva.colectiva_col = true) ORDER BY anyo_col, titulo_col +SELECT * FROM pub_monografia WHERE (id_cre LIKE ‘%id_cre%’)
+ORDER BY anyo_mon, titulo_mon
+SELECT * FROM pub_referencia WHERE (id_cre LIKE ‘%id_cre%’) +ORDER BY anyo_ref, titulo_ref
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV)) Consultas múltiples.
Si se consultan BD que no pueden procesar una serie de consultas SQL simultáneamente, hay que formular las consultas como múltiples. P.ej.:
SQLStatement:
+SELECT * FROM creadores WHERE creadores.id_cre LIKE ‘%id_cre%’ SQLStatement:
+SELECT * FROM laboral WHERE laboral.id_cre LIKE ‘%id_cre%’ SQLStatement:
+SELECT * FROM formacion WHERE formacion.id_cre LIKE ‘%id_cre%’ SQLStatement:
+SELECT * FROM becas WHERE becas.id_cre LIKE ‘%id_cre%’ SQLStatement:
+SELECT * FROM creadores WHERE creadores.id_cre LIKE ‘%id_cre%’
Las consultas por lotes se procesan conjuntamente, mientras que las múltiples se procesan una a una.
4) Creación de páginas HTML con bases de datos de SQL Server
Para acceder a una base de datos SQL desde una página HTML, será necesario crear un archivo del IDC (extensión .idc) y un archivo de extensión HTML (.htx).
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
5) Consulta de bases de datos de ejemplo. Este ejemplo comienza con la página principal de DAACV, que contiene un enlace que provoca una consulta utilizando el controlador ODBC para Microsoft SQL Server, cuyos resultados se devuelven como otra página HTML.
La ilustración a la derecha muestra la portada (default.htm).
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Cuando se pulse en el enlace museos, se envía al servidor otra dirección:
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
En el URL ya se ha hecho referencia al archivo del IDC (museos.idc). La asignación de un
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1
144..11..22..EEL L PPRROOCCEESSOO DDEE CCOONNEXEXIIÓÓNN,, PPAASOSO AA PPAASSOO En IIS, todo el proceso se realiza en seis pasos, tal como se muestra en el diagrama:
El detalle de los pasos se ofrece en la siguiente página. Navegador http://www.bbaa.upv.es/daacv/museos.idc httpodbc.dll ODBC Internet Server Archivos HTX Archivos IDC Controlador de SQL Server SQL Server 1 (HTTP) 6 (Documento HTML) 2 (ISAPI) 4(Petición SQL) 5 (Resultado SQL) 3 (Leer archivo IDC)
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1) El navegador envía el URL al servidor IIS 2) IIS carga httpodbc.dll y le suministra la información restante del URL
Los archivos .idc se asignan a httpodbc.dll. Éste se carga y obtiene el nombre del archivo
IDC (y otros elementos) del URL.
3) httpodbc.dll lee el archivo del IDC.
El archivo del IDC contiene varias entradas con el formato: Campo: valor
En museos.idc, el origen de datos ODBC se especifica mediante: Origen de datos: DAACV
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Contenido del archivo .idc al que se hace referencia en el URL:
Origen de datos: DAACV Nombre de usuario: daacv Plantilla: museos.htx
Instrucción SQL: +SELECT idmuseo, nombre +FROM museos
En el .idc, el nombre del origen de datos es DAACV.
Los demás elementos incluyen:
Nombre de usuario, que debe ser una conexión válida con el origen de datos ODBC; en
este ejemplo, la conexión es con la cuenta daacv de Microsoft SQL Server.
Plantilla.
Instrucciones SQL a ejecutar.
La instrucción SQL de museos.idc devuelve el identificador y el nombre de
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
4) El IDC conecta con el origen de datos ODBC y ejecuta la instrucción SQL del IDC En este ejemplo se carga el controlador ODBC de SQL Server y se conecta con el servidor especificado. Una vez realizada la conexión, la instrucción SQL del IDC se envía al controlador ODBC de SQL Server, que a su vez la envía a SQL Server.
5) El IDC recopila los datos de la base de datos y los combina en el archivo de extensión HTML Tras la ejecución de la instrucción SQL, IDC lee el archivo de plantilla museos.htx especificado
en museos.idc
Los archivos .htx contienen etiquetas especiales de HTML utilizadas por IDC para
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
6) El IDC devuelve el documento combinado a IIS que, a su vez, lo devuelve al cliente Después de que se hayan
combinado todos los datos en
museos.htx, el documento HTML ya
completo se devuelve al cliente.
La página resultante aparece en el cliente como se muestra a la derecha (parcialmente).
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1
144..11..33..LLOSOS AARCRCHHIIVVOOSS DDEE PPLALANNTTIILLLLAA HHTTXX
El archivo .idc combina el archivo .htx y los datos de ODBC. Después se colocan las cabeceras
HTTP, se pasan al servidor de web y se devuelven al cliente
Las plantillas contienen órdenes que controlan la construcción del documento HTML
<%begindetail%>,<%enddetail%>
<%begindetail%> y <%enddetail%> enmarcan una sección de la plantilla donde se combinarán
los registros de salida de la base de datos
Dentro de la sección, los nombres de columna delimitados por <% y %> o <!--%%- -> se
utilizan para marcar la posición de los datos devueltos por la consulta. P.ej.:
<%begindetail%>
<%apellidos_cre%>, <%nombre_cre%> <%enddetail%>
presentará las columnas apellidos_cre y nombre_cre.
Si la consulta no devuelve ningún registro, la sección <%begindetail%> se omite
Por cada instrucción SQL que genere resultados (p.ej, SELECT), debe existir una sección <%begindetail%><%enddetail%> correspondiente en el archivo de plantilla.
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
<%if%>,<%else%>,<%endif%>
Los archivos de plantilla pueden contener sentencias condicionales para controlar la construcción de la página. La sintaxis general es:
<%if condición%> texto HTML
[<%else%> texto HTML] <%endif%>
donde condición tiene el formato valor1 operador valor2; y operador puede ser:
OPERADOR CIERTO SI
EQ valor1 es igual a valor2
LT valor1 es menor que valor2
GT valor1 es mayor que valor2
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Los operandos valor1 y valor2 pueden ser: nombres de columnas
una de las variables predefinidas un nombre de variable HTTP una constante
Cuando se utilizan en una instrucción <%if%>, los valores no están delimitados por <% y %>
CurrentRecord, MaxRecords
La variable predefinida CurrentRecord contiene el número de veces que se ha procesado la
sección <%begindetail%>.
La variable MaxRecords contiene el valor del campo MaxRecords del archivo del IDC.
J
J. .RARAMMÓÓNNGGAARRCCÍÍAAEESSCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Descripción del archivo museos.htx
El archivo museos.htx contiene etiquetas del IDC para los datos devueltos por la BD.
<HTML> <HEAD><TITLE>MUSEOS</TITLE></HEAD> <BODY BGCOLOR="#000000"> <CENTER> <FONT COLOR="#ffffff"> <H1>MUSEOS</H1> <BR><HR width=75%><BR> <%if CurrentRecord EQ 0%>
<CENTER>No hay datos de museos recogidos.</CENTER> <%else%> <TABLE> <TD> <%begindetail%> <TR><TAB> <A HREF=/scripts/descmuseo.idc?museo=<%idmuseo %>> <%nombre%></A></TR> <%enddetail%> </TD> </TABLE> <%endif%> <BR><BR></FONT></CENTER> <HR WIDTH=75%> </HTML>
filas devueltas por la BD. Las columnas devueltas por la consulta aparecerán rodeadas por <%%>;
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1
1
4
4
.
.
2
2
.
.
D
D
B
B
I
I
+
+
D
D
B
B
D
D
EENNP
P
E
E
R
R
L
L
Parece normal que se desarrollen extensiones a PERL para comunicar directamente con BD.
En los tiempos de PERL 4: oraperl, sybperl o msqlperl.
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1
144..22..11..DDESESCCRRIIPPCCIIÓÓNN
Las características de PERL 5 permitieron solucionar este problema mediante las bibliotecas de abstracción para bases de datos DBD/DBI (DBI significa DataBase Interface, y DBD DataBase Driver)
Podemos pasar aplicaciones PERL de un motor de BD a otro, y abrir conexiones a
varias BD distintas Programa en PERL con DBI API SE LECTOR Driver DBD para ODBC Driver DBD para ORACLE Motor ODBC Motor Oracle Otros drivers Ámbito de DBI Programa en PERL con DBI API SE LECTOR Driver DBD para ODBC Driver DBD para ORACLE Motor ODBC Motor Oracle Otros drivers Ámbito de DBI
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
DBI suministra una capa de abstracción que permite conectar la parte de la
aplicación y la del motor de base de datos.
DBD traduce las llamadas de DBI a un formato entendido por la base de datos
elegida.
DBD traduce las informaciones de los datos y status, y las devuelve a DBI.
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1
144..22..22..MMANANEJEJAADDOROREESS EENN DDBBII
Existen 3 tipos de manejadores: de driver, de base de datos y de sentencia:
1) Manejador de driver (drh): apunta al tipo de BD. Si se emplean varios tipos de BD, habrá un manejador por cada tipo distinto. Este driver actúa como intermediario entre el API de DBI y el motor de la base de datos (resumen: implementa el DBD)
2) Manejador de base de datos (dbh): encapsula una conexión a una base de datos. Puede haber cualquier cantidad de dbh por cada drh.
3) Manejador de sentencia (sth): representa una sentencia enviada a una base de datos.
Análogamente a dbh, puede haber una cantidad ilimitada de sths por cada conexión. Los sth pueden funcionar asíncronamente.
En ciertas ocasiones, al manejador de sentencia se le denomina cursor:
Selecciona múltiples filas, una en cada ocasión. P.ej., podría ser una sentencia SELECT o INSERT. No son operaciones atómicas.
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1
144..22..33..UUSOSO DDEESSDDEE UUNN PPROROGGRRAAMMAA PPEERRLL
Típicamente el programa en PERL emplea tres grupos de funciones de DBI:
Conectar y desconectar con/de la base de datos Abrir y cerrar cursores
Recuperar y colocar datos
El orden en que tales operaciones aparecen suele ser: 1) Cargar el driver de DBI
2) Conectar con la base de datos, lo que provoca implícitamente la carga del DBD necesario 3) Abrir un cursor que contiene una sentencia SQL
4) Obtener los resultados 5) Cerrar el cursor
6) Cerrar la conexión con la base de datos 7) Terminar
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Veamos estos pasos en detalle:
Cargar el driver de DBI Para poder hacer uso de DBI en los scripts, tan sólo se necesita añadir al principio de éstos la linea: use DBI.
Conectar con la base de datos Para conectar con la base de datos, será necesario definir algunos parámetros:
Driver DBD que se pretende utilizar.
Nombre de la base de datos a la que queremos conectar. Nombre del ordenador al que conectaremos.
Siguiente paso: ejecutar la conexión.
Esta llamada incluye dos parámetros adicionales: nombre de usuario y clave.
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Abrir un cursor que contiene una sentencia SQL A la hora de realizar consultas a la base de datos tenemos dos formas de hacerlo:
1) Una genérica, que permite recuperar las filas devueltas por SELECT. Se realiza en dos pasos:
$sth = $dbh -> prepare ($statement); $sth -> execute;
El primero consiste en preparar el query a ejecutar para el manejador $dbh.
La instrucción no se lleva a cabo hasta la sentencia EXECUTE.
Si ocurre algún error, nos devuelve un valor indefinido.
Si no fuera un select, nos devolverá el número de registros afectados.
En ambos pasos es posible llevar un control de errores.
2) Emplear la instrucción do, que prepara y ejecuta la query en un único paso: $sth = $dbh -> do ($statement);
Es más útil tanto para sentencias no select, que no pueden ser preparadas, como para
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
Obtener los resultados Los resultados están accesibles en el manejador de sentencia (sth).
Una de las operaciones aplicables es fetchrow_array, que devuelve el siguiente vector de resultados. Es habitual encontrar bucles de la siguiente forma:
while (@row = $sth->fetchrow_array) {
hacer lo que sea con $row[0] ... $row[N]
}
Cerrar el cursor Es una operación no siempre necesaria: $sth->finish;
Libera los recursos que está consumiendo, acción implícita al cerrar la conexión con
la base de datos en uso.
Cerrar la conexión con la base de datos Esta operación se lleva a cabo mediante el método disconnect, que se aplica al manejador de base de datos (dbh): $dbh -> disconnect;
Terminar No quedan más instrucciones en el CGI, o se emplea la sentencia exit de PERL.
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
1
144..22..44..UUN N EEJJEEMMPPLLOO
Es un prototipo usado en el proyecto Directorio de Arte Actual de la Comunidad Valenciana en
su implementación mediante LINUX, APACHE y PERL, utilizando MySQL como SGBD.
El script busquedas.pl, aprovecha las ventajas de la biblioteca CGI.pm en sus operaciones
de recuperación de parámetros y confección de documentos HTML.
Este script pretende seleccionar de la tabla CREADORES todos los autores cuyo apellido
comience por una letra que se pasa como parámetro al script.
#!/PATH_A_PERL use CGI;
use DBI;
# Defino las variables que voy a utilizar: $pagina = new CGI;
$db = “daacv”; $user = “nobody”; $password = “nobody”; $hostname = “localhost”; $titulo = “CREADORES”; $datasource = “DBI:mysql:$db:$hostname”;
# INICIO DEL PROGRAMA
$dbh=DBI->connect($datasource, $user, $password) or die “Fallo al conectar con el host: $host: $Mysql::db_errstr\n;
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
print $pagina -> header;
$letra = $pagina -> param(“letra”);
if ( ! $letra) {
&do_main($pagina, $titulo); } else {
&do_query($pagina, $titulo, $letra); }
print $pagina -> end_html;
# Obtengo la pagina principal sub do_main {
# ... Imprime la página donde se muestra el formulario de búsqueda... }
# Si se ha definido el criterio de búsqueda... sub do_query {
my ($pagina, $titulo, $letra) = @_; print $pagina -> start_html ($titulo);
$sql_query = “SELECT id_cre, apellidos_cre, nombre_cre FROM creadores
WHERE apellidos_cre like ‘$letra’
OR nombre_cre like ‘$letra’ AND tipo_cre=1");
$sth = $dbh -> prepare ($sql_query) or die “Error $DBI::errstr\n”; $sth -> execute or die “Error $DBI::errstr\n”;
$numrows = $sth -> rows; if ($numrows == 0) { $sth = “Ninguno”;
J
J..RARAMMÓÓNNGGAARRCCÍÍAAESESCCRRIIVVÁÁ((DDSSIIC C- -UUPPVV))
if ($sth != “Ninguno”) { # Se encontró algún artista... print $pagina -> start_html($titulo);
for ($i=1; $i<=$numrows) {
@tmparray = $sth -> fetchrow_array; $identificador = $tmp_array[0]; $apellidos = $tmp_array[1]; $nombre = $tmp_array[2];
print (“<CENTER>$apellidos, $nombre</CENTER>\n”); }
$sth -> finish;
} else { # Imprimimos búsqueda no satisfactoria y se acabó... print $pagina->start_html (“Busqueda fallida”);
print (“<H3>No hay ningún creador cuyo apellido o nombre coincida con: $letra.</H3>”);
}
print $pagina -> end_html; }