Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306

    Memorizzare in db scelte checkbox

    Ciao a tutti ragazzi
    sono passato a cercare di memorizzare in db e successivamente leggere (sempre dal db) le scelte del checkbox.

    Poichè il tema è simile per tutti le tipologie di campi form (textarea,checkbox, radio, select) ho voluto creare nel mio database di prova (chiamato "db_prova") una tabella dal nome "campi".
    Questa tabella "campi" ha questi campi colonna : "id" (INT), "textarea", "checkbox", "radio", "select" (tutti e quattro VARCHAR).

    Nella pagina html c'è questo form oltre poi al form per il textarea
    codice:
    
    
    codice:
    <br><br>Quali sono i tuoi interessi?<br>
    <input type = "checkbox" name = "ck[]" value = "cucina">cucina <br>
    <input type = "checkbox" name= "ck[]" value = "calcio">calcio<br>
    <input type = "checkbox" name= "ck[]" value = "auto">auto<br>
    
    


    Sono riuscito a memorizzare nel mio db la scelta che effettua l'utente , grazie alla funzione php "serialize()"
    Questa prende un array e lo serializza, cioè crea una stringa con una serie di caratteri particolari (come vedo appunto da phpMyAdmin).

    Il problema è che non riesco a ben capire come far a visualizzare la scelta memorizzata dall'utente.
    Quello sotto è il codice per il recupero del checkbox.

    Ho ragionato così: in fase di recupero, eseguo l'operazione di deserializzazione con la funzione php

    unserialize($campodb)


    ( dove $campodb è il nome del campo colonna della mia tabella, che è una stringa serializzata).

    Per fare in modo che il browser visualizzi il simbolo di spunta in corrispondenza del campo selezionato in precedenza devo avere nel codice html un sistema che mi permette di inserire un attributo "checked" in corrispondenza del campo checkbox selezionato per tutti i campi che l'utente avrà selezionato.

    codice:
     
    <input type = "checkbox" name = "ck[]" value = "cucina<?php echo $c1_checked?>">cucina <br> 
    
    <input type = "checkbox" name= "ck[]" value = "calcio<?php echo $c2_checked?>">calcio<br> 
    
    <input type = "checkbox" name= "ck[]" value = "auto<?php echo $c3_checked?>">auto<br>
    Dove
    $c1_checked, $c2_checked,$c3_checked li vado a valorizzare a seconda di cosa c'è nel $ck




    codice:
    <?php
    require_once('configurazione_credenziali_esterno.php');
    $link = mysqli_connect(DB_HOST, DB_USERN, DB_PSW) or die("Errore connessione: ". mysqli_connect_error());
    $dbw = mysqli_select_db($link, DB_PROVA) or die("Errore apertura database: " . mysqli_error($link));
    
    
    $strsql = "SELECT checkbox FROM campi";
    
    
    $rs = mysqli_query($link, $strsql) or die("Errore query database: " . mysqli_error($link));
    while ($riga = mysqli_fetch_array($rs)) {
        
        $ck=unserialize($riga['checkbox']);
        //$ck è array deserializzato
        //$riga['checkbox'] conterrà i valori cucina o calcio o auto, o tutti serializzato
    
    
    
    
    $c1_checked=Null;
    $c2_checked=Null;
    $c3_checked=Null;
    
    
    if(isset($ck)){
        for($i=0; $i<count($ck);$i++){  
            //dall'indice 0 fino al max num di elementi nell' array, che
            //calcolo con la funzione php count
            if($ck[$i]=='cucina'){$c1_checked='checked';}
            elseif($ck[$i]=='calcio'){$c2_checked='checked';}
            elseif($ck[$i]=='auto'){$c3_checked='checked';}
        }
    }
    
    
    ?>
    <form>
    <input type = "checkbox" name = "ck[]" value = "cucina<?php echo $c1_checked?>">cucina <br>
    <input type = "checkbox" name= "ck[]" value = "calcio<?php echo $c2_checked?>">calcio<br>
    <input type = "checkbox" name= "ck[]" value = "auto<?php echo $c3_checked?>">auto<br>
    </form>
    
    
    
    
    <?php 
    
    
    }?>


    il problema che mi esce è che
    Notice: unserialize(): Error at offset 0 of 1 bytes in C:\Program Files\..........leggere-checkbox.php on line 46
    che è in corrispondenza della riga ​$ck=unserialize($riga['checkbox']);



    Ultima modifica di Alfoxx; 18-09-2016 a 17:24

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Forse ho limato un po' il problema, modificando leggermente il form dell'ultimo codice.
    Mi esce sempre l'errore

    Notice: unserialize(): Error at offset 0 of 1 bytes in C:\Program Files\EasyPHP-12.0\leggere-checkbox.php on line 46

    cioè in corrispondenza di $ck è array deserializzato


    e poi mi escono così tutti i campi tutti spuntati

    codice:
    <form>
    <input type = "checkbox" name = "ck[]" value = "cucina" checked="<?php echo $c1_checked?>">cucina <br>
    <input type = "checkbox" name= "ck[]" value = "calcio" checked="<?php echo $c2_checked?>">calcio<br>
    <input type = "checkbox" name= "ck[]" value = "auto" checked="<?php echo $c3_checked?>">auto<br>
    </form>
    Cosa c'è che non va? la funzione unserialize?
    Ultima modifica di Alfoxx; 19-09-2016 a 19:06

  3. #3
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Per prima cosa verifica che nel db hai effettivamente l'array serializzato. Se hai impostato una lunghezza troppo corta del campo è possibile che la stringa venga tagliata.
    Inoltre il manuale php consiglia di salvarlo in un campo di tipo blob invece che di testo.

    e ti consiglio di fare così per "riprendere" i checkbox:

    Codice PHP:
    <?php
    ...
    $strsql "SELECT checkbox FROM campi";


    $rs mysqli_query($link$strsql) or die("Errore query database: " mysqli_error($link));
    while (
    $riga mysqli_fetch_array($rs)):
        
    $checked = array();
        
    $ck=unserialize($riga['checkbox']);
        foreach(
    $ck as $value){
            
    $checked[$value] = true;
        }
    ?>
    <form>
    <input type = "checkbox" name = "ck[]" value = "cucina" 
         <?php echo isset($checked['cucina'])? 'checked' '' ?> >cucina <br>
    <input type = "checkbox" name= "ck[]" value = "calcio" 
         <?php echo isset($checked['calcio'])? 'checked' '' ?> >calcio<br>
    <input type = "checkbox" name= "ck[]" value = "auto" 
         <?php echo isset($checked['auto'])? 'checked' '' ?> >auto<br>
    </form>

    <?php endwhile ?>
    Ultima modifica di boots; 20-09-2016 a 12:28

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Grazie per avermi risposto

    Quote Originariamente inviata da boots Visualizza il messaggio
    Per prima cosa verifica che nel db hai effettivamente l'array serializzato. Se hai impostato una lunghezza troppo corta del campo è possibile che la stringa venga tagliata.
    Inoltre il manuale php consiglia di salvarlo in un campo di tipo blob invece che di testo.

    e ti consiglio di fare così per "riprendere" i checkbox:
    il codice che mi hai postato non l'ho ancora guardato.

    Per quello che mi hai subito detto, per paura ho modificato la lunghezza del campo "checkbox" a 255 caratteri.
    Penso che andava bene pure prima visto che compariva questo (se sceglievo "auto") sia prima della modifica che dopo

    a:1:{i:0;s:4:"auto";}

    Ora modifico il tipo con BLOB e vedo il codice


    EDIT: Modificato il tipo a TINYBLOB

    Ho una domanda in merito: come scelgo se usare Tinyblob, MediumBlob,Blob , LongBlob?
    in base alla dimensione di ciò che devo memorizzare, ok. Ma come in maniera ragionata?
    Ultima modifica di Alfoxx; 20-09-2016 a 13:09

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    codice:
    <?php
    ...
    $strsql = "SELECT checkbox FROM campi";
    
    
    $rs = mysqli_query($link, $strsql) or die("Errore query database: " . mysqli_error($link));
    while ($riga = mysqli_fetch_array($rs)):
       $checked = array();                     //​creo array $checked                  
        $ck=unserialize($riga['checkbox']);  
    
    //$ck è array deserializzato
    //$riga['checkbox'] conterrà i valori cucina o calcio o auto, o tutti serializzato(o serializzati)
    
    
    
        foreach($ck as $value){  //scorro l'array $ck
            $checked[$value] = true;
    
    //ad ogni ciclo metto il valore "true", all'elemento presente //in $checked con indice $value
    
    //ma $value che valore assume?
    //i valori cucina o calcio o auto, o tutti serializzato(o serializzati)?
    
        }
    ?>
    <form>
    <input type = "checkbox" name = "ck[]" value = "cucina" 
    <?php echo isset($checked['cucina'])? 'checked' : '' ?> >cucina <br>
    <input type = "checkbox" name= "ck[]" value = "calcio" 
    <?php echo isset($checked['calcio'])? 'checked' : '' ?> >calcio<br>
    <input type = "checkbox" name= "ck[]" value = "auto" 
    <?php echo isset($checked['auto'])? 'checked' : '' ?> >auto<br>
    </form>
    
    <!--nel form, se è settato questo $checked['calcio'] allora mette checked, se no lascia vuoto?-->
    
    <?php endwhile ?>
    
    <!--questo endwhile mi è nuovo-->
    
    

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Codice PHP:
    foreach($ck as $value){  //scorro l'array $ck
            
    $checked[$value] = true;
            
    //ad ogni ciclo metto il valore "true", all'elemento presente //in $checked con indice $value

            //ma $value che valore assume?
            //i valori cucina o calcio o auto, o tutti serializzato(o serializzati)?
        

    Visto che hai riottenuto l'array ($ck) il foreach scorre tutti gli elementi. Quindi $value conterrà cucina, calcio o auto

    Codice PHP:
    <form>
    <input type = "checkbox" name = "ck[]" value = "cucina" 
    <?php echo isset($checked['cucina'])? 'checked' '' ?> >cucina <br>
    <input type = "checkbox" name= "ck[]" value = "calcio" 
    <?php echo isset($checked['calcio'])? 'checked' '' ?> >calcio<br>
    <input type = "checkbox" name= "ck[]" value = "auto" 
    <?php echo isset($checked['auto'])? 'checked' '' ?> >auto<br>
    </form>

    <!--nel form, se è settato questo $checked['calcio'] allora mette checked, se no lascia vuoto?-->
    Esatto. Per spuntare un checkbox basta che metti l'attributo checked.
    Quindi se in $checked c'è la chiave relativa al value (auto, calcio o cucina) mette checked altrimenti nulla

    Codice PHP:
    <?php endwhile ?>

    <!--questo endwhile mi è nuovo-->
    PHP permette una sintassi alternativa che personalmente ritengo più chiara nel caso in cui "spezzi" il codice php con l'html. Se noti nel tuo codice metti alla fine una chiusura graffa isolata.Metti caso hai del codice più complesso
    (più cicli o if) diventa difficile capire a cosa si riferisce quella graffa.
    Al posto della graffa si mette il : e al posto di quella di chiusura l'end.
    Questa cosa vale per tutti i loop (while-endwhile, for-endfor, foreach-endforeach) e l'if (if-[-else-]endif)














    Rispondi Rispondi quotando
    Ultima modifica di boots; 20-09-2016 a 15:46

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    ciao boots

    grazie mille delle spiegazioni..... perchè hai detto "Visto che hai riottenuto l'array ($ck)..... "

    1)l'ho riottenuto poichè mettendoci come indice $value ottengo una copia dell'array $ck?

    Sempre in merito a questo argomento nel foreach($ck as $value){}

    $value non era stato definito da nessuna parte precedentemente, come mai può essere usato così facilmente?


    2)la notazione <?php endwhile ?>
    la metto quindi in alternativa alla } del while? proprio in sotituzione..... alcune volte quando apro delle graffe metto subito la chiusura e commento la parentesi di chiusura in modo da non perderla.....con questo però fra alcuni copia ed incolla l'ho persa.

    3)ho provato il codice e va quasi bene.
    esempio: nella tabella dove leggere, le prime righe non hanno la scelta del checkbox, perchè sono state riempite solo con textarea.Le successive invece hanno il checkbox impostato dall'utente.

    Risultato per le prime righe

    Notice: unserialize(): Error at offset 0 of 1 bytes in C:\Program Files\EasyPHP-......\leggere-checkbox.php on line 46 $ck=unserialize($riga['checkbox']);

    Warning: Invalid argument supplied for foreach() in C:\Program Files\EasyPHP-.....\leggere-checkbox.php on line 52
    foreach($ck as $value){

    Questo perchè ovviamente non essendo impostato il campo checkbox, $ck non viene valorizzato.




    Ti vorrei chiedere: come hai fatto a pensare una soluzione del genere? con il doppio array?

    Sto cercando di pormi nella situazione in cui non ho letto nulla al riguardo della soluzione di questo problema:
    -)ho un campo checkbox nel mio db che è serializzato per poter memorizzare correttamente le info.
    -)Per leggere vado a deserializzare i valori con unserialize.
    -)PEr poter settare checked , avevo pensato di leggere lo stesso array ed in base a quello che c'è settato vado a settare di conseguenza il codice html.

    Come ti è venuto in mente che un secondo array di appoggio poteva risolvere la situazione? quale è stato la lampadina/lo scatto mentale che ti è venuto?
    Ultima modifica di Alfoxx; 20-09-2016 a 17:41

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    grazie mille delle spiegazioni..... perchè hai detto "Visto che hai riottenuto l'array ($ck)..... "

    l'ho riottenuto poichè mettendoci come indice $value ottengo una copia dell'array $ck?
    Quando salvi i checkbox fai qualcosa del genere: serialize($_POST['ck'])
    Dove $_POST['ck'] è l' array che ti arriva dal form, giusto? una roba del genere $_POST['ck'] = array(0=>'auto');
    Quando fai unserialize() riavrai l'oggetto array.

    Come ti è venuto in mente che un secondo array di appoggio poteva risolvere la situazione? quale è stato la lampadina/lo scatto mentale che ti è venuto?
    Più o meno è quello che hai fatto tu con le variabili $cX_checked. Ma invece di usare della varibili di appoggio ho usato (le chiavi) l'array

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    ok, riottengo $ck perchè ho eseguito $ck=unserialize($riga['checkbox']);.
    OK OK.

    ma appunto ti chiedevo quella cosa: per me filava fin troppo bene quel che avevo fatto, si sfruttava l'array che si era ricavato ed in base a quello impostato, si agiva di conseguenza...

    Quando poi vai ad assegnare il valore "true", che vuol dire? che c'è qualcosa nell'array?
    e perciò poi alla fine c'è il controllo :se è settato ($checked['.....'])
    Ultima modifica di Alfoxx; 20-09-2016 a 18:04

  10. #10
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Quello che hai fatto tu funziona lo stesso. Quello che ti ho proposto io ti semplifica le cose se un giorno vai ad aggiungere/togliere un checkbox.

    Quando poi vai ad assegnare il valore "true", che vuol dire? che c'è qualcosa nell'array?
    e perciò poi alla fine c'è il controllo :se è settato ($checked['.....'])
    quello che interessa sono le chiavi (di fatti faccio un isset($checked[...])) ...il contenuto è irrilevante

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.