|
|
Línea 44: |
Línea 44: |
| *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:DB.png]] | | [[Archivo:DB.png]] |
− | *El código de esta clase
| |
− | {{Plegable|hide|Clase DB.php|
| |
− | <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 = 'root';
| |
− | $pass = 'root';
| |
− | try{
| |
− | $conexion= new PDO($dsn, $usuario, $pass, $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)======================================
| |
− | Acción: 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 después de ejecutarla, o null si no la ha podido ejecutar
| |
− | 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
| |
− | *Este fichero implementa las acciones especificadas anteriormente
| |
− | *Cargamos la librería de '''''smarty'''''
| |
− | *Realizamos la lógica
| |
− | *Exportamos la variable '''''$error''''' para la plantilla
| |
− | *Visualizamos la plantilla
| |
− | *El código se exporta a continuación
| |
− | {{Plegable|hide|login.php|
| |
− | <source lang=php>
| |
− | <?php
| |
− | require_once('./../include/DB.php');
| |
− |
| |
− | // Cargamos la librería de Smarty
| |
− | require_once('Smarty.class.php');
| |
− | $smarty = new Smarty;
| |
− | $smarty->template_dir = '/web/smarty/tiendaSmarty/templates/';
| |
− | $smarty->compile_dir = '/web/smarty/tiendaSmarty/templates_c/';
| |
− | $smarty->config_dir = '/web/smarty/tiendaSmarty/configs/';
| |
− | $smarty->cache_dir = '/web/smarty/tiendaSmarty/cache/';
| |
− | // Verificaamos si queremos validar los datos
| |
− | //del formulario o solo visualizar el formulario (login.tpl)
| |
− | if (isset($_POST['enviar'])) {
| |
− | $usuario = $_POST['usuario'];
| |
− | $pass = $_POST['password'];
| |
− | if ((empty($usuario)) || (empty($pass)))
| |
− | $smarty->assign('error','Debes introducir un nombre de usuario y una contraseña');
| |
− | else {
| |
− | // Comprobamos las credenciales con la base de datos
| |
− | if (DB::verificaCliente($usuario, $pass)) {
| |
− | session_start();
| |
− | $_SESSION['usuario']=$usuario;
| |
− | header("Location: producto.php");
| |
− | }
| |
− | else {
| |
− | // Si las credenciales no son válidas, se vuelven a pedir
| |
− | $smarty->assign('error','Usuario o contraseña no válidos!');
| |
− | }
| |
− | }
| |
− | }
| |
− | // Mostramos la plantilla
| |
− | $smarty->display('login.tpl');
| |
− | ?>
| |
− | </source>
| |
− | }}
| |
− | ;login.tpl
| |
− | *La plantilla tiene la parte de html
| |
− | *Lo único que visualiza es el código de error en caso de que lo hubiera
| |
− | {{Plegable|hide|login.tpl|
| |
− | <source lang=html5>
| |
− | <!DOCTYPE html>
| |
− | {*Plantilla para login. Es invocada desde login.php. solo visualiza el $error del php*}
| |
− | <html>
| |
− | <head>
| |
− | <meta http-equiv="content-type" content="text/html; charset=UTF-8">
| |
− | <title>Login Tienda Web con Plantillas</title>
| |
− | <link href="tienda.css" rel="stylesheet" type="text/css">
| |
− | </head>
| |
− | <body>
| |
− | <div id='login'>
| |
− | <form action='login.php' method='post'>
| |
− | <fieldset >
| |
− | <legend>Login</legend>
| |
− | {*si la variable error tiene algún valor se visualiza*}
| |
− | <div><span class='error'>{$error}</span></div>
| |
− | <div class='campo'>
| |
− | <label for='usuario' >Usuario:</label><br/>
| |
− | <input type='text' name='usuario' id='usuario' maxlength="50" /><br/>
| |
− | </div>
| |
− | <div class='campo'>
| |
− | <label for='password' >Contraseña:</label><br/>
| |
− | <input type='password' name='password' id='password' maxlength="50" /><br/>
| |
− | </div>
| |
− |
| |
− | <div class='campo'>
| |
− | <input type='submit' name='enviar' value='Enviar' />
| |
− | </div>
| |
− | </fieldset>
| |
− | </form>
| |
− | </div>
| |
− | </body>
| |
− | </html>
| |
− |
| |
− | </source>
| |
− | }}
| |
− | ;productos.php
| |
− | *En esta primera parte del proyecto estos ficheros solo contienen información básica,
| |
− | *Se implementará en la segunda parte del desarrollo
| |
− | {{Plegable|hide|productos.php|
| |
− | <source lang=php>
| |
− | <?php
| |
− | require_once('Smarty.class.php');
| |
− | // Recuperamos la información de la sesión
| |
− | session_start();
| |
− | // Y comprobamos que el usuario se haya autentificado,
| |
− | // para evitar que puedan acceder directamente
| |
− | //a esta pagina sin pasar por el login
| |
− | if (!isset($_SESSION['usuario']))
| |
− | die("Error - debe <a href='login.php'>identificarse</a>.<br />");
| |
− | // Cargamos la librería de Smarty
| |
− | $smarty = new Smarty;
| |
− |
| |
− | $smarty->template_dir = '/web/smarty/tiendaSmarty/templates/';
| |
− | $smarty->compile_dir = '/web/smarty/tiendaSmarty/templates_c/';
| |
− | $smarty->config_dir = '/web/smarty/tiendaSmarty/configs/';
| |
− | $smarty->cache_dir = '/web/smarty/tiendaSmarty/cache/';
| |
− | //De momento solo visualizamos que el usuario
| |
− | $smarty->assign("usuario",$_SESSION['usuario']);
| |
− | //Ahora mostramos la plantilla
| |
− | $smarty->display("producto.tpl");
| |
− | ?>
| |
− | </source>
| |
− | }}
| |
− | ;producto.tpl
| |
− | *La plantilla del producto
| |
− | *Simplemente una página de información de lo que hará
| |
− | {{Plegable|hide|producto.tpl|
| |
− | <source lang = php>
| |
− | <!DOCTYPE html>
| |
− | {*Platilla para visualizar los productos, se invoca desde productos.php*}
| |
− | <html>
| |
− | <head>
| |
− | <title>práctica de tienda página de productos </title>
| |
− | <meta charset="UTF-8">
| |
− | </head>
| |
− | <body>
| |
− | {*primero solo visualizaremos que el usuario está conectado*}
| |
− | <h1>Bienvenido a esta página {$usuario}</h1>
| |
− | <hr/>
| |
− | <h3>En breve visualizará una lista de productos para hacer su compra</h3>
| |
− |
| |
− | </body>
| |
− | </html>
| |
− | </source>
| |
− | }}
| |
Para este escenario necesitaremos los siguientes ficheros según vemos en la imagen