Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di Igreo
    Registrato dal
    Jun 2004
    Messaggi
    1,117

    Variabile di sessione letta sotto condizioni impossibili

    Codice PHP:
    if ('ciccio' == 'faffo') {
    echo 
    "si";
    $_SESSION['finito'] = false;


    Dunque il problema nasce quando inviando un form che controlla se la variabile $_SESSION['finito'] è settata, altrimenti la setta con una stringa 'record modificato'; fin qui tutto bene, ma restringendo la finestra che con javascript lancia un reload della pagina, lo script sopra riportato fa qualcosa di incredibile:
    $_SESSION['finito'] è sempre false e il "si" non viene stampato.
    Se provo a cambiare $_SESSION['finito'] da false a 'ciao', al reload la variabile è sempre 'ciao'.. nonostante come vedete la condizione è impossibile!

    Non riesco a crederci!
    Potete aiutarmi

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,696
    Mostra il codice che effettivamente stai usando, perché lì per esempio non fai vedere come verifichi che la variabile di sessione sia settata o meno e non credo che tu abbia un confronto 'ciccio' == 'faffo'.

  3. #3
    Utente di HTML.it L'avatar di Igreo
    Registrato dal
    Jun 2004
    Messaggi
    1,117
    Ho messo quella condizione per fare capire il problema, ma soprattutto perché ho provato anche quella; oltre a $_SESSION['finito']=='record modificato' e tante altre. Ebbene la condizione non è valida e tutto all'interno non è letto tranne $_SESSION['finito'] ! Ho provato a togliere lo script e $_SESSION['finito'] rimane giustamente sempre 'record modificato'.
    Ho pensato ci entrassero le variabili globali ma cambiando i nomi delle variabili il risultato non cambia.
    Non so cosa pensare anche perché credevo di aver fatto diverse verifiche tempo da e pareva funzionare.. forse con le nuove versioni di php??
    Insomma sono molto sorpreso.
    Grazie ancora!

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,696
    Guarda, senza il codice reale non ti si può rispondere, perché magari il problema sta da un'altra parte e tu mostri un mozzico di codice.

    Così, l'unica cosa che ti posso dire è: non dare ASSOLUTAMENTE NULLA per scontato, soprattutto i valori delle variabili, controlla tutto perché se il risultato è quello lì ha ragione il computer e tu hai torto. E' SEMPRE il programmatore a sbagliare, il PC fa sempre e solo quello che gli si dice di fare, non fa "cose strane", fa quello che gli chiedi di fare.

  5. #5
    Utente di HTML.it L'avatar di Igreo
    Registrato dal
    Jun 2004
    Messaggi
    1,117
    Ok metto il codice ma rimane inspiegabile..
    codice:
    $form = mysqli_real_escape_string($conn, htmlspecialchars($_POST['form'], ENT_QUOTES));
    //--------------------------------------CANCELLARE SESSIONE FINITO
    if (empty($form)) {
      unset($_SESSION['finish']);
    }
    if ($form == "registro" && $method == "POST") {
      if (empty($_SESSION['finish'])) {
        $log = $lng['NUOVO']. ' ' .$lng['PROGRAM'];
        //SCRIPT UPDATE DATABASE
        $sql = 'INSERT INTO registro (log) VALUES ("' .$log. '")';
        mysqli_query($connessione, $sql) or die(mysqli_error($connessione));
        $_SESSION['finish'] = $log;
      }
    }
    Come vedete utilizzerei la sessione per evitare doppi inserimenti nel caso di refresh della pagina.. ma purtroppo sembra non funzionare.
    Il primo if unset la sessione se il modulo non è inviato; il secondo if vede se il form è inviato e il terzo if se la sessione è empty altrimenti viene eseguito lo script all'interno.

    Il problema nasce nel primo if che anche se metto ciccio==faffo, unset ugualmente la sessione.. inspiegabilmente!

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,696
    Proviamo a ripartire da questo codice.
    Dove hai questo script $conn è sempre inizializzata ed è corretta? Verifica che lo sia in tutte le condizioni in cui arrivi su quello script, altrimenti $form è NULL e empty(NULL) è sempre true.
    La variabile $method non so dove e come la inizializzi, ma verifica che anche questa sia sempre corretta.

    Tu fai il submit del form, lo fai col classico pulsante submit, poi method ed action nel tag <form> oppure tramite AJAX?
    Nel campo "form" scrivi registro, allo script arriva la richiesta e quindi
    $form = "registro"
    empty($form) è falso, l'unset non è eseguito
    entri nel secondo if, empty($_SESSION['finish']) è true ed entri nel terzo if.
    esegui la query (che qui come handle usa $connessione, mentre all'inizio si chiamava $conn, spero sia stata una svista scrivendo qui, altrimenti correggi)
    imposti $_SESSION['finish']

    ora restringi la finsetra del browser, si ricarica la pagina e viene reinviato il form.
    Non ti chiede "sei sicuro di voler reinviare i dati?" ?
    Quando viene reinviato, il campo "form" risulta compilato oppure no? Verificalo.
    Se risulta compilato, empty($form) è false e quindi si passa avanti, ma se non risulta compilato, empty($form) è true e ci entri eseguendo l'unset.

    E soprattutto, in tutto ciò, session_start() all'inizio dello script c'è? Altrimenti la sessione sarà sempre NULL, qualsiasi cosa tu faccia $_SESSION['finish'] sarà sempre NULL, di conseguenza empty($_SESSION['finish']) sarà sempre true, perché in realtà in sessione non ci scrivi mai.
    Ultima modifica di Alhazred; 28-08-2019 a 21:35

  7. #7
    Utente di HTML.it L'avatar di Igreo
    Registrato dal
    Jun 2004
    Messaggi
    1,117
    Dove hai questo script $conn è sempre inizializzata ed è corretta? Verifica che lo sia in tutte le condizioni
    Funziona benissimo

    La variabile $method non so dove e come la inizializzi, ma verifica che anche questa sia sempre corretta.
    Correttissima

    Con un form normale e non Ajax

    $form è un input hidden di value='registro'

    Si è una svista $conn e $connessione sono tutte $conn

    Certo mi chiede se voglio reinviare e accetto

    Il problema è proprio qui, $form risulta compilato difatti se all'interno prima dell'unset metto un echo o qualsiasi altra cosa, questa non viene eseguita ma bensì l'unset è sempre eseguito! Magia.

    La session_start è avviata correttamente.


    Mi sembra quasi una barzelletta.. se prima o dopo di unset metto tutto quello che voglio, non viene eseguito niente tranne il cambio della $_SESSION.. unset o = false o anche = ad un valore qualsiasi.

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,696
    Quote Originariamente inviata da Igreo Visualizza il messaggio
    ...Magia.[/B]
    Non è magia, hai commesso qualche errore da qualche parte.

  9. #9
    Utente di HTML.it L'avatar di Igreo
    Registrato dal
    Jun 2004
    Messaggi
    1,117
    Ma non ti sembra un comportamento estremamente anomalo? Che senso ha? Ti è mai successo?
    L'unica cosa che mi viene in mente è mettere un ulteriore controllo se la sessione è isset.. ma non ottengo risultati... si comporta allo stesso modo!

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,696
    Non ci sono comportamenti anomali di PHP o del PC, ogni volta che ho avuto un problema, anche se ci ho dovuto sbattere la testa ore o giorni, alla fine era colpa mia.
    Magari hai in giro qualche riga di codice che fa side-effect su quella variabile e non te ne rendi conto.

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 © 2019 vBulletin Solutions, Inc. All rights reserved.