En esta segunda y última parte, les mostraré en que consisten los archivos login.php, autenticacion.php, aplicacion.php y un cuarto archivo salir.php

El primer archivo, login.php, es bastante simple. Sólo se trata de un simple condicional que verifica la existencia o no de una variable al principio del script que, dependiendo del resultado, muestra un texto de advertencia en un color o en otro. La última parte del script es un formulario que al introducir los datos redirigirá la página a autenticacion.php.

login.php

<html>
<head>
<title>Autenticación PHP</title>
</head>
<body>
<h1>Formulario de autenticación</h1>
<?if ($_GET["errorusuario"]=="si"){?>
<font color="red"><b>Datos incorrectos</b></font>
<?}else{?>
Introduce tu nombre de usuario y contraseña
<?}?>
<form action="autenticacion.php" method="POST">
<table border="0">
<tr><td>Nombre de usuario:</td><td><input name="usuario" size="25" value=""/></td></tr>
<tr><td>Contraseña:</td><td><input name="contrasena" size="25" type="password"/></td></tr>
<tr><td/><td><input type="submit" value="Inicio de sesión"/></td></tr>
</table>
</form>
Para ingresar, debés ingresar <b>usuario</b> en el 1er campo y <b>123</b> en el 2do.
</body>
</html>

El otro archivo es el autenticacion.php. Es también bastante simple.

autenticacion.php

<?
//vemos si el usuario y contraseña son válidos
if ($_POST["usuario"]=="usuario" && $_POST["contrasena"]=="123"){
//usuario y contraseña válidos
//se define una sesion y se guarda el dato session_start();
$_SESSION["autenticado"]= "SI";
header ("Location: aplicacion.php");
}else {
//si no existe se va a login.php
header("Location: login.php?errorusuario=si");
}
?>

Como habrán visto, se hace uso de sesiones para manejar una variable que se utilizará para indicar si el usuario se logeó en forma exitosa o no.

En estos scripts no trabajo con una base de datos para no alargar demasiado este post, pero lo que aquí sí interesa es la recuperación de las variables de usuario y la clave correctas para compararlas con las que se ingresan desde el formulario. Aquí directamente comparamos los campos ingresados del formulario con dos variables ya definidas.

En caso de ingresar los datos correctos, se crea una variable de sesion (autenticado -que será leída más tarde desde los scripts de la aplicación segura-) y se redirigirá la página a aplicacion.php. En caso de ingresar datos incorrectos, no se crea esa variable de sesion y se pasa una variable de error a login.php que sirve para mostrar en pantalla que ingresamos mal los datos.

Antes de mostrar aplicacion.php, voy a mostrarles en que consiste el bloque de seguridad que estará dentro de aplicacion.php en forma de un include.

bloqueDeSeguridad.php

<?
//Inicio la sesión
session_start();
//COMPRUEBA QUE EL USUARIO ESTA AUTENTICADO
if ($_SESSION["autenticado"] != "SI") {
//si no existe, va a la página de autenticacion
header("Location: login.php");
//salimos de este script
exit();
}
?>

En ésta parte sólo se verifica que exista la variable de sesion (autenticado). Si existe no hace nada y continúa, y si no existe, redirige la página a login.php

Ahora pasamos a ver el script aplicacion.php. Este contiene el bloque de seguridad al principio, de tal manera de que sea lo primero que se ejecute en el script… El contenido de la aplicación segura es trivial.

aplicacion.php

<?include ("bloqueDeSeguridad.php");?>
<html>
<head>
<title>Aplicación segura</title>
</head>
<body>
<h1>Ahora estás en una aplicación segura</h1>
<br>
<br>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
<br>
<br>
<br>
<a href="salir.php">Hacé click aquí para salir</a>
</body>
</html>

Es interesante comprobar que pasa si se tipea en el browser directamente aplicacion.php. Podremos comprobar que no accede a la misma. Esto es porque en este script, al princio está el bloque de seguridad que, al no ver la variable de sesion porque no existe o porque si existe su valor es incorrecto, en vez de continuar con el script de aplicacion.php, corta todo ahí mismo y redirige a login.php

