Foros del Web » Programando para Internet » PHP »

Problemas con $_SESSION y header "Location"

Estas en el tema de Problemas con $_SESSION y header "Location" en el foro de PHP en Foros del Web. Hola. Estoy haciendo un proyecto simple con php y mysql y hasta ahora todo iba bien en xamp pero al subirlo al servirdor empiezan los ...
  #1 (permalink)  
Antiguo 16/09/2015, 12:54
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Problemas con $_SESSION y header "Location"

Hola.

Estoy haciendo un proyecto simple con php y mysql y hasta ahora todo iba bien en xamp pero al subirlo al servirdor empiezan los problemas.

En varios casos no me hace la redirección con header e incluso en otros tampoco me reconoce las sesiones, así que voy a ir probando desde lo mas básico.

En este ejemplo aparte que solo tiene el siguiente código¿por qué tampoco redirecciona?.

Código PHP:
Ver original
  1. <?php
  2. $_SESSION['usuario'] = "Prueba";
  3. $sesion = $_SESSION['usuario'];
  4. echo "La sesión se llama: " .$sesion;
  5. if(isset($_SESSION['usuario'])){   
  6.     if($_SESSION['usuario'] == "Prueba"){
  7.     //echo "Sí existe prueba y redirijo";  
  8.     header("Location: http://google.es/");
  9.     }
  10.     else{
  11.         echo "Sería otra sesión";
  12.     }
  13. }
  14. else{
  15.     echo "Ninguna sesión.";
  16. }
  17. ?>

Estoy haciendo las típicas pruebas de registro, iniciar sesión con su correspondiente redirección o avisos pero como digo no logro resolverlo ni en el anterior ejemplo.

¿Qué estoy haciendo mal?. Gracias un saludo.
  #2 (permalink)  
Antiguo 16/09/2015, 13:04
 
Fecha de Ingreso: julio-2011
Mensajes: 220
Antigüedad: 12 años, 9 meses
Puntos: 72
Respuesta: Problemas con $_SESSION y header "Location"

La función header debe usarse siempre antes de mostrar nada con echo, de no ser así header no funcionará, mira el manual.

http://php.net/manual/es/function.header.php
  #3 (permalink)  
Antiguo 16/09/2015, 17:20
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: Problemas con $_SESSION y header "Location"

El echo alli no tiene practicamente ninguna utilidad porque la redireccion es inmediata al realizarse la comprobacion asi que lo puedes eliminar, en cuanto al header prueba cobn comillas simples, algo asi:


echo innecesario:
Código PHP:
Ver original
  1. echo "La sesión se llama: " .$sesion;


header con comillas simples, a mi me funciona asi sin problemas, claro sin ningún echo antes de el
Código PHP:
Ver original
  1. header('Location: http://google.es/');
__________________
[email protected]
HITCEL
  #4 (permalink)  
Antiguo 21/09/2015, 11:59
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Problemas con $_SESSION y header "Location"

Cita:
Iniciado por lubtufano Ver Mensaje
La función header debe usarse siempre antes de mostrar nada con echo, de no ser así header no funcionará, mira el manual.

http://php.net/manual/es/function.header.php
Cita:
Iniciado por xfxstudios Ver Mensaje
El echo alli no tiene practicamente ninguna utilidad porque la redireccion es inmediata al realizarse la comprobacion asi que lo puedes eliminar, en cuanto al header prueba cobn comillas simples, algo asi:


echo innecesario:
Código PHP:
Ver original
  1. echo "La sesión se llama: " .$sesion;


header con comillas simples, a mi me funciona asi sin problemas, claro sin ningún echo antes de el
Código PHP:
Ver original
  1. header('Location: http://google.es/');
Hola de nuevo.

La verdad es que lo del html etc etc lo sabía pero no me había planteado el tema de los "echo" incluso aun siendo como ejemplo ya que en algunos casos los suelo poner para ver si hace la ejecución correcta. Ahora he borrado todos estos y despúes de ver otros fallos la mayoría me funciona correctamente, sin embargo hay algunos que no puedo ya que los tengo dentro de includes. Por ejemplo algo así en el archivo "usuarios.php".

Código HTML:
Ver original
  1. <article>  
  2.             <h2>Preferencias del usuario</h2>      
  3.            
  4.             <?php
  5.  
  6.             if(isset($_GET['source'])){
  7.                 $source = $_GET['source'];
  8.             }
  9.             else{
  10.                 $source = "";
  11.             }
  12.  
  13.             switch ($source) {             
  14.                 case 'editar_usuario':
  15.                 include "inc/editar_usuario.php";
  16.                 break;
  17.                 default:
  18.                 include "inc/usuario.php";
  19.                 break;
  20.             }
  21. ?>

Y donde tengo la redirección es en "inc/editar_usuario.php" pero claro ahora tengo que cambiarla de ruta o buscar otra manera que no sea esa meta que acabo de incluir por el momento:

Código PHP:
Ver original
  1. <?php
  2. if($editar_usuario_query = mysqli_query($conexion, $query)){                                       
  3.                 //echo "Editado correctamente, redirijo";
  4.                 echo "<meta http-equiv='Refresh' content='0;URL=\"http://.../jose_c//jose_c/usuarios.php?id=$id_usuario\"'>";  
  5.                 //header("Location:http://.../jose_c/usuarios.php?id=$id_usuario");
  6.                
  7.             }
  8.             else {
  9.                 //header("Location: http://.../jose_c/usuarios.php?id=$id_usuario");
  10.                 echo "Error de edición". confirmarConsulta($edit_user_query);
  11.             }
  12. ?>

