Foros del Web » Programando para Internet » PHP »

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

Estas en el tema de Pérdida de la sesión (II) en el foro de PHP en Foros del Web. ¿Qué causas pueden provocar la pérdida los datos de una sesión? Lo digo porque he implementado una página que toma los datos y crea la ...

  #1 (permalink)  
Antiguo 21/07/2013, 10:06
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Pérdida de la sesión (II)

¿Qué causas pueden provocar la pérdida los datos de una sesión?

Lo digo porque he implementado una página que toma los datos y crea la sesión sin problema. Los datos son tomados de un formulario. La página llama a una clase que se halla en otro archivo php que no contiene html y mantiene los datos de la sesión sin problema.

Sin embargo, cuando llamo a alguna de las páginas que pueden verse en la web que ejecutan html y php, la sesión se pierde. He comprobado si había algún "session_start()" entre el código html y no es el caso.

¿Qué otros motivos pueden hacer perder una sesión? Gracias.
  #2 (permalink)  
Antiguo 21/07/2013, 10:35
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Pérdida de la sesión (II)

La única causa que conozco es la mala programación, los datos no se pierden por arte de magia, adivinar que has hecho mal es imposible.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 21/07/2013, 10:56
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Sí... lo sé. Pero si el problema no está en session_start()... ¿existen otros motivos?
  #4 (permalink)  
Antiguo 21/07/2013, 11:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Pérdida de la sesión (II)

Lo único que puede afectar a la sesión es tu programación, no hay nada oculto, no más.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 21/07/2013, 11:16
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

