2009-06-22 20 views
6

Hay un formulario en mi sitio que se usa para invitar amigos. Es un campo de texto simple y un botón de enviar. Si hay un error, vuelvo a dirigirme a esta página y visualizo un mensaje de error si se trata de una variable de sesión establecida.Problema al desarmar una variable de sesión

if (isset($_SESSION['invite_error'])) { 
    echo $_SESSION['invite_error']; 
    unset($_SESSION['invite_error']); 
} 

Sin embargo, si navego fuera de esta página y vuelvo, el mensaje de error todavía se está mostrando. Si me alejo y vuelvo una vez más, se hará. Es lo mismo cuando actualizo esa página ... 1 actualización no se librará de ella, pero 2 lo hará. No puedo destruir toda la sesión, solo quiero desarmar esta variable. La versión de PHP es 5.2.5 compilación 6, el registro global está desactivado, estoy llamando a session_start() en la parte superior de esta página, también he intentado usar un encabezado sin caché.

Editar: Agregado el código completo.

<?php 
ob_start(); 
session_start(); 

$user_id = $_SESSION['user_id']; 
$user_name = $_SESSION['user_name']; 

if ($user_id==null) header("Location: /login.php"); 

if (isset($_SESSION['invite_errors'])) { 

    $error = $_SESSION['invite_errors']; 
    unset($_SESSION['invite_errors']); 

} 

require_once("ui/header.php"); 
?> 



<div id="invite" class="content"> 

    <?php if($error) { ?> 
     <div class="errors round"> 
      <?php echo $error ?> 
     </div> 
    <?php } ?> 

    <h3>Invite Your Friends</h3> 

    <div class="invite-form"> 
     <form method="post" action="controllers/invite.php"> 
      <div class="row"> 
       <textarea class="txt-area" name="emails" id="emails" rows="5"></textarea> 
       <div class="tip">Separate multiple email addresses with ,</div> 
      </div> 
      <div class="row-submit"> 
       <input type="submit" name="submit" id="submit" class="submit-btn" value="Submit" /> 
      </div> 
     </form> 
    </div> 

</div> 

<?php 
    require_once("ui/footer.php"); 
?> 
+0

unset ($ _ SESSION ['invite_error']; => unset right) no está allí. Supongo que es un problema de copiar y pegar. – Macarse

+0

¿Está utilizando AJAX en cualquier lugar de las solicitudes? –

+0

¿Podría estar el error en otra variable, que se está configurando antes de desarmar la var $ _SESSION? – alex

Respuesta

2

El ejemplo que proporcionó debería funcionar. Quizás algún tipo de caché de sesión se interponga en tu camino. Usted podría tratar de modificar el código de la siguiente manera:

if (isset($_SESSION['invite_errors']) && $_SESSION['invite_errors']) { 

    $error = $_SESSION['invite_errors']; 
    $_SESSION['invide_errors'] = false; 
    unset($_SESSION['invite_errors']); 

    // Explicitly write and close the session for good measure 
    session_write_close(); 

} 
1

Tal vez usted puede cambiar el valor después de echo'ing el error

if (isset($_SESSION['invite_error'])) { 
    echo $_SESSION['invite_error']; 
    $_SESSION['invite_error'] = null; 
    unset($_SESSION['invite_error']); 
} 
13

Iniciar la sesión antes de iniciar el búfer de salida. Por lo tanto, cambie las llamadas ob_start() y session_start().

Dado que las cookies de sesión se definen en los encabezados enviados al navegador, y los encabezados se envían al navegador cuando inicia el búfer, debe iniciar las sesiones antes del el búfer.

+0

Enviando los encabezados HTTP al navegador cuando ob_start() derrotaría el punto principal del buffering de salida, ¿por qué en el mundo diría que lo hace? Además, incluso si hiciera eso, no haría ninguna diferencia en este contexto. ¿Por qué un no sequitur basado en una declaración falsa obtiene tantos votos al alza? –

1

En mi experiencia, las sesiones de PHP no valen la pena usarlas y solo fueron diseñadas como una solución rápida y fácil. El comportamiento de $ _SESSION no siempre es obvio, pero el uso de sesiones en el sentido tradicional es casi inevitable. Emita sus propias cookies de id. De usuario y de token y almacene valores de sesión con estos, tal vez en una base de datos. Esto también tiene la ventaja de ser escalable en todos los servidores.

Cuestiones relacionadas