Diferencia entre revisiones de «Usuario:ManuelRomero/php/smarty/login»
De WikiEducator
< Usuario:ManuelRomero | php
Línea 21: | Línea 21: | ||
#Si todo ok, mostrará la plantilla productos.tpl; | #Si todo ok, mostrará la plantilla productos.tpl; | ||
#Si no se ha validado, mostrará la plantilla login.tpl con el error encontrado | #Si no se ha validado, mostrará la plantilla login.tpl con el error encontrado | ||
+ | *Para implementar esta parte del proyecto necesitaremos desarrollar los siguientes ficheros | ||
+ | #DB.php (clase) | ||
+ | #login.php (lógica) | ||
+ | #productos.php (lógica sin contenido) | ||
+ | #login.tpl (presentacion). | ||
+ | |||
+ | ===Desarrollando el código=== | ||
+ | ;DB.php | ||
+ | *Esta es una clase que mantendrá todo el acceso a la base de datos | ||
+ | *De momento solo necesito un método de validar el usuario | ||
+ | *Este método tendrá que hacer 3 cosas: | ||
+ | #conectar a la base de datos, | ||
+ | #realizar una consulta, | ||
+ | #verificar que la consulta contenga un registro (OK! Usuario existe), o no (Usuario no registrado) | ||
+ | *Seguramente otros métodos tengan que hacer estas acciones (conectar, ejecutar consultas, …), por lo que estas acciones será métodos privados de la clase. | ||
+ | *Para poder pasar parámetros a la hora de ejecutar la consutla usaremos '''''PDO''''' en lugar de '''''mysqli''''' | ||
+ | [[Archivo:BD.php]] | ||
+ | *El código de esta clase | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | |||
+ | |||
+ | class DB { | ||
+ | //atributo privado de conexión | ||
+ | private static $conexion; | ||
+ | |||
+ | /*======================conectar()====================================== | ||
+ | conecta con la base de datos, usando PDO | ||
+ | da valor al atributo privado y estático $conexion de la clase | ||
+ | En caso de no conectarse aborta la app y muestra un mensaje | ||
+ | ****************************************************************************************** */ | ||
+ | private static function conectar(){ | ||
+ | $opc = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); | ||
+ | $dsn = "mysql:host=localhost;dbname=manuel_dwes"; | ||
+ | $usuario = 'manuel_manuel'; | ||
+ | $contrasena = 'xv2e6w'; | ||
+ | try{ | ||
+ | $conexion= new PDO($dsn, $usuario, $contrasena, $opc); | ||
+ | $conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | ||
+ | }catch (PDOException $e) { | ||
+ | die ('Abortamos la aplicación por fallo conectando con la BD' . $e->getMessage()); | ||
+ | } | ||
+ | self::$conexion = $conexion; | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | /*======================ejecutaConsulta ($sql,$valores)====================================== | ||
+ | Accion: Ejecuta una consulta preparada con los valores de los parámetros de la consulta preparada | ||
+ | Parámetros: $sql es la consulta preparada y parametrizada | ||
+ | $valores es un array asociativo con los valores de los distintos | ||
+ | parámetros de la consulta anterior | ||
+ | Retorna =La consulta despues de ejecutarla, o null si no la ha podido ejecutaqr | ||
+ | en caso de no ejecutarla da un mensaje | ||
+ | * ***********************************************************************************************/ | ||
+ | protected static function ejecutaConsulta($sql,$valores) { | ||
+ | if (self::$conexion == null) | ||
+ | self::conectar(); | ||
+ | $conexion = self::$conexion; | ||
+ | try{ | ||
+ | $consulta = $conexion->prepare($sql); | ||
+ | $consulta->execute($valores); | ||
+ | }catch (PDOException $e) { | ||
+ | echo 'No se ha podido ejecutar la consulta' . $e->getMessage(); | ||
+ | return null; | ||
+ | } | ||
+ | return $consulta; | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | /*======================verificaCliente ($nombre,$pass)====================================== | ||
+ | Accion: verifica si un nombre y pass son contenidos en la base de datos | ||
+ | Parámetros: $nombre es el nombre de usuario | ||
+ | $pass es la password para ese nombre | ||
+ | Retorna true o false según se haya podido o no validar | ||
+ | * Recordar que la pass está cifrada con md5 en la base de datos | ||
+ | * ***********************************************************************************************/ | ||
+ | public static function verificaCliente($nombre, $pass) { | ||
+ | $valores = array('usuario'=>$nombre, 'password' =>$pass); | ||
+ | $sql = <<<FIN | ||
+ | SELECT usuario FROM usuarios | ||
+ | WHERE usuario=:usuario | ||
+ | AND contrasena=md5(:password) | ||
+ | FIN; | ||
+ | $resultado = self::ejecutaConsulta ($sql,$valores); | ||
+ | $verificado = false; | ||
+ | if ($resultado->fetch()) | ||
+ | $verificado=true; | ||
+ | return $verificado; | ||
+ | } | ||
+ | }//End de la clase DB.php | ||
+ | |||
+ | ?> | ||
+ | </source> | ||
+ | ;login.php | ||
+ | ;login.tpl | ||
+ | ;productos.php |
Revisión de 11:54 12 ene 2015
La lógica
- Generaremos el fichero login.php
- Su función es autentificar al usuario de la aplicación web.
- Todos los usuarios de la aplicación deberán autentificarse utilizando esta página antes de poder acceder al resto de páginas.
- La siguiente imagen muestra un caso de uso de este escenario
- Descripcion de la imagen
- Login pedirá un usuario y contraseña para validar
- Al darle a validar, se validará el usuario contra la base de datos.
- Si no es ok mostrará un error y seguiremos en login.php, si es correcto iremos a productos.php
Para este escenario necesitaremos los siguientes ficheros según vemos en la imagen
- Descripción de la imagen
- El cliente invoca al fichero login.php
- Este método solicitará usuario y contraseña visualizando la plantilla login.tpl
- Cuando presionemos enviar validará contra la base de datos
- Si todo ok, mostrará la plantilla productos.tpl;
- Si no se ha validado, mostrará la plantilla login.tpl con el error encontrado
- Para implementar esta parte del proyecto necesitaremos desarrollar los siguientes ficheros
- DB.php (clase)
- login.php (lógica)
- productos.php (lógica sin contenido)
- login.tpl (presentacion).
Desarrollando el código
- DB.php
- Esta es una clase que mantendrá todo el acceso a la base de datos
- De momento solo necesito un método de validar el usuario
- Este método tendrá que hacer 3 cosas:
- conectar a la base de datos,
- realizar una consulta,
- verificar que la consulta contenga un registro (OK! Usuario existe), o no (Usuario no registrado)
- Seguramente otros métodos tengan que hacer estas acciones (conectar, ejecutar consultas, …), por lo que estas acciones será métodos privados de la clase.
- Para poder pasar parámetros a la hora de ejecutar la consutla usaremos PDO en lugar de mysqli
- El código de esta clase
<?php class DB { //atributo privado de conexión private static $conexion; /*======================conectar()====================================== conecta con la base de datos, usando PDO da valor al atributo privado y estático $conexion de la clase En caso de no conectarse aborta la app y muestra un mensaje ****************************************************************************************** */ private static function conectar(){ $opc = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); $dsn = "mysql:host=localhost;dbname=manuel_dwes"; $usuario = 'manuel_manuel'; $contrasena = 'xv2e6w'; try{ $conexion= new PDO($dsn, $usuario, $contrasena, $opc); $conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch (PDOException $e) { die ('Abortamos la aplicación por fallo conectando con la BD' . $e->getMessage()); } self::$conexion = $conexion; } /*======================ejecutaConsulta ($sql,$valores)====================================== Accion: Ejecuta una consulta preparada con los valores de los parámetros de la consulta preparada Parámetros: $sql es la consulta preparada y parametrizada $valores es un array asociativo con los valores de los distintos parámetros de la consulta anterior Retorna =La consulta despues de ejecutarla, o null si no la ha podido ejecutaqr en caso de no ejecutarla da un mensaje * ***********************************************************************************************/ protected static function ejecutaConsulta($sql,$valores) { if (self::$conexion == null) self::conectar(); $conexion = self::$conexion; try{ $consulta = $conexion->prepare($sql); $consulta->execute($valores); }catch (PDOException $e) { echo 'No se ha podido ejecutar la consulta' . $e->getMessage(); return null; } return $consulta; } /*======================verificaCliente ($nombre,$pass)====================================== Accion: verifica si un nombre y pass son contenidos en la base de datos Parámetros: $nombre es el nombre de usuario $pass es la password para ese nombre Retorna true o false según se haya podido o no validar * Recordar que la pass está cifrada con md5 en la base de datos * ***********************************************************************************************/ public static function verificaCliente($nombre, $pass) { $valores = array('usuario'=>$nombre, 'password' =>$pass); $sql = <<<FIN SELECT usuario FROM usuarios WHERE usuario=:usuario AND contrasena=md5(:password) FIN; $resultado = self::ejecutaConsulta ($sql,$valores); $verificado = false; if ($resultado->fetch()) $verificado=true; return $verificado; } }//End de la clase DB.php ?>
- login.php
- login.tpl
- productos.php