¿Alguna otra recomendación? Gracias a ambos por la ayuda.
  #5 (permalink)  
Antiguo 24/09/2015, 02:39
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Problemas con $_SESSION y header "Location"

Hola de nuevo.

Por ahora he probado con dos nuevas opciones con el archivo "inc/editar_usuario.php".

- En la primera opción la dirección del formulario hacía "confirmar-editar-usuario.php" y a la vez incluyendo un campo oculto que recoja y envie el valor del id_usuario:

Código HTML:
Ver original
  1. <form method="post" action="inc/confirmar-editar-usuario.php" enctype="multipart/form-data" class="form">
  2.  
  3. <input type="hidden" name="id_usuario" value="<?php echo $id_usuario;?>" />

Luego en el archivo "confirmar-editar-usuario.php" recojo todos los campos, hago la actualización y ya si es correcta hace la redirección:

Código PHP:
Ver original
  1. if($editar_usuario_query = mysqli_query($conexion, $query)){                                       
  2.                 header("Location: http://---.com/jose_c/usuarios.php?id=$id_usuario");
  3.                
  4.             }
  5.             else {             
  6.                 echo "Error de edición". confirmarConsulta($editar_usuario_query);
  7.             }

Quedaría entonces así:

usuarios.php

Código PHP:
Ver original
  1. <article>  
  2.                 <h2>Preferencias del usuario</h2>      
  3.                
  4.                 <?php
  5.      
  6.                 if(isset($_GET['source'])){
  7.                     $source = $_GET['source'];
  8.                 }
  9.                 else{
  10.                     $source = "";
  11.                 }
  12.      
  13.                 switch ($source) {              
  14.                     case 'editar_usuario':
  15.                     include "inc/editar_usuario.php";
  16.                     break;
  17.                     default:
  18.                     include "inc/usuario.php";
  19.                     break;
  20.                 }
  21.     ?>
  22.     </article>

inc/editar_usuario.php

Código HTML:
Ver original
  1. <form method="post" action="inc/confirmar-editar-usuario.php" enctype="multipart/form-data" class="form">
  2.  
  3. <input type="hidden" name="id_usuario" value="<?php echo $id_usuario;?>" />

inc/confirmar-editar-usuario.php

Código PHP:
Ver original
  1. if($editar_usuario_query = mysqli_query($conexion, $query)){                                       
  2.                 header("Location: http://---.com/jose_c/usuarios.php?id=$id_usuario");
  3.                
  4.             }
  5.             else {             
  6.                 echo "Error de edición". confirmarConsulta($editar_usuario_query);
  7.             }


- En la segunda opción que se me ocurre sería con variables en la url a traves de $_GET y que al enviar el formulario coja la siguiente ruta en el mismo archivo (en este caso "inc/editar_usuario_opcion_get.php") y que a la vez edite y luego haga la redirección, por ejemplo algo así:

Código HTML:
Ver original
  1. <form method="post" action="inc/editar_usuario_opcion_get.php?c_editar=1&id=<?php echo $id_usuario; ?>" enctype="multipart/form-data" class="form">

Código PHP:
Ver original
  1. // ----- Si existe c_editar por la url ----- //
  2. if(isset($_GET['c_editar'])){
  3.     $c_editar = $_GET['c_editar'];
  4.     $c_editar = mysqli_real_escape_string($conexion, $c_editar);
  5.    
  6.    
  7.     $id = $_GET['id']; 
  8.     $id = mysqli_real_escape_string($conexion, $id);
  9.     //Aquí hago la edición
  10.     //Fin aquí hago la edición
  11.     //Redirijo
  12.     header("Location: http://...com/jose_c/usuarios_get.php?id=$id");  
  13. }
  14. // ----- Fin Si existe c_editar por la url ----- //

Y ahora también sale perfectamente.

Quedaría entonces algo como esto:

usuarios_get.php

Código PHP:
Ver original
  1. <article>  
  2.                 <h2>Preferencias del usuario</h2>      
  3.                
  4.                 <?php
  5.      
  6.                 if(isset($_GET['source'])){
  7.                     $source = $_GET['source'];
  8.                 }
  9.                 else{
  10.                     $source = "";
  11.                 }
  12.      
  13.                 switch ($source) {              
  14.                     case 'editar_usuario':
  15.                     include "inc/editar_usuario_opcion_get.php";
  16.                     break;
  17.                     default:
  18.                     include "inc/usuario.php";
  19.                     break;
  20.                 }
  21.     ?>
  22.     </article>

inc/editar_usuario_opcion_get.php

Código HTML:
Ver original
  1. <form method="post" action="inc/editar_usuario_opcion_get.php?c_editar=1&id=<?php echo $id_usuario; ?>" enctype="multipart/form-data" class="form">

Código PHP:
Ver original
  1. // ----- Si existe c_editar por la url ----- //
  2. if(isset($_GET['c_editar'])){
  3.     $c_editar = $_GET['c_editar'];
  4.     $c_editar = mysqli_real_escape_string($conexion, $c_editar);
  5.    
  6.    
  7.     $id = $_GET['id']; 
  8.     $id = mysqli_real_escape_string($conexion, $id);
  9.     //Aquí hago la edición
  10.     //Fin aquí hago la edición
  11.     //Redirijo
  12.     header("Location: http://...com/jose_c/usuarios_get.php?id=$id");  
  13. }
  14. // ----- Fin Si existe c_editar por la url ----- //

¿Cual de las dos maneras sería la mejor? o incluso ¿qué otra opción podría tener en cuenta?

Gracias de nuevo, saludos.

Etiquetas: header, mysql, registro, session
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 16:02.