Codeigniter, parte 9: Librería Session

Otra de las ventajas que nos provee Codeigniter es una librería llamada Session, la cual nos permitirá guardar información entre página y página como lo hace cualquier sesión o cookie. Ésta es muy fácil de utilizar, y tiene ciertas ventajas.

Antes de continuar vamos a aclarar un punto importante, y es que como se menciona en la documentación de Codeigniter, estás sesiones no son más que cookies encriptadas, y al igual que cualquier cookie, éstas no deben sobrepasar los 4KB de almacenamiento. Así que a tener cuidado con esto.

Bueno, primero que nada, la librería Session, nos permitirá trabajar con dos tipos de datos, permanentes y temporales. Los primeros son simplemente datos como los que se acostumbran a utilizar por ejemplo, cuando un usuario inicia sesión en un sitio, y luego navega por el resto de la página, accediendo a contenido, que sólo se le está permitido a un usuario registrado, y eso se debe a que estos son guardados y mantenidos, hasta que el usuario desea cerrar la sesión o la misma expira.

Los datos temporales en cambio, son aquellos que sirven para guardar un contenido que sólo es importante de una página a otra, pero luego deben ser removidos. Por ejemplo, al redireccionar de una página a otra, queremos guardar un mensaje en la primera, para que pueda ser accedido desde la segunda.

 

Configurando la sesión

En primer lugar debemos cargar la librería con el nombre session, si ya seguiste las publicaciones pasadas, debería ya saber cómo hacerlo. Buscamos dentro de application -> config -> autoload.php, la línea:

$autoload['libraries']

Y agregamos dos librerías, la de database, que venimos usando hasta ahora, y la de session:

$autoload['libraries'] = array('database', 'session');

También tendremos que ir a application -> config -> config.php, y buscar la línea:

$config['encryption_key'] = '';

Tendremos que poner una clave para nuestra sesión, por ejemplo:

$config['encryption_key'] = 'b4rn3y';

Bien, vamos a hacer un ejemplo simple, vamos a tener que iniciar sesión con un usuario, si se ingresa correctamente el nombre y su contraseña, el usuario va a acceder a su cuenta, de lo contrario va a ser redireccionado al formulario de inicio de sesión nuevamente.

Para ello vamos a crear una tabla en nuestra base de datos, con un aspecto como éste:

CREATE TABLE usuarios (
   id tinyint(3) unsigned not null auto_increment primary key,
   nombre varchar(50) not null,
   contrasena varchar(50) not null
)ENGINE=innoDB;

Y vamos a insertar un usuario manualmente:

INSERT INTO usuarios(nombre, contrasena)
VALUES('tito', '1234');

(Nota, la contraseña no está encriptada, aunque esto es un simple ejemplo, en la vida real, la misma debería ser encriptada, por ejemplo por md5())

 

Iniciar sesión

Ok, ahora vamos a crear nuestro modelo usuario, así que vamos a application -> models y creamos un archivo llamado usuario_model.php:

<?php
class Usuario_model extends CI_Model { 
   public function __construct() {
      parent::__construct();
   }
   public function usuario_por_nombre_contrasena($nombre, $contrasena){
      $this->db->select('id, nombre');
      $this->db->from('usuarios');
      $this->db->where('nombre', $nombre);
      $this->db->where('contrasena', $contrasena);
      $consulta = $this->db->get();
      $resultado = $consulta->row();
      return $resultado;
   }
}

Como se ve este modelo, contará con un método llamado usuario_por_nombre_contrasena() el cual nos devolverá un objeto usuario, dependiendo de si el nombre y la contraseña le pertenecen a algún registro.

Ahora vamos a crear nuestro controlador yendo a a application -> controllers y creamos un archivo llamado usuarios.php:

<?php
if (!defined('BASEPATH'))
   exit('No direct script access allowed');
class Usuarios extends CI_Controller {
   public function __construct() {
      parent::__construct();
   }
   public function iniciar_sesion() {
      $data = array();
      $this->load->view('usuarios/iniciar_sesion', $data);
   }
   public function iniciar_sesion_post() {
      if ($this->input->post()) {
         $nombre = $this->input->post('nombre');
         $contrasena = $this->input->post('contrasena');
         $this->load->model('usuario_model');
         $usuario = $this->usuario_model->usuario_por_nombre_contrasena($nombre, $contrasena);
         if ($usuario) {
            $usuario_data = array(
               'id' => $usuario->id,
               'nombre' => $usuario->nombre,
               'logueado' => TRUE
            );
            $this->session->set_userdata($usuario_data);
            redirect('usuarios/logueado');
         } else {
            redirect('usuarios/iniciar_sesion');
         }
      } else {
         $this->iniciar_sesion();
      }
   }
   public function logueado() {
      if($this->session->userdata('logueado')){
         $data = array();
         $data['nombre'] = $this->session->userdata('nombre');
         $this->load->view('usuarios/logueado', $data);
      }else{
         redirect('usuarios/iniciar_sesion');
      }
   }
   public function cerrar_sesion() {
      $usuario_data = array(
         'logueado' => FALSE
      );
      $this->session->set_userdata($usuario_data);
      redirect('usuarios/iniciar_sesion');
   }
}

Y vamos a crear las vistas, que serán dos, una para el formulario de inicio de sesión, y otro para saludar al usuario que acaba de iniciar sesión. Dentro a application -> views creamos la carpeta usuarios. Y dentro las dos vistas:

iniciar_sesion.php:

<!DOCTYPE html>
<html lang="en">
 <head>
    <meta charset="utf-8" />
    <title> Usuarios </title>
 </head>
 <body>
    <h1> Iniciar sesión </h1>
    <form method="post" action="<?php echo base_url() ?>usuarios/iniciar_sesion_post">
       <label> Nombre </label>
       <br />
       <input type="text" name="nombre" />
       <br />
       <label> Contraseña </label>
       <br />
       <input type="password" name="contrasena" />
       <br />
       <input type="submit" value="Iniciar sesión" />
    </form>
 </body>
</html>

logueado.php:

<!DOCTYPE html>
<html lang="en">
 <head>
    <meta charset="utf-8" />
    <title> Usuarios </title>
 </head>
 <body>
    <h1> Bienvenido/a <?php echo $nombre ?> </h1>
    <p>
       <a href="<?php echo base_url() ?>usuarios/cerrar_sesion"> Cerrar sesión </a>
    </p>
 </body>
</html>

Vamos a analizar las acciones del controlador.

En primer lugar  tenemos el método iniciar_sesion(), el cual simplemente cargará una vista con un formulario para iniciar sesión.

Luego tenemos iniciar_sesion_post(), que recibirá los datos que se enviaron en el formulario, el nombre de usuario y la contraseña:

$nombre = $this->input->post('nombre');
$contrasena = $this->input->post('contrasena');

Luego va a verificar con el método usuario_por_nombre_contrasena(), si los datos son correctos:

$usuario = $this->usuario_model->usuario_por_nombre_contrasena($nombre, $contrasena);

Si el usuario es correcto crea la sesión con el id, nombre y un tercer valor, indicando que el usuario inició sesión correctamente, con el método set_userdata(), de la librería session.

$usuario_data = array(
   'id' => $usuario->id,
   'nombre' => $usuario->nombre,
   'logueado' => TRUE
);
$this->session->set_userdata($usuario_data);

Finalmente redirecciona a la acción logueado(), donde el usuario podrá acceder siempre y cuando haya iniciado sesión correctamente:

redirect('usuarios/logueado');

Pero si el usuario ingresó sus datos de manera incorrecta, será redireccionado nuevamente al inicio de sesión:

redirect('usuarios/iniciar_sesion');

La acción logueado(), primero va a verificar que el usuario haya iniciado sesión:

if($this->session->userdata('logueado'))

Notar que el método userdata(), es el que nos permite acceder a un valor guardado en la sesión, en este caso, sólo podrá ingresar si ese valor es TRUE. De lo contrario el usuario volverá al inicio de sesión.

La acción cerrar_sesion(), simplemente va a modificar ese valor ‘logueado’ a FALSE:

$usuario_data = array(
   'logueado' => FALSE
);
$this->session->set_userdata($usuario_data);

Otra posibilidad para cerrar la sesión sería mediante el método sess_destroy():

$this->session->sess_destroy();

El problema es que éste va a limpiar todos los datos, y tal vez algunos de estos no queramos que sean removidos.

 

Datos temporales

Bien, si pudiste probar el ejemplo, habrás notado una cosa, y es que cuando el usuario ingresa de forma incorrecta sus datos, se lo envía nuevamente al formulario de inicio de sesión, pero no se muestra ningún error por pantalla. Esto se debe a que tanto la acción iniciar_sesion() como iniciar_sesion_post(),son páginas diferentes. Para pasar un dato de una página a otra debemos usar el método set_flashdata(), para setear valores, y flashdata(), para recuperar ese valor temporal:

Por tanto vamos a la acción iniciar_sesion_post(), y antes de redireccionar a la página de inicio de sesión:

redirect('usuarios/iniciar_sesion');

Vamos a crear ese valor temporal:

$this->session->set_flashdata('error', 'El usuario o la contraseña son incorrectos.');
redirect('usuarios/iniciar_sesion');

Como se ve en el ejemplo el método set_flashdata() tiene dos parámetros, el nombre y el valor del dato.

Luego deberíamos modificar la acción iniciar_sesion() y vamos a recuperar ese valor temporal y se lo vamos a pasar a la vista:

public function iniciar_sesion() {
   $data = array();
   $data['error'] = $this->session->flashdata('error');
   $this->load->view('usuarios/iniciar_sesion', $data);
}

En este caso, el método flashdata() recibe como parámetro el nombre del valor temporal que queremos recuperar.

Sólo deberíamos volver a editar la vista donde mostramos el formulario en application -> views -> iniciar_sesion.php y agregar en alguna parte del código html donde queremos mostrar el error:

<?php if ($error): ?>
   <p> <?php echo $error ?> </p>
<?php endif; ?>

 

Anterior: Codeigniter, parte 8: Validaciones

 


68 Respuestas a “Codeigniter, parte 9: Librería Session”

  1. Que sucede si hago con el boton atras del navegador cuando ya he destruido la sesion? actualmente es un problema que tengo y es por ello que no utilizo aun codeigniter en proyectos grandes

    1. Entiendo lo que me decís, eso es porque queda guardado en memoria el historial con el código html. Sin embargo si todas las páginas que requieren estar logueado, tienen la verificación, el usuario no va a poder hacer nada. Si querés podés probarlo, cerrá sesión, volvé atrás, e intenta seguir navegando el sitio, por las páginas que requieren autentificación.

      Eso es lo mismo que si un usuario inicia sesión en una página, abre otra solapa, con la sesión iniciada la cierre, e intenta hacer algo en la primera, no va a poder, porque ya perdió la sesión.

  2. Hola, muy buenos tus tutoriales. Me han ayudado mucho a entender mas acerca de Code Igniter.
    Tienes planeado seguir ampliando este tutorial?

    1. De momento no, pero bueno, supongo que si encuentro algo que valga la pena subirlo, lo haré.

      Saludos!

  3. Hola tengo un login funcionando bien pero como hago para que los otros controladores se ejecuten si y solo si se han logueado y no puedan ser accesibles por URL

    Gracias y felicitaciones por la guia

    1. Ok, ahí tenés dos opciones.

      Suponete que tenés una acción a la cual el usuario no puede acceder en caso de no estar logueado:

      public function logueado() {
      if($this->session->userdata(‘logueado’)){
      //Entra
      }else{
      //No está logueado así que lo devuelve al login.
      redirect(‘login’);
      }
      }

      Ahora bien, en caso de que en TODO el controlador debe estar logueado para entrar la verificación deberías hacerla en el constructor, tipo algo así.

      class Usuarios extends CI_Controller {

      public function __construct() {
      parent::__construct();
      //Si entra acá es porque no está logueado, así que no puede entrar a ninguna acción de este controlador.
      if(!$this->session->userdata(‘logueado’)){
      redirect(‘login’);
      }
      }

      }

      Saludos!

      1. eso iria en todos los constructores o solo en el principal? es decir, si se entra con una ruta ya vista, local/usuario/nuevo, el controlador usuario debe tener esa validacion? pregunto, me suena a que si pero pues no se jeje, gracias. excelente tutorial. gracias.

        1. Deberías preguntar en aquellos controladores que requieran estar logueado para acceder.

          Saludos!

  4. Amigo que buen post Felicidades, pero tengo una duda como hago si el usuario no cierra session y directamente cierra el navegador y la siguiente vez que inicie el navegador la session no se mantenga (se destruya la session) y redireccine a la pagina de login…. de antemano gracias por la ayuda 😉

    1. Podés poner que la sesión expire después de una cantidad de tiempo de inactividad. Pero lo de cerrar el navegador y que se cierre la sesión no se puede.

      Si bien hay técnicas para realizar eso, la mayoría tienen cierto grado de ineficiencia. Por ejemplo, si el usuario cierra el navegador y lo abre al instante, la sesión tampoco se cierra.

      Saludos!

      1. Muy practico el tutorial. Elmer proba con la variable de sesion $config[‘sess_expire_on_close’] = TRUE; que esta en config.php, esta hace que la sesion expire al cerrar el navegador.
        Saludos!

  5. Hola, disculpa si me puedes ayudar lo que pasa es q me perdi al momento de crear la var set_flashdata, disculpa y desde ya gracias.

    1. Una vez que lo guardás en sesión va a estar disponible en cualquier acción, hasta que la misma caduque o bien se borra ese valor.

      Saludos!

  6. Estimado

    te hago una consulta, realizo los pasos del tutorial, pero tengo unos problemas.. lo que pasa es que desde mi vista login llamo a la funcion iniciar_sesion. ( pero eso no valida al usuario, no reconoce nada ).

    pero si desde mi vista llamo a la funcion iniciar_sesion_post, este si logra validar al usuario y logro ingresar al sistema. y es aqui donde viene mi otro problema porque no toma en cuenta la funcion logueado, entonces esta puede estar o no estar, pero ingresare al sistema igualmente.

    ahora por ultimo, lo otro que me complica es que desde la url puedo acceder a cualquier pagina, hago lo que explicas en unos post mas arriba, pero como la funcion logueado no me la toma el proyecto, ahora no puedo ingresar ni por url ni por login, no se donde estara el problema.

  7. Estimado te hago la siguiente consulta, yo inicio sesion con dos usuarios diferentes en dos navegadores diferentes, cuando estoy navegando con uno de los usuarios me toma el que esta logueado en el otro navegador, que es lo que puede ser que este pasando

    1. Realmente esto nunca lo probé, pero lo más probable es que el login lo realice por IP. Osea que por más que estés en dos navegadores distintos, tienen la misma IP.

      Saludos!

  8. Gracias me has ayudado bastante con un proyecto que estoy empezando para la universidad.

    Una pregunta ¿no hay una funcion propia de codeigniter para verificar si esta logueado? digo que si hay una alternativa al «$this->session->logueado», asi como para cerrar la sesion $this->session->sess_destroy(); el problema de este ultimo es que tambien borra los flash. y ¿que sucede si expira con el tiempo? ¿automaticamente cierra la sesion?

  9. Saludos , una consulta soy nuevo en codeigniter y en mi controlador necesito traerme el usuario de la sesion que esta abierta para luego usar ese id en un query para un reporte en pdf personalizado , deberia usar:
    cargar mi modelo donde estan mis usuarios
    $this->load->model(‘user’);

    y lo obtengo con esto asi o como debo hacer

    $this->user->get_user_id($id)

    1. Yo en la sesión guardaría sólo el ID del usuario, y luego ese ID me serviría para el resto de las consultas.

      Saludos!

  10. Buen Dia
    Gracias… llegue a desarrollar los ejemplos del 1 al 8
    pero tengo un error

    A PHP Error was encountered

    Severity: Warning

    Message: mkdir(): Invalid path

    Filename: drivers/Session_files_driver.php

    Line Number: 117

    Backtrace:

    File: C:\ServidorWeb\apache\htdocs\fw\Proy02\application\controllers\usuarios.php
    Line: 6
    Function: __construct

    File: C:\ServidorWeb\apache\htdocs\fw\Proy02\index.php
    Line: 292
    Function: require_once

    mas abajo sale otro error

    An uncaught Exception was encountered

    Type: Exception

    Message: Session: Configured save path » is not a directory, doesn’t exist or cannot be created.

    Filename: C:\ServidorWeb\apache\htdocs\fw\Proy02\system\libraries\Session\drivers\Session_files_driver.php

    Line Number: 119

    Backtrace:

    File: C:\ServidorWeb\apache\htdocs\fw\Proy02\application\controllers\usuarios.php
    Line: 6
    Function: __construct

    File: C:\ServidorWeb\apache\htdocs\fw\Proy02\index.php
    Line: 292
    Function: require_once

    POR FAVOR DIME COMO LO SOLUCIONO?

    1. Ahí te lo dice: «mkdir(): Invalid path», significa que estás intentando crear una carpeta en una ubicación errónea. Revisá eso por favor.

      Saludos!

      1. Buen Día
        Gracias por tu respuesta..
        Me parece que el error es por permisos algo asi… vengo utilizando apache en windows 8.1
        Lo que hice fue solo cargar en autoload.php la libreria session
        $autoload[‘libraries’] = array(‘database’, ‘session’);
        que me parece ejecuta parte del codigo de system->Session_files_driver.php es ahi donde sale el error.

      2. Despues de buscar varias respuestas encontre una configuracion adicional en application->config.php, le agregue ci_sessions. quedando asi
        $config[‘sess_save_path’] = ‘ci_sessions’;

        Y ahora me sale este nuevo error

        A PHP Error was encountered

        Severity: Warning

        Message: touch(): Unable to create file ci_sessions\ci_sessionbbb2c4dbf1bb3592256dbc8726cd1701ee40e153 because No such file or directory

        Filename: drivers/Session_files_driver.php

        Line Number: 238

        Backtrace:

        DEBAJO OTRO ERROR

        A PHP Error was encountered

        Severity: Warning

        Message: Unknown: Failed to write session data (user). Please verify that the current setting of session.save_path is correct (ci_sessions)

        Filename: Unknown

        Line Number: 0

        Backtrace:

        Por favor necesito tu ayuda!!!

      3. Un proyecto nuevo en blanco con codeigniter 3.0.4
        solamente agregando este en autoload.php

        $autoload[‘libraries’] = array(‘database’, ‘session’, ‘form_validation’);

        arroja el mismo error…

  11. GRACIAS POR TODO
    SOLUCIONADO…..
    ademas modificar asi el config.php
    $ config [ ‘sess_driver’ ] = ‘database’ ; // cambiado desde el archivo
    $ config [ ‘sess_save_path’ ] = ‘ci_sessions’ ; // nombre de la tabla

    Y EN TU BD
    agregar la siguiente tabla
    //Esta codigo crea una tabla para gestionar sessiones en codeigniter 3.0.4
    CREATE TABLE IF NOT EXISTS `ci_sessions` (

    `id` varchar ( 40 ) NOT NULL ,
    ` ip_address` varchar ( 45 ) NOT NULL ,
    `timestamp` int ( 10 ) sin signo DEFAULT 0 NOT NULL ,
    ` data` blob NOT NULL ,
    PRIMARY KEY ( ID ),
    KEY `ci_sessions_timestamp` ( `timestamp` )
    );

    1. Todo esta bien del login solo necesita algunas configuraciones adicionales (ver arriba) en config.php y crear la tabal en tu BD de Mysql

  12. Hola yo estoy atorado en un logueo el cual no pasa por.una base de datos local más bien usa un método post que valida las credenciales desde mi sitio y obtiene una respuesta con las variables en un javascrip mi duda es como recuperar esas variables para iniciar la sesión en mi portal con esos datos

    Gracias me tus conocimientos me han ayudado mucho

  13. Hola tengo una duda como puedo mantener la sesión es decir, si ya me logueo, y entro a mi pagina principal y si me regreso me vuelve a mandar al login como puede hacer para que me valide que si ya estoy logueado no me permita regresar al login

    1. En el controlador donde está tu login, deberías tener algún if que verifique si el usuario ya se logueó, y podés redireccionarlo a otra pantalla:

      if($this->session->userdata(‘logueado’)){
      redirect(‘otro_controlador’);
      }

      Saludos!

  14. Buen dia a todos, antes que nada es un excelente articulo muy completo y bien explicado. Tengo una consulta: estoy desarrollando un logeo ya he configurado algunos elementos me he quedado hasta la parte de insertar los datos de session en la base de datos especificamente en la tabla de configuracion ‘ci_sessions’, ahora que tengo esos datos ¿para mayor seguridad se supone que se valide el session_id que se encuentra en el cliente con el que se encuentra en la base de datos? ¿esto se haria cada que el usuario accede a un nuevo controlador? ¿cuando sale del sitio se debe borrar los registros de la bd ‘ci_sessions’ correspondientes al usuario? o como seria la logica en general….

    Sin mas por el momento espero una pronta respuesta. saludos a todos excelente dia.

  15. Hola, tengo un problemilla y es que quiero hacer un formulario donde el usuario tiene que responder a una simple pregunta, este formulario registra en un BD la respuesta. Soy capaz de que se registre todo en la BD preguntando al usuario su nick para poder identificarlo. Lo que quiero hacer es que en el formulario este solo la pregunta y que sin preguntarle el nick al usuario este formulario coja el nick de la session y lo inserte con la respuesta en la BD. A ver si puedes echarme una mano, porque no soy capaz de hacer esto.
    Un saludo y gracias de antemano.

  16. hola muchisimas gracias por el aporte.
    Tengo una duda queria poner un letrero de bienvenido y el nombre en la barra de menu, pero al parecer los datos de la sesion no son persistentes en diferentes paginas ¿Como podria hacer que estos se mantengan para todos los datos

    1. Los datos de sesión sí son persistentes. Fijate de haber cargado la librería en todas las páginas que lo requieran.

      Saludos!

      1. te refieres a que debo poner $this->load->library(array(‘session’,’form_validation’)); esta linea en cada uno de los controladores de mi aplicacion es decir digamos si mi aplicacion es de un hospital debo poner esa linea en el controlador Doctor, paciente, consultas, etec.??
        Gracias por tu respuesta 🙂

        1. Sí, y no. En realidad si vos vas a a application -> config -> autoload.php, hay una línea que es un array

          $autoload[‘libraries’] = array();

          Ahí podés agregar las librerías que se carguen en todo tu proyecto. Por ejemplo:

          $autoload[‘libraries’] = array(‘database’, ‘session’);

          Saludos!

  17. amigo muy buena la explicacion entendi porfin 😛 lo que no entendi bien es que no se como hacer que salga el nombre del usuario en la pagina de logueado.

  18. Todo muy bien explicado, ese mismo se podria aplicar para una seccion donde utilizo como una plantilla global el header y el footer
    $data[‘titulo’] = ‘login’;
    $this -> load -> view(‘Plantilla/header’, $data);
    $this -> load -> view(‘Eventos/login’);
    $this -> load -> view(‘Plantilla/footer’);
    Y entonces cuando se logee correctamente pase a por ejemplo
    $data[‘titulo’] = ‘login’;
    $this -> load -> view(‘Plantilla/header_log’, $data);
    $this -> load -> view(‘Eventos/perfil’);
    $this -> load -> view(‘Plantilla/footer’);
    Pero que se mantenga asi hasta que se cierre sesion?

  19. Buenas, muchas gracias por sus tutoriales Ferchu, me están viniendo genial para aprender Codeigniter, y hasta ahora estoy muy contento con lo que estoy aprendiendo.

    Me surge una duda a nivel de sesiones.

    La cuestión es que me gustaría tener la opción al hacer login un input checkbox que al marcarse la sesión se mantenga por un tiempo mayor al que viene por defecto en el config, concretamente:
    $config[‘sess_expiration’] = 7200;

    La verdad es que he probado de todo y no consigo que al marcar el botón de recuérdame, se incremente ese tiempo por defecto, ya que no prefiero trabajar con cookies.

    Saludos y muchas gracias Ferchu.

  20. si quisiera usar Setter y Getter en ci , como seria ? por ejemplo

    por ejemplo el modelo hize algo asi :
    class Usuario_model extends CI_Model {

    private $nombre;
    private $contraseña;

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

    }
    public function getId() {
    return $this->nombre;
    }

    public function setId($nombre) {
    $this->nombre = $nombre;
    }

    public function getContrasena() {
    return $this->contraseña;
    }

    public function setContrasena($contraseña) {
    $this->contraseña = $contraseña;
    }

    a la hora de pasar las variables por el controllador como seria , asi ?

    $set_id = $user->setId($this->input->post(‘nombre’));
    $get_id = $this->usuario_model->getId();
    $usuario = $this->usuario_model->usuario_por_nombre_contrasena($get_id, $contrasena);

    me queda esa duda si seria así al pasar la variable a la función , o si así es correcto hacerlo.

    1. Yo no lo haría así. Si querés crear una forma de trabajar con entidades de usuario debería ser una clase externa, no conviene mezclarla con las CI_MODEL, que se utilizan para hacer consultas.

      Por ejemplo:

      class Usuario {
      private $nombre;
      private $contraseña;
      //Constructores y métodos getters y setters.
      }

      class Usuario_model extends CI_Model {
      //Acá le pasas como parámetro un objeto usuario, y con los datos de ese usuario hacés las consultas.
      public function registrar_usuario($usuario){
      $this->db->insert(‘usuario’, array(
      ‘nombre’ => $usuario->getNombre(),
      ‘contrasena’ => $usuario->getContrasena(),
      ));
      }
      }

      Saludos!

      1. ya veo hare eso que me dices , pero me surge otra duda , hize esto gracias a tu consejo ahora :

        class Usuario {
        private $nombre;
        private $contraseña;

        public function __construct($nombre=»»,$contraseña=»») {

        $this->nombre = $nombre;
        $this->contraseña = $contraseña;

        }
        public function getId() {
        return $this->nombre;
        }

        public function setId($nombre) {
        $this->nombre = $nombre;
        }

        public function getContrasena() {
        return $this->contraseña;
        }

        public function setContrasena($contraseña) {
        $this->contraseña = $contraseña;
        }
        }

        class Usuario_model extends CI_Model {

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

        }

        public function usuario_por_nombre_contrasena($nombre, $contrasena){

        $user = new usuario();
        $this->db->select(‘id, nombre’);
        $this->db->from(‘usuarios’);
        $this->db->where(‘id_acceso’, $nombre);
        $this->db->where(‘contraseña’, $contrasena);
        $data = array(
        ‘id_acceso’ => $user->getId(),
        ‘contraseña’ => $user->getContrasena()
        );
        $consulta = $this->db->get();
        $resultado = $consulta->row();
        return $resultado;
        }
        }

        no se si asi este bien

        en el controllador tengo algo asi :
        $user = new usuario();

        $set_id = $user->setId($this->input->post(‘nombre’));
        $get_id = $user->getId();
        $usuario = $this->usuario_model->usuario_por_nombre_contrasena($get_id, $contrasena);

        no pongo lo demás para no hacer mas largo , no se si sea la forma correcta!!

        1. public function usuario_por_nombre_contrasena($nombre, $contrasena){
          $user = new usuario($nombre,$contrasena);
          $data = array(
          ‘id_acceso’ => $user->getId() ,
          ‘contraseña’ => $user->getContrasena()
          );
          $this->db->select(‘id, nombre’);
          $this->db->from(‘usuarios’);
          $this->db->where($data);
          $consulta = $this->db->get();
          $resultado = $consulta->row();
          return $resultado;

          así no tuve que tocar el controllador con setter ni getters en el. aunque no se si así este bien en el modelo.

          1. Está bien, lo único que yo cambiaría es que en lugar de pasarle nombre y contraseña, le pasaría el objeto entero Usuario.

            Vos pensá que si el día de mañana para hacer un registro no sólo necesitás el nombre y la contraseña, vas a tener que pasar un montón de datos más como email, comentario, país, etc; tenés que agregar un montón de parámetros más.

            No es lo mismo tener algo como:

            $this->modelo_model->insertar($parametro1, $parametro2, …$parametro20);

            Que tener:

            $this->modelo_model->insertar($objeto);

            Igual es una idea, cada uno trabaja como le parece.

            Saludos!

          2. no pero tenes la razón en ese caso , sabes que un día luego de comentar yo , me puse a pensar en eso mismo y dije , si paso el objeto usuario es mas fácil y mas eficiente. por como vos dices.

            La razón a quien la tiene y tu en este caso para mi la tienes.
            igual gracias por responder y no solo por eso por el tiempo de hacer estos tutoriales. un abrazo y suerte!

  21. hola que tal buenos días, antes que nada muchas gracias por el aporte.

    tengo un problema, no se si me puedan dar una orientación a un problema que me surge al momento de cargar las librería de session.

    si mi archivo config.php esta de esta manera:
    $autoload[‘libraries’] = array(‘database’);

    funciona perfectamente, pero si le agrego la librería de session quedadonde de la siguiete manera:
    $autoload[‘libraries’] = array(‘database’, ‘session’);

    ya no carga nada y me muestra en pantalla:

    Esta página no funciona

    La página http://www.mipagina.com.mx no puede procesar esta solicitud ahora.
    HTTP ERROR 500

    1. El código es correcto. Hacé una cosa, andate al archivo index.php, y cambialo a modo desarrollador:

      define(‘ENVIRONMENT’, isset($_SERVER[‘CI_ENV’]) ? $_SERVER[‘CI_ENV’] : ‘production’);

      Por:

      define(‘ENVIRONMENT’, isset($_SERVER[‘CI_ENV’]) ? $_SERVER[‘CI_ENV’] : ‘development’);

      Copiá el error que te devuelve, y volvelo como antes, y mandame el error.

      Gracias.

      1. Hola que tal este es el error que me muestra

        Warning: include(/home/exposs/public_html/8expo/application/views/errors/error_php.php): failed to open stream: No such file or directory in /home/exposs/public_html/8expo/system/core/Exceptions.php on line 183

        Warning: include(): Failed opening ‘/home/exposs/public_html/8expo/application/views/errors/error_php.php’ for inclusion (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/exposs/public_html/8expo/system/core/Exceptions.php on line 183

        Warning: include(/home/exposs/public_html/8expo/application/views/errors/error_php.php): failed to open stream: No such file or directory in /home/exposs/public_html/8expo/system/core/Exceptions.php on line 183

        Warning: include(): Failed opening ‘/home/exposs/public_html/8expo/application/views/errors/error_php.php’ for inclusion (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/exposs/public_html/8expo/system/core/Exceptions.php on line 183

        Warning: include(/home/exposs/public_html/8expo/application/views/errors/error_php.php): failed to open stream: No such file or directory in /home/exposs/public_html/8expo/system/core/Exceptions.php on line 183

        Warning: include(): Failed opening ‘/home/exposs/public_html/8expo/application/views/errors/error_php.php’ for inclusion (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/exposs/public_html/8expo/system/core/Exceptions.php on line 183

        Warning: include(/home/exposs/public_html/8expo/application/views/errors/error_php.php): failed to open stream: No such file or directory in /home/exposs/public_html/8expo/system/core/Exceptions.php on line 183

        Warning: include(): Failed opening ‘/home/exposs/public_html/8expo/application/views/errors/error_php.php’ for inclusion (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/exposs/public_html/8expo/system/core/Exceptions.php on line 183

        1. Podrías indicarme qué dice en tu código, dentro del archivo applictaion/config/routes.php, la siguiente línea:

          $route[‘default_controller’]

          1. $route[‘default_controller’] = ‘pagina’;

            es para cargar la pagina principal

          2. La verdad nunca me devolvió este error a mí, si querés enviame el código por correo.

            Saludos!

  22. Gracias Fernando.
    Gracias nuevamente por compartir tus conocimietos.
    Tengo conociminetnos con CI.
    Un tanto apartado del CI.
    Con éste curso, he mejorado mis conocimientos.
    Gracias mi sugerencia es que pongas como aportar económicamente, en forma libre desde un $ hasta la capacidad del usuario, Ésto porque unos tenemos ($) otros no.
    Tambien ví el curso de CI + VUE, que me parece que es el futuro, por favor, si es que nos ayudas en este tema.

    Miguelon
    Quito.-Ecuador
    «La Mitad del Mundo»
    Mi país está por despider al mejor Presidente de todos los tiempos, pese a la contra de los medios de comunicación privada, que siempre hacen «ver» al pueblo lo que ellos quieren que veamos.
    Hay mucha corrupción en los (todos) medios de comunicación mercantilista. La clase media somos ignorantes y analfetos políticamente. No analizamos, y creemos en los diferentes actores que presenta la prensa corrupta,
    Pido mil disculpas por porner este tema, én éste foro y acepto cualquier responsapibilidad y penalidad.
    Creo que la ciencia debe ir de la mano con políticas de estado en favor del pueblo y no de la clase dominante en lo económico.
    Nuevamente Gracias y mis respetos al foro.

    1. Miguel León, gracias por comentar.

      Veré si puedo seguir con algo de Vue, mi idea era continuar con una integración Vue.js + Laravel, igual hay excelentes explicaciones en otras páginas de esas dos tecnologías.

      Lo de Correa lo dejo. A algunos presidentes los elige el pueblo, a otros los empresarios. Así que si los poderosos no quieren a un presidente, significa que ese presidente hizo un buen trabajo.

      Saludos!