El código que crea el formulario y recoge los parámetros es el siguiente:

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(\"fin_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(\"recuperacion_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(\"registro_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.         echo "          <p>\n";
  42.         echo "            <em>Inicio de sesión</em>";
  43.         echo "          </p>\n";
  44.         echo "          <p>\n";
  45.         echo "            Por favor, rellene los campos abajo descritos\n";
  46.         echo "            si desea iniciar una sesión no anónima.\n";
  47.         echo "          </p>\n";
  48.         echo "          <p>\n";
  49.         echo "            Atenci&oacute;n: La p&aacute;gina se encuentra todav&iacute;a en construcci&oacute;n\n";
  50.         echo "            y no se almacenan de forma persistente los usuario. Es por ello que todas las sesiones son,\n";
  51.         echo "            por ahora anónimas.\n";
  52.         echo "          </p>\n";
  53.         echo "          <p>\n";
  54.         echo "            Disculpe la molestia y gracias por su confianza.\n";
  55.         echo "          </p>\n";
  56.         echo "          \n";
  57.         echo "          <form id='sesion' name='sesion' method='post' action='".$_SERVER['PHP_SELF']."'>\n";
  58.         echo "            <p>\n";
  59.         echo "              <label>\n";
  60.         echo "                Nombre de usuario*:\n";
  61.         echo "                <br/>\n";
  62.         echo "                <input id='usuario' name='usuario' type='text' size='30%' />\n";
  63.         echo "              </label>\n";
  64.         echo "            </p>\n";
  65.         echo "            <p>\n";
  66.         echo "              <label>\n";
  67.         echo "                Contraseña*:\n";
  68.         echo "                <br/>\n";
  69.         echo "                <input id='clave' name='clave' type='text' size='30%' />\n";
  70.         echo "              </label>\n";
  71.         echo "            </p>\n";
  72.         echo "            <p>\n";
  73.         echo "             <input id='iniciar_sesion' name='iniciar_sesion' type='submit' value='Iniciar' />\n";
  74.         echo "            </p>\n";
  75.         echo "          </form>\n";
  76.         echo "          \n";
  77.     }
  78.     ...
  79.     public function iniciar_sesion(){
  80.         //Se procesa la información.
  81.         if (isset($_POST['usuario'])){
  82.             if (isset($_POST['clave'])){
  83.                 parent::iniciar_sesion($_POST['usuario'], $_POST['clave']);
  84.                 $msg = "¡Saludos, ".$_SESSION['usuario']."!\n";
  85.             }else{
  86.                 $msg = "<em>Resultado:</em> Por favor, introduzca la clave.\n";
  87.             }
  88.         }else{
  89.             $msg = "<em>Resultado:</em> Por favor, introduzca su nombre de usuario.\n";
  90.         }
  91.         $mensaje  = "          <p>\n";
  92.         $mensaje .= "              " . $msg;
  93.         $mensaje .= "          </p>\n";
  94.         $this->escribir_mensaje($mensaje);
  95.     }
  96.     ...
  97. }
  98.  
  99. ...
  100.  
  101. //Creación de la página.
  102. $web = new Recepcion(AUTOR,
  103.                      FECHA_CREACION,
  104.                      FECHA_MODIFICACION,
  105.                      VERSION);
  106. //Ejecución de las acciones del formulario que remitió a esta página.
  107. ...
  108. if(isset($_POST['iniciar_sesion'])){
  109.     $web->iniciar_sesion();
  110. }
  111. if(isset($_POST['accion'])){
  112.     if($_POST['accion']=='finalizar_sesion'){
  113.         $web->terminar_sesion();
  114.     }
  115. }
  116. ...
  117. //Escritura de la página.
  118. $web->escribir_doctype();
  119. $web->iniciar_html();
  120. ...
  121.                 $web->iniciar_columna_derecha();
  122.                     $web->escribir_columna_derecha_introduccion();
  123.                     if(isset($_POST['accion'])){
  124.                         if($_POST['accion']=='iniciar_sesion'){
  125.                             $web->escribir_columna_derecha_inicio_sesion();
  126.                         }elseif($_POST['accion']=='recuperar_clave'){
  127.                             $web->escribir_columna_derecha_recuperacion_clave();
  128.                         }elseif($_POST['accion']=='registrar_usuario'){
  129.                             $web->escribir_columna_derecha_registro_usuario();
  130.                         }else{
  131.                             //Nada.
  132.                         }
  133.                 ...
  134.                 $web->finalizar_columna_derecha();
  135.                 ...
  136. $web->finalizar_html();
  137. ?>

(...sigue...)
  #6 (permalink)  
Antiguo 21/07/2013, 11:17
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

(...continua...)

El formulario llama a esa misma página y ejecuta el siguiente método de la clase '"Web" que está implementada en "Web.php":

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

Todos los ficheros php que pueden ser ejecutados en el menú comienzan así:

Código PHP:
Ver original
  1. <?php
  2. //Inicio de sesión.
  3. ...
  4. ?>

Y no hay ningún otro <i>session_start()</i> más que los escritos arriba.

Cuando ejecuto alguno de los archivos php del menú, se pierde la sesión. Si alguien puede arrojarme algo de luz, se lo agradeceré.
  #7 (permalink)  
Antiguo 21/07/2013, 11:21
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Pérdida de la sesión (II)

- Defines constantes dentro de metodos ?

- Haces echo dentro de tus clases ?

- Usas session_start() como varias veces.....
__________________
Salu2!

Última edición por Italico76; 21/07/2013 a las 11:27
  #8 (permalink)  
Antiguo 21/07/2013, 11:38
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Cita:
Iniciado por Italico76 Ver Mensaje
- Defines constantes dentro de metodos ?
En algún método empleo constantes. También empleo constantes en las clases.
Pero todo está en regla.

Cita:
Iniciado por Italico76 Ver Mensaje
- Haces echo dentro de tus clases ?
Sí.

Cita:
Iniciado por Italico76 Ver Mensaje
- Usas session_start() como varias veces.....
En todos los ficheros php y de la forma señalada arriba.
  #9 (permalink)  
Antiguo 21/07/2013, 12:06
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Pérdida de la sesión (II)

Segun mi entendimiento las CONSTANTES de CLASE se inicializan al nivel de las propiedades y no dentro de metodos excepto que quieras hacer algo muy particular

Ni siquiera las funciones si programas Procedural hacen ECHO sino arman lo que necesitas imprimir y lo devuelven con Return lo cual te da muchas ventajas como poder procesar esa salida en vez de imprimirla o guardarla en un fichero, etc

session_start() lo utilizas ADEMAS dentro de tus clases.....varias veces....
__________________
Salu2!
  #10 (permalink)  
Antiguo 21/07/2013, 13:25
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Las constantes de clase están definidas todas, como tú dices, al nivel de las propiedades. Lo segundo punto no te lo entendí muy bien. Respecto al tercer punto, los inicios de sesión están bien puestos. Dime si hay alguno que no te cuadre en todo caso. Gracias por mostrar tu interés y querer ayudarme.
  #11 (permalink)  
Antiguo 21/07/2013, 14:23
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Pérdida de la sesión (II)

A veces se da en el clavo.. otras no... pero SI la idea es ayudar:

Código PHP:
Ver original
  1. // Mal
  2. function hello ($name){
  3.     echo "Hola $name ";
  4. }
  5.  
  6. // Bien
  7. function hello ($name){
  8.     return "Hola $name";
  9. }

Como se usa sino haces echo dentro de la funcion ?

Código PHP:
Ver original
  1. echo hello ("Juan");
__________________
Salu2!
  #12 (permalink)  
Antiguo 21/07/2013, 14:37
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

En ese punto no tengo ningún problema. El problema lo tengo en la continuación de las sesiones. De hecho, cuando el fichero recepcion.php se llama a sí mismo por medio del formulario y ejecuta a continuación el método iniciar_sesion() almacenado en el fichero Web.php para volver el hilo de ejecución a recepcion.php, la sesión se mantiene sin problema.

No consigo ver dónde se corta la transmisión de las sesiones cuando todos los session_start() están bien puestos.
  #13 (permalink)  
Antiguo 21/07/2013, 14:46
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Pérdida de la sesión (II)

Cita:
Iniciado por fcotorgi
Cuando ejecuto alguno de los archivos php del menú, se pierde la sesión. Si alguien puede arrojarme algo de luz, se lo agradeceré.
Tal vez tienes un espacio, salto de línea o cualquier otro caracter antes de <?php session_start(); que puede ser el causante de que no se inicie la sesión.

Incluso, si tus scripts están codificados en UTF8, deberás revisar que no tengan BOM, porque con eso es suficiente para no poder enviar encabezados.

Para averiguar si algo raro está pasando, incluye estás líneas antes de session_start()
Código PHP:
Ver original
  1. ini_set('display_errors', '1');

Con eso se debe mostrar cualquier error y podrás saber qué está pasando.
__________________
- León, Guanajuato
- GV-Foto
  #14 (permalink)  
Antiguo 21/07/2013, 15:22
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

oK. Gracias, Triby. Ahora lo miraré. La verdad, he estado teniendo algún problema con la codificación de UTF en el IDE.

He revisado los espacios y no he visto ninguno.

He configurado los valores para mostrar los errores y veo el siguiente aviso:

Código HTML:
Ver original
  1. Warning: session_start(): Cannot send session cache limiter - headers already sent.

Miraré qué es lo que está pasando. Gracias por tu ayuda.

Última edición por fcotorgi; 21/07/2013 a las 15:36
  #15 (permalink)  
Antiguo 21/07/2013, 15:50
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Pérdida de la sesión (II)

Lo dicho, estás enviando una salida previa... muestra el mensaje completo para que sepas dónde y, de paso, también saberlo nosotros.
__________________
- León, Guanajuato
- GV-Foto
  #16 (permalink)  
Antiguo 21/07/2013, 16:01
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Pérdida de la sesión (II)

fcotorgi, lee lo siguiente:

PHP:¿Por qué me sale "Warning: Cannot modify header information - headers already sent by (output started at 1:2) in 3 on line 4"?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #17 (permalink)  
Antiguo 21/07/2013, 16:14
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Sale en todos los archivos php. Pondré uno de ejemplo.

En Biblioteca.php

Código PHP:
Ver original
  1. <?php
  2. //Inicio de sesión.
  3. ini_set('display_errors', '1');
  4. //Ficheros requeridos.
  5. require_once 'Web.php';
  6. //Creación de la clase Biblioteca.
  7. class Biblioteca extends Web{
  8. ...
  9. }
  10. ...
  11. ?>

el mensaje es:

Código HTML:
Ver original
  1. <b>Warning</b>:  session_start(): Cannot send session cookie - headers already sent by (output started at /homepages/**/**********/htdocs/*************/recepcion.php:1) in <b>/homepages/**/**********/htdocs/*************/recepcion.php</b> on line <b>5</b><br />
  2. <br />
  3. <b>Warning</b>:  session_start(): Cannot send session cache limiter - headers already sent (output started at /homepages/**/**********/htdocs/*************/recepcion.php:1) in <b>/homepages/**/**********/htdocs/*************/recepcion.php</b> on line <b>5</b><br />
  4. <br />
  5. <b>Notice</b>:  A session had already been started - ignoring session_start() in <b>/homepages/**/**********/htdocs/*************/Web.php</b> on line <b>5</b><br />
  6. <br />
  7. <b>Notice</b>:  A session had already been started - ignoring session_start() in <b>/homepages/**/**********/htdocs/*************/usuario.php</b> on line <b>3</b><br />
  8. <br />
  9. <b>Notice</b>:  A session had already been started - ignoring session_start() in <b>/homepages/**/**********/htdocs/*************/BaseDeDatos.php</b> on line <b>3</b><br />
  10. <br />
  11. <b>Notice</b>:  A session had already been started - ignoring session_start() in <b>/homepages/**/**********/htdocs/*************/Usuario_BaseDeDatos.php</b> on line <b>2</b><br />
  12. <br />
  13. <b>Strict Standards</b>:  Declaration of Recepcion::iniciar_sesion() should be compatible with Web::iniciar_sesion($usuario, $clave) in <b>/homepages/**/**********/htdocs/*************/recepcion.php</b> on line <b>10</b><br />

Por cierto, no sé si esto afecta a este tema, pero respecto a:

Código HTML:
Ver original
  1. <b>Strict Standards</b>:  Declaration of Recepcion::iniciar_sesion() should be compatible with Web::iniciar_sesion($usuario, $clave) in <b>/homepages/**/**********/htdocs/*************/recepcion.php</b> on line <b>10</b><br />

Pensaba que podía renombrarse el método con independencia de los parámetros. No había tenido ningún aviso de ello hasta ahora.
  #18 (permalink)  
Antiguo 21/07/2013, 16:16
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Cita:
Iniciado por pateketrueke Ver Mensaje
fcotorgi, lee lo siguiente:

[url=http://www.forosdelweb.com/wiki/PHP:%C2%BFPor_qu%C3%A9_me_sale_%22Warning:_Cannot_ modify_header_information_-_headers_already_sent_by_%28output_started_at_1:2% 29_in_3_on_line_4%22%3F]PHP:¿Por qué me sale "Warning: Cannot modify header information - headers already sent by (output started at 1:2) in 3 on line 4"?[/url]
Gracias, Paketetrueke.
  #19 (permalink)  
Antiguo 21/07/2013, 16:17
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Pérdida de la sesión (II)

Cita:
Iniciado por fcotorgi Ver Mensaje
No había tenido ningún aviso de ello hasta ahora.
Pues claro, si tienes malos hábitos los errores jamás se mostrarán por si sólos.

Y vaya que tienes bastantes, mal ahí.

Lee lo siguiente: http://phptherightway.com/
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #20 (permalink)  
Antiguo 21/07/2013, 16:38
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Paketetrueke, no se da lo que me mandas a través del enlace ¿Por qué me sale(...). No comienzo el código html ni imprimo nada antes del session_start() (salvo el código que acabo de poner para que me imprima por pantalla los mensajes de error, como me ha sugerido Triby).

Respecto a la guía de estilo, gracias.
  #21 (permalink)  
Antiguo 21/07/2013, 16:45
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

La página, si queréis verla es [URL="http://www.fcotorgi.es"]www.fcotorgi.es[/URL].
  #22 (permalink)  
Antiguo 21/07/2013, 16:50
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Pérdida de la sesión (II)

Cita:
Iniciado por fcotorgi Ver Mensaje
Paketetrueke, no se da lo que me mandas a través del enlace ¿Por qué me sale(...). No comienzo el código html ni imprimo nada antes del session_start() (salvo el código que acabo de poner para que me imprima por pantalla los mensajes de error, como me ha sugerido Triby).

Respecto a la guía de estilo, gracias.
¿Que nos quieres decir?

¿Que PHP está inventando los mensajes de error?

¿Ya leíste el enlace?

La causa de tus problemas se explican ahí.

Y por favor, piensa un poco lo que dices y haces, los errores no mienten.

Además no sólo se trata de imprimir texto o HTML, con que hagas esto es suficiente.
Código PHP:
Ver original
  1. <?php /* algo de código que no imprime nada */ ?>
  2. <?php session_start();

Lo que hay después del ?> y el siguiente <?php ya es un salto de linea, y eso arruina la salida, ¿o cómo hay que explicártelo?

Aprende a leer bien los mensajes de error:
Cita:
headers already sent by (output started at /homepages/**/**********/htdocs/*************/recepcion.php:1)
¿Qué te dice el mensaje que resalté en negritas?

Y así tienes muchos así que no inventes.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #23 (permalink)  
Antiguo 21/07/2013, 17:11
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Paketetrueke... lo siento... pero si no me dices algo concreto (fichero, línea y error) respecto al código que he mostrado, creo que no acabas de verlo. No hay nada antes del session_start. No divido el código php. Por favor, lee el código de arriba. Si hace falta te mando por privado el fichero entero para que veas que no hay nada, nada, nada.
  #24 (permalink)  
Antiguo 21/07/2013, 17:17
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Pérdida de la sesión (II)

Si tienes el error "...headers already sent..." es SEGURO como te dicen que ALGO se imprimio ANTES de ejecutar session_start()

Puede ser un espacio......o un caracter de control..... mas bien corta y pega en otro archivo desde justo despues de session_start() por si ALGO se te esta pasando y escribes nuevamente (no Copy-paste) :

Código PHP:
Ver original
  1. <?php
  2.  
  3. // aca pegas tu programa:

No hagas NADA antes... ni siquiera un include o requiere
__________________
Salu2!
  #25 (permalink)  
Antiguo 21/07/2013, 17:27
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Todos los archivos PHP comienzan así:

Código PHP:
Ver original
  1. <?php
  2. //Comentario
  3. //sigue el código.

Sólo ha tres excepciones:

En la página Web.php donde se implementa la clase Web:

Código PHP:
Ver original
  1. public function iniciar_sesion($usuario, $clave){
  2.         define("NO_HAY_ERROR", NULL);
  3.         if ((isset($usuario)) && (isset($clave))){
  4.             $mysql = new mysqli($this->leer_bdweb_servidor(), $this->leer_bdweb_usuario(), $this->leer_bdweb_clave(), $this->leer_bdweb_nombre());
  5.             if($mysql->connect_error == NO_HAY_ERROR){
  6.                 $consulta = "SELECT *
  7.                             FROM `Usuarios`
  8.                             WHERE `nombre` = '$usuario' AND `clave` = '$clave'";
  9.                 $resultado = $mysql->query($consulta);
  10.                 if ($resultado->num_rows > 0){
  11.                     session_destroy();
  12.                     //A quitar luego...
  13.                     error_reporting(E_ALL);
  14.                     ini_set('display_errors', '1');
  15.                     //...hasta aquí.
  16.                     session_start();
  17.                     $_SESSION['usuario'] = $usuario;
  18.                     $this->escribir_acceso($this::USUARIO_REGISTRADO);
  19.                     $resultado->free();
  20.                 }else{
  21.                     $this->terminar_sesion();
  22.                 }
  23.             }else{
  24.                 session_destroy();
  25.                 //A quitar luego...
  26.                 error_reporting(E_ALL);
  27.                 ini_set('display_errors', '1');
  28.                 //...hasta aquí.
  29.                 session_start();
  30.                 $_SESSION['usuario'] = 'ERR'.$mysql->connect_errno;
  31.                 $this->escribir_acceso($this::USUARIO_ANONIMO);
  32.                 echo $mysql->connect_error;
  33.                 echo "<br />";
  34.             }
  35.             $mysql->close();
  36.         }else{
  37.             $this->terminar_sesion();
  38.         }
  39.     }
  40.     public function terminar_sesion(){
  41.         session_destroy();
  42.         session_start();
  43.         //A quitar luego...
  44.         error_reporting(E_ALL);
  45.         ini_set('display_errors', '1');
  46.         //...hasta aquí.
  47.         $_SESSION['usuario'] = 'Anónimo';
  48.         $this->escribir_acceso($this::USUARIO_ANONIMO);
  49.     }

Pero como puedes verse, no hay ninguna impresión, nada. El método escribir acceso es sólo una asignación del parámetro del método a un atributo de la clase. Nada más.

¿Y si se llama a estos métodos en un contexto en el que se imprime algún ASCII antes de llamar a session_start()?

La respuesta es "no".

Código PHP:
Ver original
  1. <?php
  2. //Inicio de sesión.
  3. ini_set('display_errors', '1');
  4. //Ficheros requeridos.
  5. require_once 'Web.php';
  6. require_once 'usuario.php';
  7. //Creación de la clase Biblioteca.
  8. class Recepcion extends Web{
  9.     ....
  10. }
  11.  
  12. /**
  13.  * Descripción: Página de inicio de sesión.
  14.  * IDE:         Realizado con NetBeans 7.2.1.
  15.  */    
  16.  
  17. define ('AUTOR', 'Francisco José Torres Gimeno');
  18. define ('FECHA_CREACION', 'Domingo, 26 de mayo de 2013');
  19. define ('FECHA_MODIFICACION', 'Domingo, 21 de julio de 2013');
  20. define ('HAY_ENLACE_AL_INICIO', TRUE);
  21. define ('SUBTITULO', 'Página en construcción');
  22. define ('TITULO', 'Recepción particular de <br /> Fco. J. Torres Gimeno');
  23. define ('VERSION', 'Alpha 1.0.3');
  24.  
  25. //Creación de la página.
  26. $web = new Recepcion(AUTOR,
  27.                      FECHA_CREACION,
  28.                      FECHA_MODIFICACION,
  29.                      VERSION);
  30. //Ejecución de las acciones del formulario que remitió a esta página.
  31. //Sólo se da uno de los casos.
  32. if(isset($_POST['recuperar_clave'])){
  33.     $web->enviar_clave();
  34. }
  35. if(isset($_POST['iniciar_sesion'])){
  36.     $web->iniciar_sesion(); //NO SE HA COMENZADO EL CÓDIGO HTML
  37. }
  38. if(isset($_POST['accion'])){
  39.     if($_POST['accion']=='finalizar_sesion'){
  40.         $web->terminar_sesion(); //NO SE HA COMENZADO EL CÓDIGO HTML
  41.     }
  42. }
  43. if(isset($_POST['registrar_usuario'])){
  44.     $web->registrar_usuario();
  45. }
  46. //Escritura de la página.
  47. $web->escribir_doctype();
  48. $web->iniciar_html();
  49.     $web->escribir_head();
  50.     $web->iniciar_body();
  51.         $web->escribir_capa_superpuesta();
  52.         $web->iniciar_contenedor();
  53.             $web->iniciar_encabezamiento();
  54.                 $web->escribir_menu_superior();
  55.                 $web->escribir_submenu_superior();
  56.                 $web->escribir_mensaje_de_informacion('');
  57.                 $web->escribir_mensaje_de_aviso('');
  58.                 $web->escribir_mensaje_de_exito('');
  59.                 $web->escribir_mensaje_de_error('');
  60.             $web->finalizar_encabezamiento();
  61.             $web->iniciar_columna_central();
  62.                 $web->iniciar_columna_izquierda();
  63.                     $web->titular_columna_izquierda(TITULO, SUBTITULO);
  64.                     $web->escribir_columna_izquierda();
  65.                     $web->indexar_inicio(HAY_ENLACE_AL_INICIO);
  66.                 $web->finalizar_columna_izquierda();
  67.                 $web->iniciar_columna_derecha();
  68.                     $web->escribir_columna_derecha_introduccion();
  69.                     if(isset($_POST['accion'])){
  70.                         if($_POST['accion']=='iniciar_sesion'){
  71.                             $web->escribir_columna_derecha_inicio_sesion();
  72.                         }elseif($_POST['accion']=='recuperar_clave'){
  73.                             $web->escribir_columna_derecha_recuperacion_clave();
  74.                         }elseif($_POST['accion']=='registrar_usuario'){
  75.                             $web->escribir_columna_derecha_registro_usuario();
  76.                         }else{
  77.                             //Nada.
  78.                         }
  79.                     }else{
  80.                         //Nada.
  81.                     }
  82.                     echo $web->leer_mensaje();
  83.                 $web->finalizar_columna_derecha();
  84.             $web->finalizar_columna_central();
  85.         $web->finalizar_contenedor();
  86.     $web->finalizar_body();
  87.  $web->finalizar_html();
  88. ?>
  #26 (permalink)  
Antiguo 21/07/2013, 17:31
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Pérdida de la sesión (II)

HAZ esto: en cada pagina que abres... pon en tu Navegador: "Ver codigo fuente" y examina si antes del error no hay otra cosa por ahi oculta (otro error de pronto)
__________________
Salu2!
  #27 (permalink)  
Antiguo 21/07/2013, 17:33
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

No soy perfecto y es posible que se me haya colado un espacio, pero he revisado cada uno de los ficheros varias veces y no encuentro ningún espacio en blanco, nada... como no sea el comentario. Tal vez sea una tontería, como casi siempre ocurre, pero no hay forma de encontrarla.
  #28 (permalink)  
Antiguo 21/07/2013, 17:36
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Pérdida de la sesión (II)

Copia y pega (ahora si) cada uno de los archivos sospechosos a http://pastebin.com/ o similar y vemos de ahi
__________________
Salu2!
  #29 (permalink)  
Antiguo 21/07/2013, 17:37
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Entre el inicio del código fuente HTML y el DOCTYPE no hay nada, salvo los mensajes de error debidos al test de este problema.
  #30 (permalink)  
Antiguo 21/07/2013, 17:38
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Pérdida de la sesión (II)

Ok. Voy a ver en pastebin.

Etiquetas: perdida, sesión
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 14:25.