martes, 17 de diciembre de 2013

Haciendo consultas a la base de datos - CGI de Perl



Interesante: Vídeo Tutorial del CGI de Perl

Interesante: Vídeo Tutorial del lenguaje Perl

Bienvenid@s a este nuevo capítulos donde seguiremos progresando con el módulo CGI de Perl, en esta ocasión vamos a ver como conectarnos a una base de datos, a la cual realizaremos una consulta tras enviar un formulario.

El ejemplo de este capítulo consiste en un pagina "login.html" que contiene un formulario con dos campos "usuario" y "password", al enviar el formulario un script "confirmar.cgi" verificará si los datos enviados son correctos y existen en una tabla mysql llamada login, de existir nos mostrará un mensaje de bienvenida, de lo contrario redireccionará nuevamente a la página "login.html".

Para el ejemplo vamos a necesitar una base de datos mysql, yo he creado una llamada cgi, en la cual he creado una tabla llamada login con una fila en la que se encuentra el usuario y password para realizar el login.

Cuando hayas creado la base de datos, copia el siguiente código sql y realiza una consulta para grabar la tabla ...


CREATE TABLE login(
id INT(11) NOT NULL AUTO_INCREMENT,
usuario VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
);

INSERT INTO login(usuario, password) VALUES('root', 'password');


Crear la tabla ...



Vista de La fila ...



Ok, ahora es el momento de crear la página que contendrá el formulario, guarda este archivo en la carpeta tutorial-cgi como login.html ...


<!DOCTYPE HTML>
<html>
<head>
<title>LOGIN</title>
</head>
<body>
<center>
<h1>LOGIN</h1>
<form method="post" action="cgi-bin/confirmar.cgi">
Usuario: <input type="text" name="usuario" placeholder="usuario">
Password: <input type="password" name="password">
<input type="submit" value="Iniciar sesión">
</form>
</center>
</body>
</html>


Ahora ve al navegador y dirígete a la siguiente ruta ... http://localhost/tutorial-cgi/login.html ...



Ok, ahora vamos a crear el script cgi como siempre en la carpeta cgi-bin, guárdalo como confirmar.cgi ...


#!"C:\xampp\perl\bin\perl.exe" 

use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser); #Muestra posibles errores en el navegador
use DBI; #Conector para la base de datos

#Se crea el objeto CGI
my $cgi = new CGI;

#Recibimos los parámetros
my $usuario = $cgi->param("usuario");
my $password = $cgi->param("password");

#filtrar los datos para dar seguridad a las consultas a la base de datos
if ($usuario !~ /^[a-zA-Z]+$/ || $password !~ /^[a-zA-Z]+$/)
{
#Redireccionar nuevamente a la página de login
print $cgi->header(-location => "../login.html");
exit();
}

#Datos de conexión a la base de datos
my $admin = "root";
my $pass = "password";
my $base_de_datos = "cgi";
my $servidor = "localhost";

#Se establece la conexión a la base de datos mysql
my $mysql = DBI -> connect("DBI:mysql:$base_de_datos;host=$servidor", $admin, $pass) || die "Error al conectar con la base de datos: $DBI::errstr";

#Preparamos la consulta para seleccionar datos
my $consulta = $mysql->prepare("SELECT * FROM login WHERE usuario='$usuario' AND password='$password'") || die "Error al seleccionar datos: $DBI::errstr";
#Se ejecuta la consulta
$consulta->execute();
#Se busca si existe la fila con tal usuario y password
my $encontrar = 0;
while ($consulta->fetch())
{
$encontrar = 1;
}

my $respuesta = '';
#Si la fila existe
if ($encontrar eq 1)
{
$respuesta = '<h1>Datos de usuario correctos</h1>';
$respuesta .= "<p>Bienvenido <strong>$usuario</strong></p>";
}
else
{
$respuesta = 'Error. Los datos no son correctos ... redireccionando en 3 segundos';
$respuesta .= "<meta http-equiv='refresh' content='3; ../login.html'>";
}

#La vista del documento HTML
print $cgi->header(-type => "text/html");
print $cgi->start_html();
print $respuesta;
print $cgi->end_html();



Ok, el script confirmar.cgi viene comentado en cada acción que se realiza para que quede más claro, como novedad vemos el módulo DBI que nos permitirá conectarnos a bases de datos, en este caso se trata de una base de datos mysql, aunque podrías hacerlo con la mayoría de las conocidas, simplemente indicándolo en el método connect() 

En el script también puedes ver como los datos son filtrados antes de realizar la consulta, esto es importante tenerlo en cuenta por motivos de seguridad.

 Ahora vamos a ver su funcionamiento, si envías el formulario con un tipo de datos distinto de letras, por ejemplo ingresa números u otros caracteres para ver que ocurre, simplemente te redirecciona nuevamente a login.html, esto es debido al filtrado de datos, ya que sólo se aceptan letras.

print $cgi->header(-location => "../login.html");
  
Ok, ahora intenta acceder ingresando letras pero sin que sean los verdaderos datos de acceso ...

Te muestra un mensaje de error y te redireccionará nuevamente a login.html.

Ahora si introduces los datos correctamente, es decir en usuario introduces root y en password introduces password, verás el siguiente resultado ...



Bien, como puedes ver ahora sí te da la bienvenida, ya que has ingresado los datos correctamente. Poco a poco vamos viendo la potencia de trabajar con el CGI de Perl.