Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    $_SESSION e problema logout

    Ciao a tutti,
    premetto che so che questa potrebbe essere una discussione gia' affrontata diverse volte, tuttavia pur cercando non sono ancora riuscito a trovare la soluzione al problema.

    Per effettuare il logout ho il seguente script:

    Codice PHP:
    <?php
    session_start
    ();
    unset(
    $_SESSION);
    session_destroy();
    header("location: /index.php?msg=Logout avvenuto con successo");
    ?>
    Ho provato tutte le varianti, settando il time del cookie a -42000, con session_unset, ecc..., ma non funziona ugualmente, o meglio: Cliccando su logout, vengo reindirizzato alla pagina logout.php, contenente lo script sopra, il quale a sua volta reindirizza nuovamente alla home. A questo punto effettivamente mi trovo sloggato, ma cambiando sito e poi ritornandoci, eccomi di nuovo dentro. Cosa strana, con IE funziona tutto alla perfezione, con gli altri browser no.
    Qualcuno sa aiutarmi?
    Grazie anticipatamente.

  2. #2
    Prova a copiare questo:
    Codice PHP:
    session_unset();
         
    session_destroy();
         
    session_write_close();
         
    setcookie(session_name(),'',0,'/'); 
    Mi raccomando inseriscilo sotto session_start al posto di unset($_SESSION) e
    session_destroy() e dimmi se funziona.

  3. #3
    Grazie per la risposta,
    ho provato e purtroppo non funziona ancora, o meglio funziona ma come prima, ovvero esce correttamente, ma poi le variabili di sessione sono ancora memorizzate.
    Spiego piu' in dettaglio:
    Ho uno script di login in home, con action la stessa pagina. Quindi in home subito dopo aver aperto la sessione, controllo le variabili ricevute per $_POST e assegno diversi valori alla variabile $error, a seconda dei casi, che poi analizzo con uno switch. Solo se il login avviene correttamente, assegno dei valori alle variabili di $_SESSION. Ora per vedere dove puo esse il problema del logout, se le variabili di $_POST sono vuote, scrivo "Nessuna info", Se invece il login avviene correttamente, stampo "Login avvenuto con successso". Inoltre, tramite la funzione print_r, stampo il contenuto dell'array $_SESSION.

    Ora, quando giungo in home per la prima volta, a video stampa: Nessuna info. Array()

    Quindi ok, tutto corretto.

    Eseguo il login e stampa: Login avvenuto con successo Array(pieno, con tutti i valori)

    Eseguo il logout e di nuovo Nessuna info, Array()

    Se ritorno sulla home, invece, stampa: Nessuna info, ma Array(pieno, con tutti i valori)

    Quindi escludo che tornando sulla home le variabili di POST siano salvate e quindi esegua in automatico il login, perche' stamoa nessuna info. Semplicemente la sessione non viene distrutta... non riesco a venirne a capo.


    Questo il codice PHP all'inizio della home, se puo' servire

    Codice PHP:

    <?php

    session_start
    ();


    require 
    'config.php';
    require 
    'connect.php';


    $mail mysql_real_escape_string($_POST[email]);
    $pwd mysql_real_escape_string($_POST[pwd]);

    $error 'empty';

    if((
    $mail) && ($pwd == "")) {
    $error 'no_pwd';
    }

    elseif((
    $pwd) && ($mail == "")) {
    $error 'no_mail';
    }

    elseif((
    $mail) && ($pwd)) {

    $log_query "SELECT * FROM `users` WHERE `mail` = " "'" $mail "'";
    $log_data mysql_query($log_query$link);
    $n mysql_num_rows($log_data);

    if(
    $n == 0) {
    $error 'mail_err';
    }

    else {

    $data mysql_fetch_row($log_data);
    $uid $data[0];
    $status $data[1];
    $key $data[2];
    $user $data[4];
    $user_pwd $data[5];


    if(
    $status == 0) {
    $error 'no_act';
    }

    elseif(
    $status == 1) {

    $pwd md5($pwd);

    if((
    $user_pwd == $pwd)) {

    $error 'none';

    $_SESSION['key'] = $key;
    $_SESSION['mail'] = $mail;
    $_SESSION['pwd'] = $pwd;
    $_SESSION['user'] = $user;

    }

    else {

    $error 'pwd_err';

    }

    }

    }

    }



    require 
    'header.php';

    ?>

  4. #4
    Prova a sostituire la pagina con questa (fai un backup della pagina prima):
    Codice PHP:
    <?php

    session_start
    ();


    require 
    'config.php';
    require 
    'connect.php';


    $mail mysql_real_escape_string($_POST[email]);
    $pwd mysql_real_escape_string($_POST[pwd]);

    $error 'empty';

    if((
    $mail) && ($pwd == "")) {
    $error 'no_pwd';
    }

    elseif((
    $pwd) && ($mail == "")) {
    $error 'no_mail';
    }

    elseif((
    $mail) && ($pwd)) {

    $log_query "SELECT * FROM users WHERE email = $mail";//fai $_post con email ma poi cerchi mail nel database?
    $log_data mysql_query($log_query);//$link da dove lo prendevi scusa?(non c'e nella pagina, inoltre non devi specificare di nuovo la connessione al database se quella che ti serve è stata l'ultima che hai aperto)
    $n mysql_num_rows($log_data);

    if(
    $n == 0) {
    $error 'mail_err';
    }

    else {

    $data mysql_fetch_array($log_data);/*prendo i dati di tutti gli utenti con la email uguale a quella inserita
    il nome contenuto tra [] dipende dal nome campo contenuto nel database*/
    $uid $data['uid'];
    $status $data['status'];
    $key $data['key'];
    $user $data['user'];
    $user_pwd $data['user_pwd'];


    if(
    $status != 1) {//questo per prevenire errori del database, per esempio pari a 2(non capita ma quando capita...)
    $error 'no_act';
    }else{

    $pwd md5($pwd);//cambia in sha1 che è più sicuro

    if(($user_pwd == $pwd)) {

    $error 'none';

    $_SESSION['key'] = $key;
    $_SESSION['mail'] = $mail;
    $_SESSION['pwd'] = $pwd;
    $_SESSION['user'] = $user;

    }

    else {

    $error 'pwd_err';

    }

    }

    }

    }



    require 
    'header.php';

    ?>
    Se mi sono scappati errori di sintassi o ';', ecc tieni conto dell'ora in cui ti ho risposto.
    Ho cambiato qualche cosetta ma dovrebbe andare, se fà la stessa cosa posta anche le altre pagine che hai, magari il problema è lì.(non vedo la pagina del logout, se non funziona metti anche header)

  5. #5
    Ciao, grazie mille per l'interessamento.

    Allora, la variabile $link la prendo da i ile che includo all'inizio, comunque hai ragione, non serve. Per quanto riguarda la differenza tra mail ed email sta solo nel nome che ho dato all'input, ma i dati sono giusti.

    Il tuo codice, non capisco come mai, mi da errore "La mail inserita non corrisponde a nessun account", cioe' nessun record nel DB con quella mail.

    Ora ti scrivo il codice che usavo per intero, commentato, magari e' piu' chiaro

    Codice PHP:
    <?php

    session_start
    ();

    error_reporting(E_ALL);

    require 
    'config.php';
    require 
    'connect.php';

    $mail mysql_real_escape_string($_POST['email']);
    $pwd mysql_real_escape_string($_POST['pwd']);

    $error 'empty';  //nessun dato ricevuto da POST

    if(($mail) && ($pwd == "")) { // nessuna password inserita
    $error 'no_pwd';
    }

    elseif((
    $pwd) && ($mail == "")) { // nessuna mail inserita
    $error 'no_mail';
    }

    elseif((
    $mail) && ($pwd)) { // mail e pwd inserite, analizzo i possibili errori

    $log_query "SELECT * FROM `users` WHERE `mail` = " "'" $mail "'"// prelevo la mail
    $log_data mysql_query($log_query$link);
    $n mysql_num_rows($log_data); // conto i risultati

    if($n == 0) { // nessun risultato, mail errata
    $error 'mail_err';
    }

    else { 
    // altrimenti prelevo i dati restanti

    $data mysql_fetch_row($log_data);
    $uid $data[0];
    $status $data[1];
    $key $data[2];
    $user $data[4];
    $user_pwd $data[5];


    if(
    $status == 0) { // account non ancora attivato
    $error 'no_act';
    }

    elseif(
    $status == 1) { // altrimenti controllo la password

    $pwd md5($pwd);

    if((
    $user_pwd == $pwd)) { // se e' tutto corretto, creo le variabili di sessione

    $error 'none';

    $_SESSION['key'] = $key;
    $_SESSION['mail'] = $mail;
    $_SESSION['pwd'] = $pwd;
    $_SESSION['user'] = $user;

    }

    else { 
    // altrimenti la password e' errata

    $error 'pwd_err';

    }

    }

    }

    }



    require 
    'header.php';

    ?>
    Qui la parte della home in cui decido cosa mostrare in base alla sesisone
    Codice PHP:
    <?php


    if(!$_SESSION) {

    echo 
    '<form name="log_in" method="post" action="">';

    echo 
    '<input type="text" name="email" placeholder="Mail" class="form" />';

    echo 
    '<input type="password" name="pwd" placeholder="Password" class="form" />';

    echo 
    '<input type="submit" value="Accedi" class="log_button" />';

    echo 
    '</form>';

    }

    else {


    echo 
    '

    [url="logout.php"]Logout[/url]</p>'
    ;

    }


    switch(
    $error) {

    case 
    'none':

    echo 
    "Login avvenuto con successo.";

    break;


    case 
    'no_pwd':
    echo 
    "Inserisci la password.";
    break;

    case 
    'no_mail':
    echo 
    "Inserisci la mail.";
    break;

    case 
    'mail_err':
    echo 
    "La mail inserita non corrisponde a nessun account.";
    break;

    case 
    'no_act':
    echo 
    "Questo account non &egrave; stato ancora attivato.";
    break;

    case 
    'pwd_err':
    echo 
    "Password errata.";
    break;

    case 
    'empty':
    echo 
    "Nessuna info";
    break;

    }

    ?>
    header.php
    Codice PHP:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


    <html xmlns="http://www.w3.org/1999/xhtml">


    <head>
    <title>Threads</title>
    <link rel="stylesheet" type="text/css" href="css.css" />


    </head>

    <body>

    <div id="header">

    <div id="menu_cont">

    <div class="nav" style="width: 148px;">
    Logo
    </div>

    <div class="nav" style="width: 420px; padding-top: 8px;">
    <input type="text" class="search" /><div class="search_button">vai</div>
    </div>

    <div class="nav" style="padding-top: 10px; float: right">
    <div style="width: 140px;">

    <?php 

    if($_SESSION['key'] != "") {

    echo 
    '<div class="user_img"> [img][/img] </div><span class="user">[url="#"]' $_SESSION['user'] . '[/url]</span>';
    echo 
    '<div style="width: 0px height: 0px; border-top: solid 4px #444; border-left: solid 3px transparent; border-right: solid 3px transparent; margin-top: 14px; margin-left: 2px; float: left;"></div>';

    }

    else {

    echo 
    '<span class="user">[url="http://www.threads.altervista.org/versione/reg.php"]Registrati[/url]</span>';

    }

    ?>

    </div>
    </div>

    </div>

    </div>
    Grazie ancora

  6. #6
    Adesso mi funziona perfettamente. Copiando il tuo codice mi sono accorto che per il logout rimandi alla pagina 'logout.php'; la soluzione sarebbe questa(contenuto di logout.php):
    Codice PHP:
    <?php
         
    include 'connect.php';// o require come vuoi tu
         
    header("Refresh: 4; URL=../jackerbill/prova.php");//questo url fà riferimento alla cartella che ho usato
         
    session_unset();
         
    session_destroy();
         
    session_write_close();
         
    setcookie(session_name(),'',0,'/');
        
    ?>
    nel caso in cui non dovesse funzionare usa anche questo al posto della pagina che usi:
    Codice PHP:
    <?php

    session_start
    ();


    require 
    'config.php';
    require 
    'connect.php';


    $mail mysql_real_escape_string($_POST['email']);
    $pwd mysql_real_escape_string($_POST['pwd']);

    $error 'empty';

    if((
    $mail) && ($pwd == "")) {
    $error 'no_pwd';
    }

    elseif((
    $pwd) && ($mail == "")) {
    $error 'no_mail';
    }

    elseif((
    $mail) && ($pwd)) {

    $log_query "SELECT * FROM utenti WHERE email = "provajack@hotmail.it'";//fai $_post con email ma poi cerchi mail nel database?
    $log_data = mysql_query($log_query);//$link da dove lo prendevi scusa?(non c'
    e nella paginainoltre non devi specificare di nuovo la connessione al database se quella che ti serve è stata l'ultima che hai aperto)
    $n = mysql_num_rows($log_data);

    if($n == 0) {
    $error = '
    mail_err';
    }

    else {

    $data = mysql_fetch_array($log_data);/*prendo i dati di tutti gli utenti con la email uguale a quella inserita
    il nome contenuto tra [] dipende dal nome campo contenuto nel database*/
    $uid = $data['
    id'];
    //$status = $data['
    status'];
    $key = $data['
    key'];
    $user = $data['
    username'];
    $user_pwd = $data['
    password'];


    if($n != 1) {//questo per prevenire errori del database, per esempio pari a 2(non capita ma quando capita...)
    $error = '
    no_act';
    }else{

    $pwd = sha1($pwd);//ho i dati in sha1, non md5, per questo ho cambiato, ricambia se vuoi

    if(($user_pwd == $pwd)) {

    $error = '
    none';

    $_SESSION['
    key'] = $key;
    $_SESSION['
    mail'] = $mail;
    $_SESSION['
    pwd'] = $pwd;
    $_SESSION['
    username'] = $user;

    }

    else {

    $error = '
    pwd_err';

    }

    }

    }

    }



    require '
    header.php';
    Occhio che ho cambiato dei valori per farli coincidere con nomi e le tabelle che ho nel database, inoltre il campo status l'avevo levato perchè non ho una campo del genere, quindi avevo usato di nuovo $n(inutile usare la stessa variabile 2 volte, ma dovevo solo provare) per la conta...
    A me funziona perfettamente, non rimane nessuna sessione attiva e se premi indietro nel browser non rivedi i dati come succedeva a te.
    Fammi sapere!

  7. #7
    Grazie mille, ma si ripresenta lo stesso problema di prima
    Io credo che il codice funzioni, perche' se a te va bene e non ci sono errori visibili, l'unica cosa che mi viene da pensare e' che magari sull'host in cui sono (Altervista) magari ci siano delle impostazioni strane per cui ti memorizzano comunque le sessioni.
    Perche' se lo script non funzionasse, allora anche quando vengo reindirizzato alla home dovrei essere ancora loggato... ma comunque, non capisco perche' su IE funziona.

    È stranissimo, non e' possibile essere sloggati correttamente la prima volta e poi avere la sessione ancora memorizzata, non capisco come sia possibile.

  8. #8
    Aspetta c'è un errore nello script: un errore fra apici e virgolette...
    Codice PHP:
    <?php

    session_start
    ();


    require 
    'config.php';
    require 
    'connect.php';


    $mail mysql_real_escape_string($_POST['email']);
    $pwd mysql_real_escape_string($_POST['pwd']);

    $error 'empty';

    if((
    $mail) && ($pwd == "")) {
    $error 'no_pwd';
    }

    elseif((
    $pwd) && ($mail == "")) {
    $error 'no_mail';
    }

    elseif((
    $mail) && ($pwd)) {

    $log_query "SELECT * FROM utenti WHERE email = 'provajack@hotmail.it'";//fai $_post con email ma poi cerchi mail nel database?
    $log_data mysql_query($log_query);//$link da dove lo prendevi scusa?(non c'e nella pagina, inoltre non devi specificare di nuovo la connessione al database se quella che ti serve è stata l'ultima che hai aperto)
    $n mysql_num_rows($log_data);

    if(
    $n == 0) {
    $error 'mail_err';
    }

    else {

    $data mysql_fetch_array($log_data);/*prendo i dati di tutti gli utenti con la email uguale a quella inserita
    il nome contenuto tra [] dipende dal nome campo contenuto nel database*/
    $uid $data['id'];
    $status $data['status'];
    $key $data['key'];
    $user $data['username'];
    $user_pwd $data['password'];


    if(
    $n != 1) {//questo per prevenire errori del database, per esempio pari a 2(non capita ma quando capita...)
    $error 'no_act';
    }else{

    $pwd sha1($pwd);//ho i dati in sha1, non md5, per questo ho cambiato, ricambia se vuoi

    if(($user_pwd == $pwd)) {

    $error 'none';

    $_SESSION['key'] = $key;
    $_SESSION['mail'] = $mail;
    $_SESSION['pwd'] = $pwd;
    $_SESSION['username'] = $user;

    }

    else {

    $error 'pwd_err';

    }

    }

    }

    }



    require 
    'header.php';
    Prova così. Se non ti funziona mettimi questo script modificato con i tuoi dati(come lo hai usato nella tua pagina) e fammi controllare tutti i dati modificati, potrebbe anche esserci un errore semplicemente i un nome.

    P.S. In logout.php ho specificato di cancellare tutto ciò che era memorizzato nella sessione, compresi i dati $_SESSION, se provi a richiamare questi dati dopo quel comando non dovrebbero funzionare.Comunque fammi un account sul tuo sito Tipo User password User o simili, e fammi fare login e logout, voglio vedere cosa fà effettivamente il server.

  9. #9
    Lo script all'inizio della home l'ho gia' controllato, sistemato ed adattato, non penso possa essere quello il problema. Se vuoi fare una prova vai su threads.altervista.org/versione
    in alto a destra c'e' "Registrati", li crei un account velocemente.
    Grazie mille!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.