Visualizzazione risultati 1 fino 17 di 17

Discussione: Non funzionano più le sessioni!

  1. #1
    L'avatar di digilinux
    digilinux non è connesso Utente attivo
    Data registrazione
    27-04-2009
    Messaggi
    478

    Predefinito Non funzionano più le sessioni!

    Ciao a tutti.
    Ieri, mentre lavoravo su un vecchio PC non riuscivo più a loggarmi su Sharetext ( http://sharetext.altervista.org) .
    Pensavo fosse un problema del browser (Explorer 5.0 su Win95) e mi sono rassegnato.

    Oggi ho notato che il problema è presente anche con il mio pc nel quale ha sempre funzionato.

    In pratica nella pagina login_action.php vengono create le sessioni $_SESSION["nick"] e $_SESSION["pwd"] e in quella pagina funzionano (se metto un print subito dopo la dichiarazione tutto funziona), ma se cambio pagina le sessioni spariscono.

    Non avendo cambiato le pagine (martedì funzionava), penso che il problema sia di Altervista... confermate?

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,262

    Predefinito

    Citazione Originalmente inviato da digilinux Visualizza messaggio
    Non avendo cambiato le pagine (martedì funzionava), penso che il problema sia di Altervista... confermate?
    Improbabile, ma non si sa mai.

    Il cookie con il sessionid viene creato correttamente?

  3. #3
    L'avatar di digilinux
    digilinux non è connesso Utente attivo
    Data registrazione
    27-04-2009
    Messaggi
    478

    Predefinito

    Non so se è la procedura giusta, ho controllato i cookie di Firefox e Sharetext non ha memorizzato nessun cookie.

    Infatti anche a me sembrava molto strano, però non trovo altre alternative.

  4. #4
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,262

    Predefinito

    Allora prova a settare un cookie nella stessa pagina, e guarda se arriva. Poi copia lo stesso codice su un altro sito dove le sessioni stanno funzionando, e guarda che succede.

    (sto guardando il codice preso da sourceforge... brrrr )

  5. #5
    L'avatar di digilinux
    digilinux non è connesso Utente attivo
    Data registrazione
    27-04-2009
    Messaggi
    478

    Predefinito

    Niente da fare, se setto un cookie è come se scrivessi codice al vento!

    (sono d'accordo con te, è il mio primo lavoro semi-serio in PHP! Intanto quello schifo funziona, quando qualche utente degnerà di iscriversi darò una ripulita al codice!)

  6. #6
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,262

    Predefinito

    Ok, il passo successivo è controllare se il cookie si perde, o viene rifiutato dal browser. Crea una pagina php che setta un cookie, e poi guarda gli header che il server ti invia.

    Puoi fare questo richiedendo la pagina manualmente al server (telnet), oppure con wget --server-response.

  7. #7
    L'avatar di digilinux
    digilinux non è connesso Utente attivo
    Data registrazione
    27-04-2009
    Messaggi
    478

    Predefinito

    Ecco la cosa strana.
    Il cookie settato dentro una pagina (usercp.php) non viene rilevato, mentre una pagina con solo setcookie funziona.

    Mistero? A questo punto però il problema misà che è mio, e non di AV...

  8. #8
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,262

    Predefinito

    Ma ovviamente hai error_reporting(E_ALL), vero?

  9. #9
    L'avatar di digilinux
    digilinux non è connesso Utente attivo
    Data registrazione
    27-04-2009
    Messaggi
    478

    Predefinito

    Scusa la mia ignoranza, ma dove devo inserire quella stringa?

  10. #10
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,262

    Predefinito

    error_reporting() è la funzione che seleziona quali messaggi di errore vengono visualizzati nelle pagine, invece di finire solo nei log.

    Piazzala all'inizio dello script, o in qualcosa che venga incluso da tutte le pagine.

  11. #11
    L'avatar di digilinux
    digilinux non è connesso Utente attivo
    Data registrazione
    27-04-2009
    Messaggi
    478

    Predefinito

    Codice:
    
    Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /membri/sharetext/header.html:90) in /membri/sharetext/login_action.php on line 23
    
    Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /membri/sharetext/header.html:90) in /membri/sharetext/login_action.php on line 23
    Login accepted!matrobriva
    Alla riga 90 dell'header c'è:

    Codice:
    	<input type="submit" name="login" id="login" value="Login" />

  12. #12
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,262

    Predefinito

    Non puoi eseguire header() se prima hai fatto dell'output, quindi riordina le diverse parti del tuo script, mettendo l'output dopo il riconoscimento dell'utente.

  13. #13
    L'avatar di digilinux
    digilinux non è connesso Utente attivo
    Data registrazione
    27-04-2009
    Messaggi
    478

    Predefinito

    Scusa se sono duro a capire ;-)

    Ma quindi per risolvere il problema dovrei spostare session_start() all'inizio del file header.html?

    Ma come mai ha sempre funzionato?

  14. #14
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,262

    Predefinito

    Si, scusa, intendevo session_start() sopra, dove ho scritto header().

    Dovrebbe bastarti includere header.html più in basso nel codice, dopo i vari controlli, e.g.:

    Codice PHP:
    <?php
    // controlli controlli
    if (blablabla())
    {
    session_start();
    $messaggio = 'Login corretto';
    }
    else
    $messaggio = 'Login errato';

    // fine codice php, inizio pagina
    ?>
    <?php
    include 'header.html'; ?>
    <h1>Login</h1>
    <p><?php echo $messaggio ?>
    In generale, questo è sempre un buon metodo per scrivere pagine, soprattutto in un sito complesso: dividi il codice e l'output, in modo da non dover rincorrere echo sparsi qua e la, e non incappare in errori strani.
    Ultima modifica di dreadnaut : 20-04-2012 alle ore 19.06.49

  15. #15
    L'avatar di digilinux
    digilinux non è connesso Utente attivo
    Data registrazione
    27-04-2009
    Messaggi
    478

    Predefinito

    Ho fatto esattamente come hai detto tu, ma purtroppo il problema non si è ancora risolto...
    Ora non riporta più errori, però le sessioni non vengono ancora create...

    Ma come mai lo stesso codice pochi giorni fa funzionava?

    EDIT:
    Questo è il codice incriminato:
    Codice PHP:
    <?php
    /*
    Avvio il riconoscimento dell'utente
    */
    function nohtml($var, $type)

    {

    switch (
    $type ) {

    case
    'nohtml': // trim string, no HTML allowed
    $appoggio = htmlentities ( trim ( $var ), ENT_QUOTES );
    $var = mysql_real_escape_string($appoggio);
    break;

    $nick = nohtml($_POST['nick'], 'nohtml');
    $pwdpass1 = nohtml($_POST['pwd'], 'nohtml');
    $pwd = md5($pwdpass1);
    include(
    "dbconn.php");
    $sql="SELECT * FROM sharetext_users WHERE nick='$nick' and pwd='$pwd'";
    $result=mysql_query($sql);
    $count=mysql_num_rows($result);

    if(
    $count==1){
    $sql2="SELECT * FROM sharetext_users WHERE nick='$nick' and flag!='0'";
    $result2=mysql_query($sql2);
    $count2=mysql_num_rows($result2);

    if(
    $count2==1){
    session_start();
    $_SESSION["nick"] = "$nick";
    $_SESSION["pwd"] = "$pwd";
    $messaggio = "<b>Login accepted!</b>";
    $messaggio = $_SESSION["nick"];
    }
    else {
    $messaggio = "Wrong Flag (have you checked your email?)";
    }
    }
    else {
    $messaggio = "Wrong Username or Password";
    }
    }
    }

    include(
    "header.html");
    print
    "<p><h1>";
    print
    $messaggio;
    print
    "</h1>";
    mysql_close($db)
    ?><br>
    <h1><a href="javascript:history.go(-2);">Back</a></h1>
    Dove sbaglio?
    Ultima modifica di andreafallico : 22-04-2012 alle ore 19.35.52

  16. #16
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,262

    Predefinito

    Citazione Originalmente inviato da digilinux Visualizza messaggio
    Ma come mai lo stesso codice pochi giorni fa funzionava?
    Eh, boh E' difficile capire perché il codice sopra non funziona, immaginati il codice "prima" che non ho mai visto in funzione. Magari c'era del caching attivo di mezzo?

    Tornando al problema: il codice sopra è un po' sporco, visto che contiene cose di questo genere:
    Codice PHP:
    $messaggio = "<b>Login accepted!</b>";
    $messaggio = $_SESSION["nick"];
    Controllalo tutto con attenzione e poi debugga pezzo per pezzo. Invece di setcookie mettici temporaneamente un
    Codice PHP:
    die('AAAAAAAAAAAAAARGH!'); // le A sono 14
    in modo da essere sicuri che l'esecuzione arrivi effettivamente a quel punto. Se i cookie vengono settati correttamente, il problema è da qualche parte li nel tuo codice.


    edit: il codice indentato salva la vita
    Codice PHP:
    <?php
    /*
    Avvio il riconoscimento dell'utente
    */
    function nohtml($var, $type)
    {
    switch (
    $type ) {

    case
    'nohtml': // trim string, no HTML allowed
    $appoggio = htmlentities ( trim ( $var ), ENT_QUOTES );
    $var = mysql_real_escape_string($appoggio);
    break;

    $nick = nohtml($_POST['nick'], 'nohtml');
    $pwdpass1 = nohtml($_POST['pwd'], 'nohtml');
    $pwd = md5($pwdpass1);
    include(
    "dbconn.php");
    $sql="SELECT * FROM sharetext_users WHERE nick='$nick' and pwd='$pwd'";
    $result=mysql_query($sql);
    $count=mysql_num_rows($result);

    if(
    $count==1){
    $sql2="SELECT * FROM sharetext_users WHERE nick='$nick' and flag!='0'";
    $result2=mysql_query($sql2);
    $count2=mysql_num_rows($result2);

    if(
    $count2==1){
    session_start();
    $_SESSION["nick"] = "$nick";
    $_SESSION["pwd"] = "$pwd";
    $messaggio = "<b>Login accepted!</b>";
    $messaggio = $_SESSION["nick"];
    }
    else {
    $messaggio = "Wrong Flag (have you checked your email?)";
    }
    }
    else {
    $messaggio = "Wrong Username or Password";
    }
    }
    }

    include(
    "header.html");
    print
    "<p><h1>";
    print
    $messaggio;
    print
    "</h1>";
    mysql_close($db)
    ?><br>
    <h1><a href="javascript:history.go(-2);">Back</a></h1>
    dove richiami la funzione nohtml() ?
    Ultima modifica di dreadnaut : 26-04-2012 alle ore 14.47.00 Motivo: + codice reindentato

  17. #17
    L'avatar di digilinux
    digilinux non è connesso Utente attivo
    Data registrazione
    27-04-2009
    Messaggi
    478

    Predefinito

    Grazie Dreadnaut, ho risolto!
    Dai un'occhiata al codice che avevo postato prima: lasciavo aperta la dichiarazione della funzione nohtml!!!

    Adesso il codice figura così:
    Codice PHP:
    <?php
    include("sanitize.php");
    $db = mysql_connect("localhost", "sharetext", "nulla") or die ("Impossibile connettersi al server");
    mysql_select_db("my_sharetext", $db) or die ("Impossibile connettersi al database");
    /*
    Avvio il riconoscimento dell'utente
    */
    $nick = sanitizeOne($_POST['nick'], 'nohtml');
    $pwdpass1 = sanitizeOne($_POST['pwd'], 'nohtml');
    $pwd = md5($pwdpass1);

    $sql="SELECT * FROM sharetext_users WHERE nick='$nick' and pwd='$pwd'";
    $result=mysql_query($sql);

    $count=mysql_num_rows($result);

    if(
    $count==1){
    $sql2="SELECT * FROM sharetext_users WHERE nick='$nick' and flag!='0'";
    $result2=mysql_query($sql2);
    $count2=mysql_num_rows($result2);

    if(
    $count2==1){
    session_start();
    $_SESSION["nick"] = "$nick";
    $_SESSION["pwd"] = "$pwd";
    $message = "<b>Login accepted!</b>";
    }
    else {
    $message = "Wrong Flag (have you checked your email?)";
    }
    }
    else {
    $message = "Wrong Username or Password";
    }
    mysql_close($db);
    include(
    "header.html");
    print
    $message;
    ?><br>
    <h1><a href="javascript:history.go(-2);">Back</a></h1>
    Purtroppo il codice che prima funzionava ce l'ho solo in una versione un pò vecchia e senza alcuni controlli... immaginati la struttura del codice che sto per postarti con i controlli aggiuntivi che ora faccio:
    Codice PHP:
    <?php include("header.html"); ?>
    <?php
    $db
    = mysql_connect("localhost", "sharetext", "nulla") or die ("Impossibile connettersi al server");
    mysql_select_db("my_sharetext", $db) or die ("Impossibile connettersi al database");
    /*
    Avvio il riconoscimento dell'utente
    */
    $nick = sanitizeOne($_POST['nick'], 'nohtml');
    $pwdpass1 = sanitizeOne($_POST['pwd'], 'nohtml');
    $pwd = md5($pwdpass1);

    $sql="SELECT * FROM sharetext_users WHERE nick='$nick' and pwd='$pwd'";
    $result=mysql_query($sql);

    $count=mysql_num_rows($result);

    if(
    $count==1){
    $sql2="SELECT * FROM sharetext_users WHERE nick='$nick' and flag='1'";
    $result2=mysql_query($sql2);
    $count2=mysql_num_rows($result2);

    if(
    $count2==1){
    session_start();
    $_SESSION["nick"] = "$nick";
    $_SESSION["pwd"] = "$pwd";
    print
    "<b>Login accepted!</b>";
    }
    else {
    echo
    "Wrong Flag (have you checked your email?)";
    }
    }
    else {
    echo
    "Wrong Username or Password";
    }
    mysql_close($db)
    ?><br>
    <h1><a href="javascript:history.go(-2);">Back</a></h1>
    Ti posso giurare che funzionava!
    Si vede che dal 28/10/11 al 19/04/12 i server di Altervista si fumavano le canne ;-)

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •