2010-07-05 61 views
5

Necesito destruir una sesión cuando el usuario se va de una página en particular. Uso session_destroy() al final de la página, pero no es factible porque mi página tiene paginación. Mi página es: abc.php?page=1 o abc.php?page=2 o abc.php?page=3.Destruir la sesión de PHP en la página, dejando

Por lo tanto, necesito destruir una sesión cuando un usuario abandona la página abc.php. ¿Cómo puedo hacerlo sin usar una cookie?

+4

posible duplicado de [Cerrar/cerrar la sesión cuando el navegador o la pestaña están cerrados] (http://stackoverflow.com/questions/1921941/close-kill-the-session-when-the-browser-or-tab -is-closed) – Quentin

+0

thx bro.but es una solución asp. no obtengo nada de ella .... ¿Cómo puedo mantener viva mi sesión hasta que un usuario visite mi página abc.php.when el usuario abandone abc.php entonces simplemente destruye la sesión. – riad

+0

En realidad, la primera respuesta en el hilo vinculado es la correcta, y para nada específica de ASP. – deceze

Respuesta

18

Hacer algo cuando el usuario navega fuera de una página es el enfoque incorrecto porque no sabe si el usuario navegará a una página completamente diferente (digamos contact.php por el bien del argumento) o él/ella simplemente irá a la página siguiente de abc.php y, como señaló Borealid, no puede hacerlo sin JS. En su lugar, simplemente puede añadir una comprobación para ver si el usuario llega de abc.php:

En primer lugar, en su archivo abc.php establecer una variable única en el array $ _SESSION que actuará como un signo de que el usuario ha sido en esta página:

$_SESSION['previous'] = basename($_SERVER['PHP_SELF']); 

a continuación, añadir esto en todas las páginas, antes de cualquier salida para comprobar si el usuario está viniendo de abc.php:

if (isset($_SESSION['previous'])) { 
    if (basename($_SERVER['PHP_SELF']) != $_SESSION['previous']) { 
     session_destroy(); 
     ### or alternatively, you can use this for specific variables: 
     ### unset($_SESSION['varname']); 
    } 
} 

de esta manera se destruirá la sesión (o variables específicas) solo si el usuario está viniendo de abc.php y la página actual es diferente.

Espero haber sido capaz de explicar esto claramente.

+0

Thx bro trabaja ... pero tienen un problema. si no vengo de la página abc.php la sesión almacena datos diferentes ... de todos modos muchas gracias por su solución ... – riad

+0

Si hay datos que le gustaría mantener en la matriz de sesiones, entonces en lugar de destruirlos por completo , simplemente puede desarmar las variables que se establecieron en abc.php usando 'unset ($ _ SESSION ['varname']);' en lugar de 'session_destroy()', como señaló Karthik. –

+0

No es muy fácil de usar.¿Qué sucede si abro otra página en una pestaña diferente, pero aún quiero seguir usando 'abc.php' al mismo tiempo? – deceze

0

Para una página en particular que necesita para destruir la sesión, a continuación, desactivar la variable de toda la sesión usando

unset($_SESSION['varname']);

para todo el sitio puede utilizar session_destroy();

+0

no hermano. si desarmo o destruyo la variable al final de la página, entonces no puedo obtener el valor en mi segunda o tercera página abc.php? page = 2 o 3. Así que tengo que usar la sesión hasta que un usuario deje mi abc.php página. ¿Cómo puedo hacerlo? – riad

4

Para disparar cuando el usuario realmente deja la página, debe usar Javascript para enviar una solicitud asincrónica al servidor. No hay forma de que el servidor sepa mágicamente que el usuario "dejó" una página.

Ver http://hideit.siteexperts.com/forums/viewConverse.asp?d_id=20684&Sort=0.

+0

Gracias, hermano, por sus preguntas ... pero mi página es para usuarios de dispositivos móviles, así que no puedo usar el javascript ... ¿se puede solucionar solo con php? – riad

0

Resolvo el problema. Primero tome la url actual y luego la página permanezca en la url actual. Si la página no está en la url actual, entonces destruya la sesión.

$url = "http" . ((!empty($_SERVER['HTTPS'])) ? "s" : "") . "://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; 
$page_name="abc.php";  
if (!preg_match("/$page_name/",$url)) 
{ 
    session_destroy(); 
} 

Pero este código se debe utilizar en otra pages.Because HTTP es un proceso sin estado así que no hay manera de saber cuando un usuario abandona la página.

+0

En realidad, solo podría usar '$ _SERVER ['REQUEST_URI']' porque allí es donde estaría el nombre del archivo. Si tiene un solo archivo header.php para todas las páginas (ya que es una práctica común), puede simplemente usar mi solución, en lugar de agregar su código en todas las páginas * EXCEPTO * abc.php. –

+1

No tiene sentido usar ese código si no vas a ponerlo en 'abc.php'. No sé qué tiene que ver eso con que http sea apátrida. Y todavía tienes el mismo problema que la respuesta de FreekOne con la destrucción de datos de la sesión, incluso cuando no estás dejando 'abc.php'. –

0

No se puede saber cuándo un usuario navega desde la página, simplemente no es posible de manera confiable.

Lo mejor que puedes hacer es explotar cómo funcionan las cookies. Al iniciar una sesión, está enviando una cookie al cliente que identifica al cliente en cada visita posterior y, por lo tanto, activa la sesión asociada. Depende del cliente enviar esta identificación en visitas posteriores, y le corresponde al cliente "olvidar" su identificación.

Puede indicar al cliente que solo envíe la cookie para determinadas páginas, y puede indicarle que olvide la cookie al cerrar el navegador (con una vida útil de 0). Esto se puede configurar usando session_set_cookie_params.

Aparte de eso, simplemente puede ignorar los parámetros de la sesión en las páginas donde no importan. Puede eliminar la sesión (o ciertos valores de la misma) después de algún tiempo de inactividad cuando asume que el cliente ha dejado.

+0

Esto está llegando a donde me gustaría ir. Pregunta: ¿cómo eliminaría la sesión después de un tiempo de inactividad? De forma similar al enfoque anterior con el que un usuario navega _desde_, pero ahora usa una marca de tiempo? Me gusta: la marca de tiempo en $ _SESSION [] tiene 10 minutos de antigüedad, ¿está expirada? – Jens

0

Borealid merece crédito por señalar a la solución más elegante.

Una solución más kludgey es mantener un iframe en la página que apunta a otra página de "monitor" que está configurada para actualizarse cada pocos segundos. Esto se puede hacer sin JavaScript usando:

<meta http-equiv="refresh" content="10"> 

Esto actualiza la página del monitor cada 10 segundos. Cuando esto sucede, la página del monitor puede registrar el tiempo (sobreescribiendo el tiempo previamente grabado) y la identificación de la sesión en el servidor en alguna parte (DB o archivo).

Luego tendría que crear un cronjob que compruebe el archivo/base de datos para cualquier sesión que tenga más de 10 ~ 12 segundos de antigüedad y eliminarlos manualmente. Los datos de la sesión generalmente se almacenan en un directorio (especificado por su configuración de PHP) en un archivo llamado sess_the-session-ID. Se podría utilizar una función de PHP como esto:

function delete_session($sessId) { 
    $sessionPath = session_save_path(); 
    // you'll want to change the directory separator if it's a windows server 
    $sessFile = "$sessionPath/sess_$sessId"; 
    if (file_exists($sessFile) && unlink($sessFile)) return true; 
    return false; 
} 
1

tuve un problema similar, pero la mía estaba en una recarga de la página que quería variables que me había impreso a ser destruido. Fue para mi inicio de sesión para mi clase de diseño web que estaba haciendo un error de retroalimentación para los usuarios que ingresaron un nombre de usuario o contraseña incorrectos. Pude obtener el error para mostrar pero si toco la página de actualización, los errores se quedarían allí. Descubrí que al simplemente configurar la variable a nada después de que se imprimiera, la mataría. Eche un vistazo a lo que hice:

<p>To access my website please Login:</p> 
<form name='login' action="./PHP_html/PHP/login.php" method='post'> 
Username: <input type='text' name='username' /><div><?php print $_SESSION['baduser']; $_SESSION['baduser'] = "";?></div><br /> 
<div style="padding-left: 4px">Password: <input type='password' name='password' /><div><?php print $_SESSION['badpass']; $_SESSION['badpass'] = "";?></div></div> 
<input type='submit' value='Login' /> or you can <a href="./Terms.php">Register</a> 

No sé si esto ayuda en lo absoluto, pero a mí me funcionó.

Además, gracias a todos los que publican en sitios como este para ayudar a aquellos de nosotros que aún estamos aprendiendo.

Cuestiones relacionadas