2015-06-28 16 views
6

Ho una forma che sembra:casella di controllo Fai return false quando incontrollato

<form> 
    <input type"checkbox" name="checked[(unique_id)]"> 
    <input type"checkbox" name="checked[(unique_id)]"> 
    <input type"checkbox" name="checked[(unique_id)]"> 
    <input type"checkbox" name="checked[(unique_id)]"> 
</form> 

Il numero di caselle di controllo sarà variata di volta in volta in modo che quando l'elaborazione di questi dati con PHP devo ciclo matrice _POST['checked'].

Il mio problema è che voglio eseguire azioni sia quando una casella di controllo è selezionata sia quando non lo è. Ma solo le caselle di controllo selezionate verranno aggiunte all'array _POST['checked'].

+1

non è possibile farlo con html in modo da avere 2 opzione 1 utilizzare javascript, 2 utilizzare elenco a discesa invece di casella di controllo – robert

+1

perché non aggiungere questo al tuo php: $ checked = isset (_POST ['checked'])) && _POST ['checked'] == 1; – sabkaraja

+0

@robert Ho sospettato tanto, un elenco a discesa non è un'alternativa in questo caso, ma sono più quindi aperto a una soluzione basata su JS. Come faccio a fare questo con JS? (Ho un'esperienza molto limitata con JS) – Gurgy

risposta

1
<form> 
    <input type="checkbox" key="1"/> 
    <input type="hidden" name="checked[1]" value="false"> 
    <input type="checkbox" key="2"/> 
    <input type="hidden" name="checked[2]" value="false"> 
    <input type="checkbox" key="3"/> 
    <input type="hidden" name="checked[3]" value="false"> 
    <input type="checkbox" key="4"/> 
    <input type="hidden" name="checked[4]" value="false"> 
</form> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<script> 
    $(document).ready(function() { 
     $('[key]').change(function() { 
      var key = $(this).attr('key'); 
      $($('[name="checked[' + key + ']"]')).val($(this).is(':checked') ? 'true' : 'false'); 
     }); 
    }); 
</script> 

qui è quello che sto facendo

sto utilizzando due ingressi uno è casella di controllo senza il nome in modo che non sarà inviato a php , l'altro è nascosto non verrà mostrato all'utente ma è quello che verrà inviato a php

quindi con jquery quando l'utente controlla la casella jquery cambia il valore dell'ingresso nascosto su true e quando deseleziona cambia il valore su false

modo che il valore sarà sempre inviare al PHP con valore vero o falso come string

è possibile modificare il valore che si desidera inviare a PHP modificando questa .is(':checked')?'true':'false') a qualcosa di simile che .is(':checked')?1:0) per inviare 1 e 0 invece di vero e falso

un'altra soluzione è la soluzione rybo111

<input type="hidden" name="check" value="false"> 
<input type="checkbox" name="check" value="true"> 

invierà le due opzioni, ma se la casella è selezionata i t sovrascriverà la prima opzione

ma non è affidabile al 100% e che invierà più dati al server

Per saperne di più che nel POSTing Form Fields with same Name Attribute

quindi se si desidera utilizzare una soluzione semplice, senza js utilizzare il "html unico" se si desidera che il 100% soluzione affidabile utilizzare il "js"

+0

Grazie mille, questo problema mi ha infastidito per giorni e ho persino capito cosa hai fatto lì: P – Gurgy

+0

hahaha: D tu sei il benvenuto e sono felice che tu capisca questo, e devi imparare js e jquery è molto importante per lo sviluppo web – robert

+0

Non è richiesto JavaScript con la mia risposta – rybo111

0

Aggiungi value="true" a ciascun elemento di input della casella di controllo. E modificare il codice PHP:

$checked_arr = []; 
foreach($_POST["checked"] as $checked){ 
    if($checked == "true"){ 
     // do what you want to do 
    } 
} 
+4

Correggetemi se ho torto ma '$ _POST [" checked "]' contiene ancora solo le caselle spuntate? – Gurgy

3

Ecco una tecnica che ho visto prima:

<input type="hidden" name="check" value="false"> 
<input type="checkbox" name="check" value="true"> 

Il motivo per cui questo funziona è perché quando i valori con lo stesso nome vengono inviati più di una volta, viene accettato solo l'ultimo valore.

A mio parere, un modo migliore è utilizzare semplicemente isset($_POST['...']) o in_array($_POST['...']).

+0

+1 è una buona soluzione, ma c'è un problema che questa soluzione non è affidabile perché alcuni browser possono inviare il primo valore – robert

+2

@robert hai qualche dato su quali browser inviano il primo valore? – rybo111

+1

non so se ci sono alcuni browser, ma per esempio ho affrontato un problema quando ho usato '' per inviare dati a php ma ora il tipo submit ha vinto essere inviati al server – robert

0

Un'altra soluzione è la soluzione lato server che ritengo sia troppo veloce e facile.

lato client: Basta utilizzare Fresh HTML: lato

<input type="checkbox" name="checked1" value="value_checked" ... /> 

server:

fanno funzione globale come questo:

function getVal(&$var, $default = '') { 
    if (!isset($var) || empty($var) || is_null($var)) 
     $var = $default; 
    return $var; 
} 

quindi utilizzare in cui si desidera leggi un valore che non sai sia impostato o meno. come questo:

$checked_value = getVal($_POST["checked1"],false); 

o

$checked_value = getVal($_POST["checked1"],"value_not_checked"); 

spero utile ad un altro.

Problemi correlati