2010-06-11 13 views
8

Cuando uso la redirección de encabezado php todas las variables de sesión se pierden ... Algunas personas dicen que al agregar exit(); justo después del encabezado (""); resolverá el problema pero no parece ser la solución ...Perdida de sesión después de la redirección de página en php

¿Alguien puede ayudarnos?

Aquí es cómo puedo almacenar variables en la sesión:

include 'dbc.php'; 

$err = array(); 

foreach($_GET as $key => $value) { 
    $get[$key] = filter($value); //get variables are filtered. 
} 

if ($_POST['doLogin']=='Login') 
{ 

foreach($_POST as $key => $value) { 
    $data[$key] = filter($value); // post variables are filtered 
} 


$user_email = $data['usr_email']; 
$pass = $data['pwd']; 


if (strpos($user_email,'@') === false) { 
    $user_cond = "user_name='$user_email'"; 
} else { 
     $user_cond = "user_email='$user_email'"; 

} 


$result = mysql_query("SELECT `id`,`pwd`,`full_name`,`approved`,`user_level` FROM users WHERE 
      $user_cond 
      AND `banned` = '0' 
      ") or die (mysql_error()); 
$num = mysql_num_rows($result); 

    // Match row found with more than 1 results - the user is authenticated. 
    if ($num > 0) { 

    list($id,$pwd,$full_name,$approved,$user_level) = mysql_fetch_row($result); 

    if(!$approved) { 
    //$msg = urlencode("Account not activated. Please check your email for activation code"); 
    $err[] = "Account not activated. Please check your email for activation code"; 

    //header("Location: login.php?msg=$msg"); 
    //exit(); 
    } 

     //check against salt 
    if ($pwd === PwdHash($pass,substr($pwd,0,9))) { 
    // this sets session and logs user in 
     session_start(); 
     session_regenerate_id (true); //prevent against session fixation attacks. 

     // this sets variables in the session 
     $_SESSION['user_id']= $id; 
     $_SESSION['user_name'] = $full_name; 
     $_SESSION['user_level'] = $user_level; 
     $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); 

     //update the timestamp and key for cookie 
     $stamp = time(); 
     $ckey = GenKey(); 
     mysql_query("update users set `ctime`='$stamp', `ckey` = '$ckey' where id='$id'") or die(mysql_error()); 

     //set a cookie 

     if(isset($_POST['remember'])){ 
        setcookie("user_id", $_SESSION['user_id'], time()+60*60*24*COOKIE_TIME_OUT, "/"); 
        setcookie("user_key", sha1($ckey), time()+60*60*24*COOKIE_TIME_OUT, "/"); 
        setcookie("user_name",$_SESSION['user_name'], time()+60*60*24*COOKIE_TIME_OUT, "/"); 
        } 
     if(empty($err)){    
      header("Location: myaccount.php"); 
     } 
     } 
     else 
     { 
     //$msg = urlencode("Invalid Login. Please try again with correct user email and password. "); 
     $err[] = "Invalid Login. Please try again with correct user email and password."; 
     //header("Location: login.php?msg=$msg"); 
     } 
    } else { 
     $err[] = "Error - Invalid login. No such user exists"; 
     }  
} 

código de redirección:

//connect database 
    require_once 'dbc.php'; 

    page_protect(); 

    $authorID = $_SESSION['user_id']; 
    if (!empty($_POST["answ_content"]) && $authorID != 0) { 
      //vaqciot html chveulebriv texad 
      $content = htmlentities($_POST["answ_content"],ENT_COMPAT,'UTF-8'); 
      $dro = date('Y-m-d H:i:s'); 
      $qID = $_POST["question_ID"]; 
      $author = $_SESSION["user_name"]; 


      $sql="INSERT INTO wp_comments (comment_ID, comment_post_ID, comment_author, comment_author_IP, comment_date, comment_content, user_id) 
       VALUES 
       (NULL, '$qID', '$author', '123.123.123.123', '$dro', '$content', '$authorID')"; 

      $result = mysql_query($sql); 

      //pasuxebis raodenobis ertit gazrda 
      $increase = "UPDATE wp_posts SET comment_count = comment_count+1 WHERE ID = $qID"; 
      mysql_query($increase); 

      //gadamisamarteba shekitxvis gverdze 
      $url = 'Location:http://example.com/site/answ/question.php?ID=' .$qID; 
      header($url); 
    } else { 
     echo 'error'; 
    } 
+0

Por favor, muestre algunos códigos y algunas direcciones de ejemplo que está redireccionando. –

+2

¿nos puede mostrar algún código? ¿Están habilitadas las cookies en la pc de los usuarios? ¿Usas cookies para tus sesiones o siempre envías el ID de sesión como parámetro de obtención y lo olvidas en tu redirección? – oezi

+0

Agregué todos los códigos necesarios ... –

Respuesta

11

Es necesario poner exit(); después de su cambio de dirección de encabezado, de lo contrario se acaba de cargar dos páginas de contenido en 1 página.

También asegúrese de tener session_start(); en la parte superior de todos sus scripts.

+0

Agregué exit(); pero no funcionó! Lamentablemente tengo que usar la redirección debido a la estructura del sitio ... –

+4

¿por qué marcó la respuesta como aceptada ...? ¡No arregló la mía! – Eliethesaiyan

+1

La clave aquí es session_start(); en la parte superior de todas sus páginas – Lizard

4

No está iniciando la sesión. Para utilizar variables de sesión y hacer que llevar a través de las páginas, que necesita para poner

session_start(); 

en la parte superior de cada página antes de cualquier otra cosa.

1

Simples! asegúrese de que la página de la que proviene (por ejemplo, www.example.com) redirija a un aviso (por ej., www.example.com/redirect.php) www al principio. Si cambias eso de página a página, entonces sí las cosas se ponen feas.

+0

El mismo problema, los redireccionamientos de encabezados cambiaban de página a página y lo cambié al esquema común utilizado en todo el proyecto y voila, funcionó ... me jodió el culo durante al menos una semana. .. gracias hombre, eres un salvador ... – coder101

0

Estas sesiones no siempre funcionan como esperamos a veces. Tuve un problema similar con mi sitio web al usar sesiones que se pierden. Básicamente lo resolví inyectando el valor que quiero mantener en la sesión en el campo de texto oculto la primera vez que carga la página. Luego, la segunda vez que llamo a la página (envío de página) simplemente leo el valor del campo de texto oculto y continúo con el resto de mi código.

¡Es más fácil y más limpio que usar sesiones en este caso!

+3

También es muy inseguro. Algunos datos de sesión solo son relevantes para el servidor y no deberían exponerse al cliente. – konqi

+1

De acuerdo con JoSo, las sesiones son más limpias que un viewstate y los datos de sesión no se consideran datos de viewstate ... –

+0

¿qué quiere decir con textfield oculto ...? Textfied que no se puede comprobar mirando su código fuente html? – Eliethesaiyan

2

yo estaba tratando de establecer el identificador de sesión de mi propia usando:

session_id('own_generated_session_id_string'); 

Pero como el documentation dice, usted tiene que utilizar esto antes

session_start(); 

usar más cuando session_start(), borra los parámetros de la sesión.

0

salida; debe colocarse después de la redirección del encabezado o session_regenerate_id (true); se puede usar

Cuestiones relacionadas