• User

    Problemi con metodo POST e checkbox

    Ciao a tutti,

    non riesco a memorizzare il valore di una checkbox, con tutti gli altri campi (non checkbox) questo codice funziona!

    [php]
    <?
    if (isset($_POST['internet']))
    { $internet=$_POST['internet'];
    $_SESSION['internet']=$_POST['internet'];
    } else {
    if (!isset($_SESSION['internet'])) {
    $internet="off";
    }else
    {
    $_POST['internet']=$_SESSION['internet'];
    $internet=$_POST['internet'];
    }
    }
    ?>
    ...

    <form action="inserimento.php" name="search" method="POST">

    ...

    <?if ($internet=="on"){?>

            <input name="internet" type="checkbox" checked="checked" value="on" /> 
            <?}else{?>
            <input name="internet" type="checkbox" value="off" />
    

    <?}?>

    ...

    <input type="submit" value='Vedi anteprima'>

    </form>

    [/php]La checkbox rimane sempre non selezionata, perchè il valore di post non cambia mai ad on. Ho fatto varie prove stampando i valori POST e SESSION man mano, ma rimangono sempre ad off.

    Dove sbaglio?


  • User

    Ciao,
    il motivo è perchè tu hai la condizione dentro al form sempre falsa, quindi visualizzi sempre la checkbox con valore uguale a "off".
    Se la spunti ed invii il form, passi il valore off;
    se non la spunti, il valore non è settato quindi forzi tu la variabile $internet a off.

    Io utilizzo del codice tipo:
    [PHP]
    ...
    if (isset($_POST['xx'])) $xxchek='checked="checked"'; else $xxchek='';
    ...

    echo ('<input tabindex="1" type="checkbox" '.$xxchek.' name="xx" value="xx"/>');
    ...
    [/PHP]


  • User

    Ciao Cyrus, grazie della risposta, ma il tuo metodo funziona solo se devo memorizzare in POST ed a me serve memorizzare la variabile anche in SESSION ed eventualmente aggiornare il valore di POST in base a quello della sua SESSION perchè se cambio pagina e torno indietro per modificare un valore perdo tutti i POST.

    Io ho adattato il tuo metodo al mio caso, ma nonostante logicamente dovrebbe andare in realtà non funziona e continua a non cambiare il valore di $_POST['internet'].

    Rimetto il codice completo nella speranza che possiamo venirne a capo.

    [php]
    <?
    $internet='value="0"';
    $internetchek='';
    ?>

    ...

    <?

    if (!isset($_SESSION['internet'])) {

         if (isset($_POST['internet'])) {
            $_SESSION['internet']=$_POST['internet'];    
            if ($_POST['internet'] == '1') $internetchek='checked="checked"'; else $internetchek=''; 
        }
    }else{
        if (isset($_POST['internet'])) {
           $_SESSION['internet']=$_POST['internet'];                                
            if ($_POST['internet'] == '1') $internetchek='checked="checked"'; else $internetchek='';             
        }else {     
        $_POST['internet']=$_SESSION['internet'];         
        }
    }
    

    ?>

    ...

    <form action="inserimento.php" name="search" method="POST">
    ...

    <?
    if (isset($_POST['internet'])){
    if ($_POST['internet'] == '0' ) $internet = 'value="0"' ; else $internet = 'value="1"';
    }
    ?>
    <input tabindex="1" type="checkbox" <? echo $internetchek; ?> name="internet" <? echo $internet;?> />

    ...

    <input type="submit" value='Vedi anteprima'>
    </form>
    [/php]


  • User

    Ciao,
    non devi modificare il value della checkbox;
    la checkbox è checked o non checked e devi giocare solo su questi due stati, andando ad aggiornare tutte le altre variabili che ti serve memorizzare.

    provo a modificare il tuo codice senza avere la possibilità di testarmelo in locale:
    [PHP]
    <?
    //$internet='value="0"';
    $internetchek='';
    ?>

    ...

    <?

    if (!isset($_SESSION['internet'])) {

         if (isset($_POST['internet'])) {
            $_SESSION['internet']=$_POST['internet'];    
            $internetchek='checked="checked"';
        }
         else $internetchek=''; 
    }else{
        if (isset($_POST['internet'])) {
           $_SESSION['internet']=$_POST['internet'];                                
           $internetchek='checked="checked"';         
        }else {     
        $_POST['internet']=$_SESSION['internet']; 
        $internetchek='checked="checked"';          
        }
    }
    

    ?>

    ...

    <form action="inserimento.php" name="search" method="POST">
    ...

    <input tabindex="1" type="checkbox" <? echo $internetchek; ?> name="internet" value="internet" />

    ...

    <input type="submit" value='Vedi anteprima'>
    </form>
    [/PHP]


  • User

    mmm no, così rimane sempre ceccato


  • User

    Ma deve rimanere ceccato se è settata la variabile $_SESSION['internet']?
    Perchè al momento, se non distruggi mai la variabile di sessione, ti rimane correttamente sempre ceccato.

    Se non vuoi questo commenta l'ultimo dei tre $internetchek='checked="checked"';

    Altra cosa: sei veramente costretto a modificare direttamente i valori di POST? A parere personale non mi piace molto ...


  • User

    così va bene nella versione POST, cioè se resto sempre nella stessa pagina. ma non tiene conto del valore SESSION.

    purtroppo con questo metodo tra non spuntare o il togliere la spunta alla checkbox non c'è differenza, a me invece serve poter distinguere le due cose, cioè serve assegnare 0 o 1 al POST per poter sapere se è stata cambiata da 1 a 0 oppure se non è mai stata cliccata e cioè non assegnata.

    Mi spiego meglio:

    facendo finta che POST="" si non assegnato e SESSION="" sia non assegnato, mentre ="0" sia il valore che voglio memorizzare quando voglio $internetchek=''

    Nel momento in cui io entro nella pagina ho POST="", ma se SESSION è = "1" vuol dire che deve aggiornare il POST e quindi $internetchek='checked="checked"', ma se POST è già ="1" e io tolgo la spunta SESSION rimane ancora ="1" e quando rientro mi reimposta POST="1".

    Spero di essere stato chiaro.

    Sicuramente non sto usando il migliore dei metodi per fare quello che intendo fare, cioè ricordare il valore di una checkbox anche cambiando pagina.


  • User

    Penso di aver capito i tuoi intenti.
    Questa sera, se riesco, provo a buttare giù qualcosa ... sono da risistemare un po' le condizioni: in questa maniera SESSION sta comandando e forzando tutti, le dobbiamo sistemare nel caso POST passi un unchecked.


  • User

    Purtroppo ieri non sono riuscito a lavorarci

    Ho provato a buttare giù qualcosa ora, ma sono al lavoro e non so se ci sono errori oppure no ... comunque puoi usarlo come base di partenza e modificarlo per le tue esigenze.

    [PHP]
    <?php
    // inizializzo $internetchek
    $internetchek='';

    // controllo POST / SESSION
    if (isset($_POST['internet']))
    {
    $_SESSION['internet']='ok';
    $internetchek='checked="checked"';
    }
    else
    {
    if (isset($_SESSION['internet']))
    {
    $internetchek='checked="checked"';
    }
    }

    // dopo il controllo distruggo la variabile di sessione
    unset ($_SESSION['internet']);

    ?>

    ...

    <form action="inserimento.php" name="search" method="POST">
    ...

    <input tabindex="1" type="checkbox" <?php echo $internetchek; ?> name="internet" value="internet" />

    ...

    <input type="submit" value='Vedi anteprima'>
    </form>
    [/PHP]

    Ciao ciao


  • User

    No mi dispiace, ancora non va. C'è sempre lo stesso problema, non riesci a distinguere POST se è vuoto perchè abbiamo aperto la pagina oppure se sono passato da pieno a vuoto.


  • User

    Allora, nel form, inserisci una input di tipo hidden sulla quale preimposti un valore negli stati if iniziali.

    Come qualsiasi input le hidden vengono passate con il metodo che stai utilizzando, quindi il POST.


  • User

    Cyrus mi sono arreso, basta, ho cambiato metodo!

    Grazie comunque.