Login en PHP con mysql MVC no funciona

publicado por: Anonymous

Estoy desarrollando mi web, a partir de un miniframework, que obtuve en un ejemplo de Victor Robles:

Ejemplo PHP POO MVC

Estoy implementando mi plantilla poco a poco, y por ahora no tengo mas que la vista principal, ( home ), y un enlace a otra vista.

Antes de continuar me gustaria implementar un login, y registro para mis usuarios, pero no logro hacer que funcione, aqui pongo mi codigo:

Estructura de carpetas:

introducir la descripción de la imagen aquí

LoginController.php

<?php
//defined('BASEPATH') or exit('No se permite acceso directo');

require_once "../model/LoginModel.php";
require_once "../core/Session.php";

/**
* Login controller
*/
class LoginController extends Controller
{
  private $model;
  private $session;

  public function __construct()
  {
    $this->model = new LoginModel();
    $this->session = new Session();
  }

  public function exec()
  {
    $this->render(__CLASS__);
  }

  public function signin($request_params)
  {
    if($this->verify($request_params))
      return $this->renderErrorMessage('El email y password son obligatorios');

    $result = $this->model->signIn($request_params['email']);

    if(!$result->num_rows)
      return $this->renderErrorMessage("El email {$request_params['email']} no fue encontrado");

    $result = $result->fetch_object();

    if(!password_verify($request_params['password'], $result->password))
      return $this->renderErrorMessage('La contraseña es incorrecta');

    $this->session->init();
    $this->session->add('email', $result->email);
    header('location: /php-mvc/main');
  }

  private function verify($request_params)
  {
    return empty($request_params['email']) OR empty($request_params['password']);
  }

  private function renderErrorMessage($message)
  {
    $params = array('error_message' => $message);
    $this->render(__CLASS__, $params);
  }

}

LoginModel.php:

<?php 

class LoginModel extends ModeloBase
{

  public function __construct()
  {
    parent::__construct();
  }

  public function signIn($email)
  {
    $email = $this->db->real_escape_string($email);
    $sql = "SELECT email, password FROM usuarios WHERE email = '{$email}'";
    return $this->db->query($sql);
  }
}

En la carpeta core, he creado Session.php:

<?php
/**
 * Clase básica para administrar sesiones
 */
class Session
{
  /**
   * Inicializa la sesión
   */
  public function init()
  {
    session_start();
  }

  /**
   * Agrega un elemento a la sesión
   * @param string $key la llave del array de sesión
   * @param string $value el valor para el elemento de la sesión
   */
  public function add($key, $value)
  {
    $_SESSION[$key] = $value;
  }

  /**
   * Retorna un elemento a la sesión
   * @param string $key la llave del array de sesión
   * @return string el valor del array de sesión si tiene valor
   */
  public function get($key)
  {
    return !empty($_SESSION[$key]) ? $_SESSION[$key] : null;
  }

  /**
   * Retorna todos los valores del array de sesión
   * @return el array de sesión completo
   */
  public function getAll()
  {
    return $_SESSION;
  }

  /**
   * Remueve un elemento de la sesión
   * @param string $key la llave del array de sesión
   */
  public function remove($key)
  {
    if(!empty($_SESSION[$key]))
      unset($_SESSION[$key]);
  }

  /**
   * Cierra la sesión eliminando los valores
   */
  public function close()
  {
    session_unset();
    session_destroy();
  }

  /**
   * Retorna el estatus de la sesión
   * @return string el estatus de la sesión
   */
  public function getStatus()
  {
    return session_status();
  }

}

y la vista del login.html:

<form class="form-signin" method="POST" action="../../controller/LoginController.php" enctype="application/x-www-form-urlencoded">
    <fieldset class="form-group position-relative has-icon-left mb-0 ">
        <input type="email" name="email" id="inputEmail" class="form-control form-control-lg input-lg" placeholder="Introduce tu e-mail" value="" required>

     </fieldset>
     <fieldset class="form-group position-relative has-icon-left">
       <input type="password" name="password" id="inputPassword" class="form-control form-control-lg input-lg" placeholder="Introduce tu contraseña" required>
     </fieldset>
     <fieldset class="form-group row">
        <div class="col-md-10 col-xs-12 text-xs-center text-md-left">
       <fieldset>
          <input type="checkbox" id="remember-me" class="chk-remember">
            <label for="remember-me">No cerrar sesión</label>
        </fieldset>
       </div>
      </fieldset>

Login

Al tratar de iniciar sesión me devuelve un HTTP ERROR 500.

Podrían aclararme un poco que es lo que hago mal? o que necesito para realizar esto, hasta ahora había trabajado con frameworks que esto me lo hacia automaticamente y a pesar de ver bastantes tutoriales pero no son exactamente lo que yo busco hacer.

A mi lo que me gustaria hacer seria un login, aparte de la web, que puedes iniciar sesion o no para andar por la pagina, pero para algunas secciones necesites estar registrado.

Muchas gracias por su atención anticipado.

Edito: php_error.log de mamp:

PHP Fatal error:  Class 'ModeloBase' not found in /Applications/MAMP/htdocs/mvc/model/LoginModel.php on line 5

Por lo que entiendo, al llamar al login.html, no esta haciendo la llamada al controlador correctamente.

Saludos.

solución

Gracias a la ayuda de Oscar Garcia, he conseguido aclarar los fallos de uso o programación que tenia en mi código, aunque no es muy practico, y aparte de las recomendaciones todo ha sido por un fallo de autocarga de ficheros, utilizando require_once en los ficheros que tiraba el error gracias al log de php he podido localizar el error.

Muchas gracias.

Saludos.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *