memorizzazione dati provanienti da un checkbox

Ciao a tutti,

devo implementare un form dove devono essere presenti un alcuni checkbox corrispondenti a dei servizi.

In questo modo l'utente del form sceglie tutti i servizi che desidera.

Come si salvano i risultati della selezione fatta dall'utente in un db mysql???

Ad ogni servizio devo poi accociare un'icona che lo rappresenti.

Al momento della visualizzazione dei dati inseriti dall'utente dovrò visualizzare solo le icone dei servizi scelti.

Mi date qualche delecidazione su come operare con checkbox multipli???

grazie mille

 :bye:

inviato 10 anni fa
stellina
X 0 X

Ti do un consiglio generale su come procedere per gestire i dati provenienti da un form. Prepara il form e metti alla fine dello script che lo contiene un semplice:

<pre>
<?php print_r($_POST) ?>
</pre>

Prova a compilare il form più volte e ad inviarlo. Vedrai come l'array $_POST viene diversamente riempito a seconda dei dati e delle opzioni inserite nel form. In particolare per le checkbox noterai che se le selezioni allora saranno presenti nell'array $_POST, altrimenti non compariranno proprio.

Nel DB potresti usare dei campi tinyint e memorizzare 0 o 1 per segnalare la presenza del servizio relativo.

Per mostrare l'icona ti basta fare un IF($row['nome_servizio']) echo '<img ...' dopo aver fatto la fetch della SELECT.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

in pratica:

<form name="form1" method="post" action="invia.php">

Seleziona i servizi presenti:  <br>

Piscina <input type="checkbox" nome="piscina" value="piscina">

Garage <input type="checkbox" nome="garage" value="garage">

Biblioteca <input type="checkbox" nome="biblioteca" value="biblioteca">

....

</form>

nel form metto tutta la lista dei servizi.

Nel db devo mettere un record per ogni servizio e assegnarci di conseguenza 0 o 1 a seconda che il servizio sia stato scelto???

grazie

 :bye:

risposto 10 anni fa
stellina
X 0 X

Dipende:

1. Se i servizi sono molti e prevedi in inserirne altri in tempi brevi allora ti conviene creare una tabella dedicata ad essi, con un record per ciascun servizio scelto. Ogni utente quindi avrà più record in questa tabella.

id utente - id servizio

     132            1

     132            4

     145            1

     145            2

2. Se i servizi sono pochi e non credi che varieranno allora puoi avere una tabella con tanti campi quanti sono i servizi. Ogni utente avrà un solo record per memorizzare tutti i servizi scelti

id utente - serv 1 - serv 2 - serv 3 - serv 4

    132           1           0           0           1

    145           1           1           0           0

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Dipende:

1. Se i servizi sono molti e prevedi in inserirne altri in tempi brevi allora ti conviene creare una tabella dedicata ad essi, con un record per ciascun servizio scelto. Ogni utente quindi avrà più record in questa tabella.

id utente - id servizio

     132            1

     132            4

     145            1

     145            2

I servizi sono molti ed è probabile che ne debba inserire anche in futuro (se serve)

ma l'esempio che mi hai mostrato va bene se un utente sceglie solo un servizio ma se ne sceglie più di uno come si fa???

 :bye:

risposto 10 anni fa
stellina
X 0 X

Se guardi bene l'esempio che ti ho proposto noterai che gli ID degli utenti si ripetono, quindi un utente può selezionare più servizi.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Io ho usato una soluzione differente per i canali tematici di una newsletter, però sono solo 3, quindi il mio db ha 2 campi:

email (del destinatario)

canali 3 caratteri

a seconda del canale scelto viene messo un 1 nella posizione interessata, altrimenti 0.

la gestione in questo caso è abbastanza semplice, dato che la stringa di 3 caratteri la posso considerare come un array.

Es.

tema1 posizione 0 (canali 100)

tema2 posizione 1 (canali 010)

tema3 posizione 2 (canali 001)

con tutte le combinazioni possibili fino a 111 per tutti i temi.

risposto 10 anni fa
LonelyWolf
X 0 X

Questo tipo di memorizzazione (1 o 0 per ciascuna opzione) si presta ad un uso molto efficiente della memoria. Infatti una sequenza di scelte può essere memorizzata con una seguenza di 0 e 1, es.:

10110000110100011010110100100101

se interpretato come un numero binario, questa sequenza in decimale vale 2966531365, numero che può essere memorizzato in un semplice campo int della tabella. Un campo int infatti è a 32 bit, quindi può memorizzare fino a 32 seclte.

Il problema però sta nella ricerca. E' infatti oneroso trovare i record che hanno settato ad 1 una determinata opzione.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Infatti nel mio caso sono solo 3 e non devo fare delle ricerche vere e proprie, li recupero tutti e poi viene inviata la newsletter del tema d'interesse dato che partono tutte assieme.

Ennesima prova che prima bisogna pensare sulla carta e poi realizzare! :D

risposto 10 anni fa
LonelyWolf
X 0 X

altra strada:

se riusccissi a salvare in un unico campo i vari servizi in questo modo:

piscina-biblioteca-garage-tv (oppure 7-6-1-9  dove i numeri identificano gli id dei servizi scelti)

quanto complicato è poi fare una query di visualizzazione dove per ogni lista di servizi memorizzati in quel campo mi siano visualizzate le loro icone??? (Ho una tabella nel db che mi associa i servizi alle icone)

???

 grazie  :bye:

risposto 10 anni fa
stellina
X 0 X

Se non devi fare una ricerca del tipo "chi usufruisce della piscina?" allora la cosa è molto semplice da realizzare.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Nella ricerca dovrò fare qualcosa del tipo:

"visualizza tutte le strutture che hanno come servizio la piscina" oppure "...la piscina e il garage..."

che dice con il moetodo di scrivere gli id di ogni servizio in un'unico record ce la posso fare ???

risposto 10 anni fa
stellina
X 0 X

Nella ricerca dovrò fare qualcosa del tipo:

"visualizza tutte le strutture che hanno come servizio la piscina" oppure "...la piscina e il garage..."

che dice con il moetodo di scrivere gli id di ogni servizio in un'unico record ce la posso fare ???

no, sarebbe troppo oneroso, te lo sconsiglio.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda