Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Pérdida de la sesión (I)

Estas en el tema de Pérdida de la sesión (I) en el foro de PHP en Foros del Web. Hola, tengo un problema con el traspaso de la sesión al refrescar la página o cambarla y no sé por qué. Espero que alguien pueda ...
  #1 (permalink)  
Antiguo 20/07/2013, 06:42
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Pérdida de la sesión (I)

Hola, tengo un problema con el traspaso de la sesión al refrescar la página o cambarla y no sé por qué. Espero que alguien pueda ayudarme.

Parto de la página recepcion.php:

Esta página es encabezada por un inicio de sesión, la introducción de los archivos externos necesarios y la creación de la clase recepcion, hija de Web.
Concluye con la creación del código HTML por medio de las funciones de la clase
Web y de su hija recepcion.

La página resultante posee un menú superior realizado por Web y un submenú realizado por la función escribir_submenu_superior de recepcion. El submenú dispone de tres opciones: Iniciar/terminar sesión, recuperar la contraseña olvidada y registrarse. Nos interesa la primera.

Al hacer click en Iniciar sesión se escribe el formulario de escribir_columna_derecha_inicio_sesion(). La ejecución del formulario envía un post &accion='iniciar sesion' a la misma página. Este post es recogido al escribir el HTML de la página para que ejecute el método iniciar_sesion() el cual llamará a su vez al método iniciar_sesion() de la clase padre.

[HIGHLIGHT="PHP"]
<?php
//Inicio de sesión.
session_start();
//Ficheros requeridos.
require_once 'Web.php';
require_once 'usuario.php';
//Creación de la clase Biblioteca.
class Recepcion extends Web{
...
public function escribir_submenu_superior(){
echo " <!-- Submenú superior -->\n";
echo " <div class='submenu' id='submenu'>\n";
echo " \n";
if((!isset($_SESSION)) || ($this->leer_acceso() == $this::USUARIO_ANONIMO)){
echo " <form class='recepcion' id='inicio_sesion' action='".$_SERVER['PHP_SELF']."' method='post'>\n";
echo " <input type='hidden' name='accion' value='iniciar_sesion'>\n";
echo " <a href='javascript:document.getElementById(\"inicio_ sesion\").submit();'>Iniciar sesión</a> |\n";
echo " </form>\n";
}else{
echo " <form class='recepcion' id='fin_sesion' action='".$_SERVER['PHP_SELF']."' method='post'>\n";
echo " <input type='hidden' name='accion' value='finalizar_sesion'>\n";
echo " <a href='javascript:document.getElementById(\"finaliz ar_sesion\").submit();'>Finalizar sesión</a> |\n";
echo " </form>\n";
}
echo " \n";
echo " <form class='recepcion' id='recuperacion_clave' action='' method='post'>\n";
echo " <input type='hidden' name='accion' value='recuperar_clave'>\n";
echo " <a href='javascript:document.getElementById(\"recuper acion_clave\").submit();'>Recuperar la contraseña olvidada</a> |\n";
echo " </form>\n";
echo " \n";
echo " <form class='recepcion' id='registro_usuario' action='' method='post'>\n";
echo " <input type='hidden' name='accion' value='registrar_usuario'>\n";
echo " <a href='javascript:document.getElementById(\"registr o_usuario\").submit();'>Registrarse</a>\n";
echo " </form>\n";
echo " \n";
echo " </div>\n";
echo " <!-- Submenú superior (fin) -->\n";
echo " \n";
}
...
public function escribir_columna_derecha_inicio_sesion(){
...
echo " <form id='sesion' name='sesion' method='post' action='".$_SERVER['PHP_SELF']."'>\n";
echo " <p>\n";
echo " <label>\n";
echo " Nombre de usuario*:\n";
echo " <br/>\n";
echo " <input id='usuario' name='usuario' type='text' size='30%' />\n";
echo " </label>\n";
echo " </p>\n";
echo " <p>\n";
echo " <label>\n";
echo " Contraseña*:\n";
echo " <br/>\n";
echo " <input id='clave' name='clave' type='text' size='30%' />\n";
echo " </label>\n";
echo " </p>\n";
echo " <p>\n";
echo " <input id='iniciar_sesion' name='iniciar_sesion' type='submit' value='Iniciar' />\n";
echo " </p>\n";
echo " </form>\n";
echo " \n";
}
...
public function iniciar_sesion(){
//Se procesa la información.
if (isset($_POST['usuario'])){
if (isset($_POST['clave'])){
parent::iniciar_sesion($_POST['usuario'], $_POST['clave']);
//header('Location: ' . $_SERVER['SERVER_NAME']);
}else{
echo " <p>\n";
echo " <em>Resultado:</em> Por favor, introduzca la clave.\n";
echo " </p>\n";
}
}else{
echo " <p>\n";
echo " <em>Resultado:</em> Por favor, introduzca su nombre de usuario.\n";
echo " </p>\n";
}
}
...
}
...
//Creación de la página.
$web = new Recepcion(AUTOR,
FECHA_CREACION,
FECHA_MODIFICACION,
VERSION);

$web->escribir_doctype();
$web->iniciar_html();
$web->escribir_head();
$web->iniciar_body();
$web->escribir_capa_superpuesta();
$web->iniciar_contenedor();
$web->iniciar_encabezamiento();
$web->escribir_menu_superior();
$web->escribir_submenu_superior();
$web->escribir_mensaje_de_informacion('');
$web->escribir_mensaje_de_aviso('');
$web->escribir_mensaje_de_exito('');
$web->escribir_mensaje_de_error('');
$web->finalizar_encabezamiento();
$web->iniciar_columna_central();
$web->iniciar_columna_izquierda();
$web->titular_columna_izquierda(TITULO, SUBTITULO);
$web->escribir_columna_izquierda();
$web->indexar_inicio(HAY_ENLACE_AL_INICIO);
$web->finalizar_columna_izquierda();
$web->iniciar_columna_derecha();
$web->escribir_columna_derecha_introduccion();
if(isset($_POST['accion'])){
if($_POST['accion']=='iniciar_sesion'){
$web->escribir_columna_derecha_inicio_sesion();
}elseif($_POST['accion']=='recuperar_clave'){
$web->escribir_columna_derecha_recuperacion_clave();
}elseif($_POST['accion']=='registrar_usuario'){
$web->escribir_columna_derecha_registro_usuario();
}else{
//Nada.
}
}else{
//Nada.
}
if(isset($_POST['recuperar_clave'])){
$web->enviar_clave();
}
if(isset($_POST['iniciar_sesion'])){
$web->iniciar_sesion();
}
if(isset($_POST['accion'])){
$web->terminar_sesion();
}
if(isset($_POST['registrar_usuario'])){
$web->registrar_usuario();
}
$web->finalizar_columna_derecha();
$web->finalizar_columna_central();
$web->finalizar_contenedor();
$web->finalizar_body();
$web->finalizar_html();
?>
  #2 (permalink)  
Antiguo 20/07/2013, 06:43
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (I)

Veamos la página donde se implementa la clase Web:

Código PHP:
Ver original
  1. <?php
  2. //Inicio de sesión.
  3. ...
  4. class Web{
  5.     ...
  6.     const USUARIO_ANONIMO    = 0;
  7.     const USUARIO_REGISTRADO = 1;
  8.     ...
  9.     protected $acceso;
  10.     ...
  11.     public function iniciar_sesion($usuario, $clave){
  12.         define("NO_HAY_ERROR", NULL);
  13.         if ((isset($usuario)) && (isset($clave))){
  14.             $mysql = new mysqli($this->leer_bdweb_servidor(), $this->leer_bdweb_usuario(), $this->leer_bdweb_clave(), $this->leer_bdweb_nombre());
  15.             if($mysql->connect_error == NO_HAY_ERROR){
  16.                 $consulta = "SELECT *
  17.                             FROM `Usuarios`
  18.                             WHERE `nombre` = '$usuario' AND `clave` = '$clave'";
  19.                 $resultado = $mysql->query($consulta);
  20.                 if ($resultado->num_rows > 0){
  21.                     session_destroy();
  22.                     session_start();
  23.                     $_SESSION['usuario'] = $usuario;
  24.                     $this->escribir_acceso($this::USUARIO_REGISTRADO);
  25.                     $resultado->free();
  26.                 }else{
  27.                     $this->terminar_sesion();
  28.                 }
  29.             }else{
  30.                 session_destroy();
  31.                 session_start();
  32.                 $_SESSION['usuario'] = 'ERR'.$mysql->connect_errno;
  33.                 $this->escribir_acceso($this::USUARIO_ANONIMO);
  34.                 echo $mysql->connect_error;
  35.                 echo "<br />";
  36.             }
  37.             $mysql->close();
  38.         }else{
  39.             $this->terminar_sesion();
  40.         }
  41.     }
  42.     public function terminar_sesion(){
  43.         session_destroy();
  44.         session_start();
  45.         $_SESSION['usuario'] = 'Anónimo';
  46.         $this->escribir_acceso($this::USUARIO_ANONIMO);
  47.     }
  48.     ...
  49.     public function escribir_menu_superior(){
  50.         print_r("Sesión: ");
  51.         print_r($_SESSION);
  52.         print_r('<br />');
  53.         if(isset($_SESSION['usuario'])){
  54.             $usuario = $_SESSION['usuario'];
  55.         }else{
  56.             $usuario = 'Anónimo';
  57.         }
  58.         echo "        <!-- Menú superior -->\n";
  59.         echo "        <div class='menu' id='menu'>\n";            
  60.         echo "            <a href='/Biblioteca.php'>Biblioteca </a>|\n";
  61.         echo "            <a href='/Sindesmoteca.php'>Sindesmoteca </a>|\n";
  62.         echo "            <a href='/galeria/Galeria.php'>Galería </a>|\n";
  63.         echo "            <a href='/Historial.php'>Historial </a>|\n";
  64.         echo "            <a href='/Videoteca.php'>Videoteca </a>|\n";
  65.         echo "            <a href='/Buzon.php'>Buzón </a>|\n";
  66.         echo "            <a href='/Fonoteca.php'>Fonoteca </a>|\n";
  67.         echo "            <a href='/recepcion.php'>Recepción </a>|\n";
  68.         echo "            <a href=''>".$usuario."</a>\n";      
  69.         echo "        </div>\n";
  70.         echo "        <!-- Menú superior (fin) -->\n";
  71.         echo "        \n";
  72.     }
  73.     ...
  74. }
  75. ?>

--paréntesis--

La página usuario.php, que no es empleada en este caso, inicia también la sesión:

Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. ...
  5. ?>

--fin paréntesis--

(Disculpad que haya sido tan largo, pero he intentado introducir todos los posibles factores)

¿Alguien puede arrojarme algo de luz para adivinar la causa? Gracias de antemano.
  #3 (permalink)  
Antiguo 20/07/2013, 06:50
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (I)

Disculpad, perdí el último tag en el primer post de este tema: reenvío el código para que sea más fácil su lectura:

Código PHP:
Ver original
  1. <?php
  2. //Inicio de sesión.
  3. //Ficheros requeridos.
  4. require_once 'Web.php';
  5. require_once 'usuario.php';
  6. //Creación de la clase Biblioteca.
  7. class Recepcion extends Web{
  8.     ...
  9.     public function escribir_submenu_superior(){
  10.         echo " <!-- Submenú superior -->\n";
  11.         echo " <div class='submenu' id='submenu'>\n";
  12.         echo " \n";
  13.         if((!isset($_SESSION)) || ($this->leer_acceso() == $this::USUARIO_ANONIMO)){
  14.                 echo "     <form class='recepcion' id='inicio_sesion' action='".$_SERVER['PHP_SELF']."' method='post'>\n";
  15.                 echo "         <input type='hidden' name='accion' value='iniciar_sesion'>\n";
  16.                 echo "         <a href='javascript:document.getElementById(\"inicio_ sesion\").submit();'>Iniciar sesión</a> |\n";
  17.                 echo "     </form>\n";
  18.         }else{
  19.                 echo "     <form class='recepcion' id='fin_sesion' action='".$_SERVER['PHP_SELF']."' method='post'>\n";
  20.                 echo "         <input type='hidden' name='accion' value='finalizar_sesion'>\n";
  21.                 echo "         <a href='javascript:document.getElementById(\"finalizar_sesion\").submit();'>Finalizar sesión</a> |\n";
  22.                 echo "     </form>\n";
  23.         }
  24.         echo " \n";
  25.         echo "       <form class='recepcion' id='recuperacion_clave' action='' method='post'>\n";
  26.         echo "           <input type='hidden' name='accion' value='recuperar_clave'>\n";
  27.         echo "           <a href='javascript:document.getElementById(\"recuper acion_clave\").submit();'>Recuperar la contraseña olvidada</a> |\n";
  28.         echo "       </form>\n";
  29.         echo " \n";
  30.         echo "       <form class='recepcion' id='registro_usuario' action='' method='post'>\n";
  31.         echo "           <input type='hidden' name='accion' value='registrar_usuario'>\n";
  32.         echo "           <a href='javascript:document.getElementById(\"registr o_usuario\").submit();'>Registrarse</a>\n";
  33.         echo "       </form>\n";
  34.         echo " \n";
  35.         echo " </div>\n";
  36.         echo " <!-- Submenú superior (fin) -->\n";
  37.         echo " \n";
  38.     }
  39.     ...
  40.     public function escribir_columna_derecha_inicio_sesion(){
  41.         ...
  42.         echo " <form id='sesion' name='sesion' method='post' action='".$_SERVER['PHP_SELF']."'>\n";
  43.         echo "     <p>\n";
  44.         echo "         <label>\n";
  45.         echo "             Nombre de usuario*:\n";
  46.         echo "             <br/>\n";
  47.         echo "             <input id='usuario' name='usuario' type='text' size='30%' />\n";
  48.         echo "         </label>\n";
  49.         echo "     </p>\n";
  50.         echo "     <p>\n";
  51.         echo "         <label>\n";
  52.         echo "             Contraseña*:\n";
  53.         echo "             <br/>\n";
  54.         echo "             <input id='clave' name='clave' type='text' size='30%' />\n";
  55.         echo "         </label>\n";
  56.         echo "     </p>\n";
  57.         echo "     <p>\n";
  58.         echo "         <input id='iniciar_sesion' name='iniciar_sesion' type='submit' value='Iniciar' />\n";
  59.         echo "     </p>\n";
  60.         echo " </form>\n";
  61.         echo " \n";
  62.     }
  63.     ...
  64.     public function iniciar_sesion(){
  65.         //Se procesa la información.
  66.         if (isset($_POST['usuario'])){
  67.             if (isset($_POST['clave'])){
  68.                 parent::iniciar_sesion($_POST['usuario'], $_POST['clave']);
  69.                 //header('Location: ' . $_SERVER['SERVER_NAME']);
  70.             }else{
  71.                 echo " <p>\n";
  72.                 echo " <em>Resultado:</em> Por favor, introduzca la clave.\n";
  73.                 echo " </p>\n";
  74.             }
  75.         }else{
  76.             echo " <p>\n";
  77.             echo " <em>Resultado:</em> Por favor, introduzca su nombre de usuario.\n";
  78.             echo " </p>\n";
  79.         }
  80.     }
  81.     ...
  82. }
  83. ...
  84. //Creación de la página.
  85. $web = new Recepcion(  AUTOR,
  86.                                         FECHA_CREACION,
  87.                                         FECHA_MODIFICACION,
  88.                                         VERSION);
  89.  
  90. $web->escribir_doctype();
  91. $web->iniciar_html();
  92.     $web->escribir_head();
  93.     $web->iniciar_body();
  94.         $web->escribir_capa_superpuesta();
  95.         $web->iniciar_contenedor();
  96.             $web->iniciar_encabezamiento();
  97.                 $web->escribir_menu_superior();
  98.                 $web->escribir_submenu_superior();
  99.                 $web->escribir_mensaje_de_informacion('');
  100.                 $web->escribir_mensaje_de_aviso('');
  101.                 $web->escribir_mensaje_de_exito('');
  102.                 $web->escribir_mensaje_de_error('');
  103.             $web->finalizar_encabezamiento();
  104.             $web->iniciar_columna_central();
  105.                 $web->iniciar_columna_izquierda();
  106.                     $web->titular_columna_izquierda(TITULO, SUBTITULO);
  107.                     $web->escribir_columna_izquierda();
  108.                     $web->indexar_inicio(HAY_ENLACE_AL_INICIO);
  109.                 $web->finalizar_columna_izquierda();
  110.                 $web->iniciar_columna_derecha();
  111.                     $web->escribir_columna_derecha_introduccion();
  112.                     if(isset($_POST['accion'])){
  113.                         if($_POST['accion']=='iniciar_sesion'){
  114.                             $web->escribir_columna_derecha_inicio_sesion();
  115.                         }elseif($_POST['accion']=='recuperar_clave'){
  116.                             $web->escribir_columna_derecha_recuperacion_clave();
  117.                         }elseif($_POST['accion']=='registrar_usuario'){
  118.                             $web->escribir_columna_derecha_registro_usuario();
  119.                         }else{
  120.                             //Nada.
  121.                         }
  122.                     }else{
  123.                         //Nada.
  124.                     }
  125.                     if(isset($_POST['recuperar_clave'])){
  126.                         $web->enviar_clave();
  127.                     }
  128.                     if(isset($_POST['iniciar_sesion'])){
  129.                         $web->iniciar_sesion();
  130.                     }
  131.                     if(isset($_POST['accion'])){
  132.                         $web->terminar_sesion();
  133.                     }
  134.                     if(isset($_POST['registrar_usuario'])){
  135.                         $web->registrar_usuario();
  136.                     }
  137.                 $web->finalizar_columna_derecha();
  138.             $web->finalizar_columna_central();
  139.         $web->finalizar_contenedor();
  140.     $web->finalizar_body();
  141. $web->finalizar_html();
  142. ?>

Última edición por fcotorgi; 20/07/2013 a las 08:31
  #4 (permalink)  
Antiguo 20/07/2013, 08:43
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (I)

He modificado el código por dos errores que he encontrado pero que noo han solucionado el problema.

Cambio 1:

He cambiado esto:

Código PHP:
Ver original
  1. echo "     <form class='recepcion' id='fin_sesion' action='".$_SERVER['PHP_SELF']."' method='post'>\n";
  2.                 echo "         <input type='hidden' name='accion' value='finalizar_sesion'>\n";
  3.                 echo "         <a href='javascript:document.getElementById(\"finalizar_sesion\").submit();'>Finalizar sesión</a> |\n";
  4.                 echo "     </form>\n";

Por esto:

Código PHP:
Ver original
  1. echo "          <form class='recepcion' id='fin_sesion' action='".$_SERVER['PHP_SELF']."' method='post'>\n";
  2.             echo "            <input type='hidden' name='accion' value='finalizar_sesion'>\n";
  3.             echo "            <a href='javascript:document.getElementById(\"fin_sesion\").submit();'>Finalizar sesión</a> |\n";
  4.             echo "          </form>\n";

Cambio 2:

He cambiado esto:

Código PHP:
Ver original
  1. if(isset($_POST['accion'])){
  2.                         $web->terminar_sesion();
  3.                     }

por esto:

Código PHP:
Ver original
  1. if(isset($_POST['accion'])){
  2.                         if($_POST['accion']=='finalizar_sesion'){
  3.                             $web->terminar_sesion();
  4.                         }
  5.                     }
  #5 (permalink)  
Antiguo 21/07/2013, 05:03
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (I)

¡Ya está solucionado! El problema era que las acciones de los formularios -incluido el inicio de sesión- se desarrollaban en medio de la construcción del código HTML.

Etiquetas: perdida, sesión, session_start
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:27.