Diferencia entre revisiones de «Usuario:ManuelRomero/php/smarty/login»

De WikiEducator
Saltar a: navegación, buscar
(Desarrollando el código)
 
(18 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
{{:Usuario:ManuelRomero/php/smarty/tienda/nav}}
 
{{:Usuario:ManuelRomero/php/smarty/tienda/nav}}
 
__NOTOC__
 
__NOTOC__
 +
<div class="parrafo">
 +
===Probando el ejemplo===
 +
*Puedes ver esta parte del ejercicio ejecutándose en la web:
 +
http://manuel.infenlaces.com/dwes/practicas/tienda/1.-%20TiendaLogin/login.php
 +
{{Tip| usuario '''''dwes''''' y pass '''''abc123.'''''}}
 +
 
===La lógica===
 
===La lógica===
 
*Generaremos el fichero '''''login.php'''''
 
*Generaremos el fichero '''''login.php'''''
Línea 7: Línea 13:
 
*La siguiente imagen muestra un caso de uso de este escenario
 
*La siguiente imagen muestra un caso de uso de este escenario
 
[[Archivo:tiendaLogin.png]]
 
[[Archivo:tiendaLogin.png]]
;Descripcion de la imagen
+
;Descripción de la imagen
 
#Login pedirá un usuario y contraseña para validar
 
#Login pedirá un usuario y contraseña para validar
 
#Al darle a validar, se validará el usuario contra la base de datos.
 
#Al darle a validar, se validará el usuario contra la base de datos.
Línea 37: Línea 43:
 
*Seguramente otros métodos tengan que hacer estas acciones (conectar, ejecutar consultas, …), por lo que estas acciones será métodos privados de la clase.  
 
*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'''''
 
*Para poder pasar parámetros a la hora de ejecutar la consutla usaremos '''''PDO''''' en lugar de '''''mysqli'''''
[[Archivo:BD.png]]
+
[[Archivo:DB.png]]
*El código de esta clase
+
</div>
<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
+

Última revisión de 20:38 4 feb 2020



Probando el ejemplo

  • Puedes ver esta parte del ejercicio ejecutándose en la web:
http://manuel.infenlaces.com/dwes/practicas/tienda/1.-%20TiendaLogin/login.php
Icon present.gif
Tip: usuario dwes y pass abc123.


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

TiendaLogin.png

Descripción de la imagen
  1. Login pedirá un usuario y contraseña para validar
  2. Al darle a validar, se validará el usuario contra la base de datos.
  3. 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

TiendaLogin2.png

Descripción de la imagen
  1. El cliente invoca al fichero login.php
  2. Este método solicitará usuario y contraseña visualizando la plantilla login.tpl
  3. Cuando presionemos enviar validará contra la base de datos
  4. Si todo ok, mostrará la plantilla productos.tpl;
  5. 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
  1. DB.php (clase)
  2. login.php (lógica)
  3. productos.php (lógica sin contenido)
  4. 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:
  1. conectar a la base de datos,
  2. realizar una consulta,
  3. 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

DB.png