Por último para salir de la sesion, es decir para destruir la variable de sesion, se puede hacer clik en salir.php. La razón por la que podríamos desear destruir esa variable es que no quisiéramos que algún intruso aproveche el descuido de un usuario válido, que al retirarse momentáneamente de su computadora, aquél utilice ésa misma computadora para acceder a contenidos seguros.

salir.php

<?
session_start();
session_destroy();
?>
<html>
<head>
<title>Contenido no seguro</title>
</head>
<body>
Ahora estás fuera de la aplicación segura.
<br>
<br>
<a href="login.php">Autenticar usuario</a>
</body>
</html>

Eso es todo.

Se debe saber que la forma en se implementó este sistema de seguridad es bastante discutible. Por ejemplo, la variable de sesion (autenticado) es bastante simple de “adivinar” y por lo tanto, tendríamos que crear una variable de sesion con un nombre un poco mas complejo, como ser “HjkrTS3986Yg444aASds”.

Ver el ejemplo funcionando



39 Responses to “Validación o autenticación de usuarios en PHP (segunda parte)”  

  1. 1 Luk

    Excelente articulo, era justo lo que buscaba!

  2. 2 angel

    hola me encantaría validar campos de texto

  3. Hola;

    He leído todos los artículos que he encontrado por ahí sobre este tema, sobre todo los de desarrollo web. Me he bajado los scripts y los he probado en mi propio server de pruebas (easyPHP 1.8.0.1) y resulta que no me funcionan. Me da los siguientes errores en tu script:

    1)– Notice: Use of undefined constant ”errorusuario” – assumed ‘”errorusuario”’ in pr.php on line 7

    2)– Notice: Undefined index: ”errorusuario” in pr.php on line 7

    3)– Notice: Use of undefined constant ”si” – assumed ‘”si”’ in pr.php on line 7

    Mientras que en el de desarrollo web me da el siguiente:

    1)– Notice: Undefined index: errorusuario in index.php on line 14

    ¿A qué se debe? No entiendo nada, la verdad es que ayer me iba a la perfección, pero hoy no va ni a tiros. ¿Puede ser un problema de mi servidor? ¿Cómo arreglar el estropicio? ¿Hay alguna palabra reservada para iniciar el array &_GET[], o debería tener valor null por defecto y entrar correctamente en el condicional? Como ves me pide que la variable esté definida. Mediante el empleo de
    header(”location:index.php?errorusuario=no”) parece que funciona, pero aun así se vuelve un poco loco el explorador, tanto el iexplorer como el mozilla, por no decir que éste último simplemente deja de mostrar la página y me muestra un error de conexión. No entiendo nada y ando muy perdido, no sé que puede estar fallando. ¿Alguien me podría ayudar? Avíseme al mail si no es mucha molestia para ver resultados, pues he posteado en tantos sitios que ya no sé cuantos foros tendré que volver a mirar para ver si alguien me responde con sensatez.

    Gracias de antemano, Zekinash
    (zekinash@hotmail.com)

  4. 4 José Manuel

    Bueno el articulo, tengo un pequeño problema, yo modifique un poco el código con una conexion a una base de datos mediante php, para que busque en ella los usuarios y contraseñas, en esa tabla tambien tengo un campo denominado nivel que es un entero que determina que privilegios tiene un usuario determinado para acceder a las distintas páginas de mi aplicación mi duda es como se puede relacionar la sesion que se abre con el perfil o nivel del usuario que acaba de ingresar a la aplicación…

  5. José Manuel: sí, tenés razón este sistema de seguridad se debe usar con una base de datos para comprobar los datos de varios usuarios.
    Con respecto a tu pregunta sobre discriminar a los usuarios que acceden a tu sitio de acuerdo a “niveles”, lo que podés hacer es crear una variable de sesion con tantos valores posibles como niveles de usuarios tengas. Luego en tus páginas seguras tendrías que comprobar el valor de esa variable de sesion y, de acuerdo al valor que tenga, le permitís el acceso o no. Se entiende? En el archivo “autenticacion.php” se crea una variable de sesion “autenticado”. En tu caso tomás el “usuario”, la “clave” y el “nivel” de acceso, de una base de datos (el nivel lo tendrías que definir en la base de datos). Luego comparás usuario con lo que se ingresó en el campo de texto del formulario y lo mismo con clave. si son corectas y, según el nivel, a la variable de sesion “autenticado” le podés asignar el valor “SI_1″, “SI_2″…etc. En las páginas seguras, o más bien dentro de bloqueDeSeguridad.php, tendrías que ver si “autenticado” vale según los valores que definiste y de acuerdo a eso permitís accesos…. Vuelvo a repetir que sería aconsejable llamar a “autenticado” de otra forma y obviamente “SI_1″, “SI_2″, etc también llamarlas de otra forma para que no sean fáciles de “adivinar”.

  6. angel: ¿qué clase de validación querés hacer en un campo de texto? ¿fechas? ¿direcciones de correo? ¿o algún texto de uso particular? Te puedo adelantar que básicamente hay dos maneras de validar campos de texto. Una es del lado del servidor usando PHP, y también puede ser que además necesites hacer uso de MySQL, y la otra es validando texto del lado del cliente usando JavaScript. La principal diferencia entre estas dos formas de validación es que, con la primera, tu página está obligada a hacer un “refresh”, es decir que el browser “recarga la página”. Con Javascript, no se recarga nada. ¿En qué afecta eso?, bueno, ya lo habrás visto un montón de veces! si se produce un refresh, los otros campos de texto se borrarán (casi siempre en un formulario trabajamos con mas de un campo de texto: nombre, apellido, domicilio, edad, etc,etc) y sólo conservará texto el campo con el que estés trabajando. Esto es realmente muy molesto porque el usuario se ve obligado a cargar nuevamete todos los campos de ese formulario. En cambio, si no se produce el refresh (con JavaScript) validás el campo que te interesa y además mantenés cargados los otros campos. Eso significa que no tenés que volver a llenar todo el formulario de nuevo…. ¿Se entiende?
    Te aclaro que, también podés mantener los datos de todos los campos de texto pormás que hagas un refresh, aunque, ahí sí tenés que escribir un poco de código en php, en éste caso.
    No sé, si me das un poco más de detalles sobre qué querés validar, a lo mejor te puedo ayudar.

  7. 7 elisa

    Hola, esta muy bien el artículo y cuando lo haga funcionar me será muy útil :D
    Me sale este error:

    Warning: main(”bloqueDeSeguridadphp”): failed to open stream: No such file or directory in c:\appserv\www\validacion\aplicacion.php on line 1

    Warning: main(): Failed opening ‘”bloqueDeSeguridadphp”’ for inclusion (include_path=’.;c:\php4\pear’) in c:\appserv\www\validacion\aplicacion.php on line 1

    he copiado tu codigo tal cual, y los nombres de los archivos estan bien. Hace falta configurar algo para poder hacer includes?

    Gracias, un saludo.

  8. 8 elisa

    2 minutos mas tarde…
    Ya lo he solucionado, se trataba de (todas) las comillas, las que has usado aqui no las reconocía… las he cambiado por ” ” y ya está.

  9. 9 elisa

    Hola,
    Tengo una cuestión referente a lo de los niveles de usuario que comentaba José Manual. En mi caso, segun el tipo de usuario tengo que mostrar una aplicacion o otra (Se trata de una biblioteca, y existen lectores y administrador). Había pensado que para cada tipo de ususario existiria un “bloquedeSeguridad” que tendria que incluirlo en cada pagina de la aplicacion correspondiete a ese usuario. Si no es asi, como se podria poner todo en un unico bloqueDeSeguridad.php?
    Gracias, un saludo.

  10. LOGIN DE USUARIOS CON DISTINTOS NIVELES DE ACCESO.

    Elisa: éste es mas o menos la solución a tu problema.

    autenticacion.php
    <?
    // Valores que se obtienen de una consulta a una bd.
    // variando a voluntad el valor de la variable $nivel por 1, 2 o 3, cambiará el contenido
    // en el script "aplicacion.php"
    $user="usuario";
    $pass="123";
    $nivel=1;
    //vemos si el usuario y contraseña es válido
    if ($_POST["usuario"]==$user && $_POST["contrasena"]==$pass){
    //usuario y contraseña válidos
    //defino una sesion y guardo datos
    session_start();
    switch($nivel){
    case 1:
    $_SESSION["autenticado"]= "nivelUno";
    break;
    case 2:
    $_SESSION["autenticado"]= "nivelDos";
    break;
    case 3:
    $_SESSION["autenticado"]= "nivelTres";
    break;
    }
    header ("Location: aplicacion.php");
    }else {
    //si no existe le mando otra vez a la portada
    header("Location: login.php?errorusuario=si");
    }
    ?>

    Aquí, básicamente, le asignamos a la variable de session tantos valores posibles como niveles de usuarios tengamos. Podrás ver que al principio de éste script, obtengo las variables $user, $pass y $nivel por medio de una consulta a una base de datos. Es interesante comentar que aquí podríamos recibir otras variables de un usuario en particular, como pueden ser la dirección, el mail, etc. Una vez discriminado un usuario y al moverse por el sitio, si éste desea mandar un mail a otro usuario, al haber ya tomado sus datos en la consulta, los valores de su dirección de correo y sus datos personales se pueden escribir “automáticamente” sin necesidad de “molestar” al usuario pidiéndole que los ingrese…. se entiende? son sólo algunas ideas.

    Siguiendo con la modificación a los script, también tenemos que modificar también el siguiente archivo:

    bloqueDeSeguridad.php
    <?
    //Inicio la sesión
    session_start();
    //COMPRUEBA QUE EL USUARIO ESTA AUTENTIFICADO
    if ($_SESSION["autenticado"] != "nivelUno" and $_SESSION["autenticado"] != "nivelDos" and $_SESSION["autenticado"] != "nivelTres") {
    //si no existe, envio a la página de autenticacion
    header("Location: login.php");
    //ademas salgo de este script
    exit();
    }
    ?>

    Acá, sólo comprobamos que la variable de session tenga como valor un valor válido.
    También cambia el archivo de aplicación.

    aplicacion.php
    <?include ("bloqueDeSeguridad.php");?>
    <html>
    <head>
    <title>Aplicación segura</title>
    </head>
    <body>
    <h1>Ahora estás en una aplicación segura</h1>
    <br>
    <?php
    session_start();
    // Muestra texto sólo para usuarios de nivel uno.
    if ($_SESSION["autenticado"] == "nivelUno") {
    echo '<font color="red"><b>Este texto es sólo para usuarios de nivel UNO</b></font>';
    }
    // Muestra texto sólo para usuarios de nivel dos.
    if ($_SESSION["autenticado"] == "nivelDos") {
    echo '<font color="red"><b>Este texto es sólo para usuarios de nivel DOS</b></font>';
    }
    // Muestra texto sólo para usuarios de nivel tres.
    if ($_SESSION["autenticado"] == "nivelTres") {
    echo '<font color="red"><b>Este texto es sólo para usuarios de nivel TRES</b></font>';
    }
    ?>
    <br>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    <br>
    <a href="salir.php">Hacé click aquí para salir</a>
    </body>
    </html>

    En éste último archivo, yo muestro una sóla página con parte de su contenido discriminado para cada nivel de usuario, pero hay también otras posibilidades, como pueden ser hacer otra página para un nivel de usuario en particular, etc, etc, etc. Las posibilidades son infinitas!

    “login.php” y “salir.php”, no necesitan modificarse en éste caso.

    Saludos y espero que te sirva :)

  11. 11 omar

    todo excelente

  12. 12 carlos

    salee todo chidooo muy buenooo,

  13. 13 ricardo

    Gracias, este es una aplicación que necesitaba para realizar una aplicación. Es muy clara la manera en que se explica todo.

  14. 14 andres

    hola a todos, me copie el ejemplo y cuando pongo usuario y 123 en los campos correspondientes me vulve a cargar el login.php con los campos vacios, por favor si alguien sabe algo sobre el tema, desde ya se lo agradezco !!!!

  15. 15 ameth

    buenas he leido tu aplicacion tengo inconvenientes me interesa tu aplicacion pues estoy realziando un trbaja o fina l de universidad y necesito algo asi pero cuando le coloco el usuario y la contraseña se va a autenticacion.php y no prosigue de ahi agradesco tus comentarios o lso de cualqueira

  16. Hola andrés. Sólo tendrías que fijarte que en el archivo “login.php”, en la linea correspondiente a la cabecera del FORM, que ACTION sea “autenticacion.php”. Si hay algún error de tipeo, no lo reconocerá y volverá a “login.php”

  17. 17 Karla Páez

    Hola!!…pues muchísimas gracias por este súper ejemplo, me ha sido de mucha utilidad ;)

  18. 18 Ben

    Para todos aquellos que os de errores, probad a reescribir todas las comillas, ya que al hacer copy/paste del código, las comillas sufren modificación.

    Muchas gracias por este ejemplo.

  19. 19 Majony

    Mira cambia todas las comillas y la verdad cuando pongo usuario y 123 no me manda a la aplicacion no se porque alguien podria decirme

  20. hola Majony. El archivo login.php tiene una etiqueta form, que seguramente ya la habras visto en detalle. Allí, através de action, te manda al archivo autenticacion.php. Me ha pasado aveces que por no colocar bien las comillas o por un error de tipeo no esta bien escrito el archivo al que se supone debe ir. Tratá de ver si está todo bien tipedo. si continua dandote error, me podrías decir que mensaje de error te aparece?

  21. 21 Samir Cabrera Moreno

    Tengo un problema con el codigo y es que cuando digito mal el usuario y contraseña me sale el arror y me deja en login, hasta hay todo bien pero cuando escribo bien el usuario y la contraseña no me envia hacia aplicacion, sino que me deja en login como al principio claro no me muestra datos incorrectos.

    Hay que hacer un cambio al codigo o que?
    no se que pasa,

    Att,
    Samir Cabrera Moreno

  22. Hola Samir. Mirá, me parece que tendrías que ver como has tipeado las comillas. todas las comillas tienen que ser las rectas, y no las itálicas. Fijate bien porque aquí en el post aparecen algunas itálicas y no debe ser asi sino con las rectas. Pero si te continúa el error de todas maneras, analicemos un poco lo que te sucede:

    si tipeás el usuario y la contraseña correctamente y lo mismo te manda a la pagina de login, significa que no estás haciendo la comprobación $_POST["usuario"]==”usuario” y/o $_POST["contrasena"]==”123″) en forma correcta. Osea que lo que tipeás no es lo mismo que lo que estás comparando, no hay otra posibilidad de error supongo. Tendías que fijarte como escribiste el script en esa parte del archivo autenticacion.php.

    Ahora bien, si la comparación no fue correcta, que es justamente lo que te está pasando, se ejecuta la sentencia header(”Location: login.php?errorusuario=si”). Es decir, te manda a la página de login junto con una variable errorusuario con valor si. Te fijaste que te aparezca esa veriable validada en la barra de dirección de tu navegador? Fijate, debería aparecer.

    Por último, al volver a la página login.php, lo primero que se ejecuta es la verificación de la existencia de la variable y su valor (if $_GET["errorusuario"]==”si”). Si no te está mostrando un mensaje de error de usuario, es porque o no existe la variable errorusuario, o si existe su valor es distinto de “si”.

  23. 23 Flor Angela

    Tengo el mismo problema que Andres, Majony , Samir Cabrera Moreno, yo creo que deberías revisar el código que aparece acá , por que no funciona correctamente

    Gracias.

    Ahh y no son las comillas…

  24. 24 Flor Angela

    Yo misma lo respondo:
    Tienen que habilitar en el php.ini una variable que por defecto es 0, la ponen en 1, debe quedar así:

    session.use_trans_sid = 1

  25. 26 Alfred

    Hola, me pasa lo que Andres, Majony , Samir Cabrera Moreno y Flor Angela, los ficheros estan correctos, editados y deberian de funcionar, sin embargo leyendo la respuesta de Flor Angela he visto que mi session.use_trans_sid lo tengo como Off, y al ser dominio de hosting no me he posible modificarlo, alguien me puede hecar un cable para solucionar este problema, repito NO es problema de comillas, y si, form dirije a donde debe, por lo q puede q el problema sea el session.use_trans_sid.

    Alguna ayuda???

    Gracias y buen finde

  26. 27 hernan

    hola, muchisimas gracias por tu informacion acerca de la seguridad, me sirvio de mucho, ya q estoy implementando un sistema de gestion vehicular y justamente me faltaba el modulo de seguridad para los usuarios. saludos y una vez mas muchas gracias

  27. 28 William

    Si funciona el codigo , revisen bien la parte de session_start() ; ahi yo tenia el error y no se iba para aplicacion.php
    De toda la informacion sobre sesiones que encontrado, esta es la mejor practica
    sencilla y facil de entender.

  28. 29 Henry

    Hola a todos, en estos momentos tengo una base de datos con los login y password, necesito saber como hago para que este me consulte la base de datos y me diga si estos son correctos. En caso contrario que no me deje ingresar.
    Por su colaboración muchas gracias.

  29. 30 alfonso

    hola buenas tardes.
    no tengo muchos conocimientos de php, he estado he visto varios manuales, pero hay algunos conceptos que no comprendo bien, he puesto en funcionamiento el ejemplo y funciona perfectamente, quiero utilizar una base de datos que contiene un codigo y un nombre para cada usuario, pero no se como integrarla al ejemplo que nos muestras, te agradeceria me orientaras como hacerlo.

    reitero mi agradecimiento por tu atencion y tu tiempo que le puedas brindar a mi solicitud

  30. 31 carlos

    no me funciona el codigo al tratar de integrarlo a mi web, hice la prueba de copiar tambien directamente el codigo sin cambiarle naday tampoco me funciona, al poner el usuario y el password me devuelve a login y no me sale error ni nada. que puede ocurrir con esto?

    gracias

  31. 32 Oswaldo

    me gusto el consejo muy bueno y sirve lo estoy poniendo en practica y que los conocimientos se compartanr

  32. 33 Eric

    Hola a todos espero que esten bien y me puedan ayudar.
    cuando lo inicio me aparece este error:

    Notice: Undefined index: errorusuario in c:\archivos de programa\easyphp1-8\www\validar usuario y contraseña\login.php on line 7
    Introduce tu nombre de usuario y contraseña

    ya..

    y cuando le doy y contraceña y el nombre de usuario correcto0 me sale este error:

    Notice: Undefined index: autenticado in c:\archivos de programa\easyphp1-8\www\validar usuario y contraseña\bloqueDeSeguridad.php on line 5

    Warning: Cannot modify header information – headers already sent by (output started at c:\archivos de programa\easyphp1-8\www\validar usuario y contraseña\bloqueDeSeguridad.php:5) in c:\archivos de programa\easyphp1-8\www\validar usuario y contraseña\bloqueDeSeguridad.php on line 7

    ojalà alguien sepa comolo puedo solucionar gracias

  33. pero si pongo en la direccion aplicacion.php la abre y asi que chiste aun no me halla logeado
    faltaria colocar authentificacion en aplicacion.php para que afuerza uno se tenga que logear para poder visualizar esa url

  34. 35 koflayn

    No se cual es el error del codigo por el cual cuando se coloca el usuario y la contraseña no redirecciona correctamente, pero encontre la solucion haciendo que tome los datos de USUARIO y CONTRASEÑA desde MYSQL.

    Remplazando el codigo del archivo “autenticacion.php” por el siguiente codigo:

    ———————————————–
    y este es el codigo del archivo “conexion.php” donde deben colocar los datos de su base de datos:

    ——————————————————————

    espero les funcione tan bien como ami.

  35. 36 koflayn

    che wlannot no me sensures el codigo que ahí esta la papa!!!!

  36. 37 alexis

    no tienes para descargar la web? seria de mucha ayuda

  37. 38 Martin

    Si mi ignorancia no es mucha , creo que hay un error , a saber: cuando se referencia una variable de sesion primero se debe saber si existe dicha variable
    (if (! isset($_SESSION["nom_usu"]) ))

    saludos

  38. 39 Natalia

    realmente es exelente el articulo y la explicacion, funciona a la perfeccion y esta muy sencillo explicado. Muchisimas gracias, me ahorraste mucho tiempo en andar buscando por foros donde nunca queda nada claro. Nuevamente gracias


Leave a Reply