- Home
- Categorie
- Coding e Sistemistica
- PHP
- Checkbox multipli almeno uno obbligatorio
-
Checkbox multipli almeno uno obbligatorio
Ciao a tutti, gentilmente mi servirebbe un piccolo vostro aiuto per rendere almeno un campo del checkbox obbligatoro.Ho due file inviamail.php e contatti.html nel file php ho questo codice:
<?php $email=$_POST['email']; ####################################### # IMPOSTAZIONI DA CONFIGURARE # ####################################### //(1) indirizzo email del destinatario del modulo $destinatario = "xxx"; //(2) indirizzo email del mittente, campo FROM // non toccare se desiderate che l'indirizzo email inserito nel modulo sia // riportato nel campo DA del messaggio che sarà ricevuto. // Se invece desiderate un campo fisso annullare la prima riga e abilitare // la seconda inserendo la dicitura desiderata (per annullare mettere // // all'inizio della prima riga e per abilitare togliere // dalla seconda riga) $nome_mittente = "$email"; // $nome_mittente = "Dal Modulo"; //(3) oggetto del messaggio $oggetto_email = "Modulo contatti inviato dal sito"; //(4) se si vogliono rendere tutti i campi NON OBBLIGATORI impostare su "y". // (valori possibili: "y" e "n") $all_free = "n"; //(5) se avete messo "n" al punto (4) inserire tra virgolette, separati // da virgola, i nomi dei campi da rendere OBBLIGATORI // Esempio: $campi_req = array("nome","telefono","via"); $campi_req = array("nome","email","citta","nazione","telefono"); //(6) controllo validità del campo email. (valori possibili: "y" e "n") $obbligo_email = "y"; //(7) obbligare l'utente ad accettare le condizioni. // (valori possibili: "y" e "n") $accetta_condizioni = "n"; //(8) URL della pagina di ringraziamento $pagina_grazie = ; //(9) URL della pagina errore campi vuoti $pagina_error_empty = ; //(10) URL della pagina errore email $pagina_error_email = ; //(11) URL della pagina errore condizioni non accettate $pagina_error_condizioni = ; //(12) URL della pagina errore invio non autorizzato (mancanza di referer) $pagina_error_referer = ; ####################################### # FINE IMPOSTAZIONI DA CONFIGURARE # ####################################### //ora e data $ora = date ("H:i:s"); $data = date ("d/m/Y"); //intestazione email che arriva al destinatario $corpo = " Modulo inviato il $data alle ore $ora Riepilogo dati:\n\n"; //============== NON TOCCARE NULLA OLTRE QUESTA RIGA ==================\ ########### CODICI ########### //variabili per rendere lo script compatibile anche con la versione PHP 4.2 e maggiori if(!isset($_SERVER) OR !$_SERVER OR !is_array($_SERVER) OR count(array_diff($_SERVER, $HTTP_SERVER_VARS))){ $_POST = &$HTTP_POST_VARS; } //prende IP ADDRESS if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ if ($_SERVER["HTTP_X_FORWARDED_FOR"] == "") { $ipnumb = getenv("REMOTE_ADDR"); }else { $ipnumb = getenv("HTTP_X_FORWARDED_FOR"); } } else { $ipnumb = getenv("REMOTE_ADDR"); } ################################### //controllo referer if(empty($_SERVER["HTTP_REFERER"])){ header ("Location: $pagina_error_referer"); exit(); } ########### CONTROLLO DEI CAMPI ########### $control_campi = 0; if($all_free != "y"){ foreach($_POST as $key => $valore){ if(in_array($key,$campi_req)){ if(trim($valore) == ""){ $control_campi++; } } } } else { $control_campi = 0; } ########### CONTROLLO EMAIL ########### $control_email = 0; if($obbligo_email == "y"){ if(isset($_POST['email'])){ if(!eregi("^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9_-])+.)+[a-z]{2,6}$", $_POST['email'])){ $control_email++; } } else { $control_email = 0; } } ########### CONTROLLO CONDIZIONI ########### $control_condizioni = 0; if($accetta_condizioni == "y"){ if(isset($_POST['trattamento_dati']) && $_POST['trattamento_dati'] == "accetto"){ $control_condizioni = 0; } else { $control_condizioni ++; } } ########### INVIO EMAIL ########### if($control_campi == 0){ if($control_email == 0){ if($control_condizioni == 0){ foreach($_POST as $key => $valore){ $key = ucfirst(stripslashes(trim($key))); $valore = stripslashes(trim($valore)); $key = str_replace("_"," ",$key); if(trim($valore) == "") $valore = "Non compilato"; $corpo .= $key .": ". $valore ."\n\n"; } $corpo .= "Numero IP: $ipnumb"."\n"; $corpo .= "____________________________________________________________ \n\n "; // invio e-mail // Header Mail $headmail.="From: $nome_mittente <$nome_mittente>\n"; $headmail.="Return-Path: $nome_mittente\n"; $headmail.="User-Agent: Php Mail Function\n"; $headmail.="X-Accept-Language: en-us, en\n"; $headmail.="MIME-Version: 1.0\n"; $headmail.="X-Priority: 1 (Highest)\n"; $headmail.="Content-Type: text/plain; charset=ISO-8859-1; format=flowed\n"; $headmail.="Content-Transfer-Encoding: 7bit\n"; ini_set('sendmail_from', "$destinatario"); mail("$destinatario", "$oggetto_email", "$corpo", "$headmail"); header ("Location: $pagina_grazie"); } else { header ("Location: $pagina_error_condizioni"); } } else { header ("Location: $pagina_error_email"); } } else { header ("Location: $pagina_error_empty"); } ?> ```mentre nel file html ho questo
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//IT">
<html>
<head><style type="text/css">
body {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;color:#380d71;text-align:center
;border=#000000}a {text-decoration:none}
img {margin-top:1}
h1 {font-size:15px;color:#000080;margin-top:10}
h2 {font-size:15px;color:#000080;margin-top:10}p {margin-top:0;font-size:13px;color:#898989;line-height:0.5}
</style>
</head>
<body bgcolor="#ffffff" lang="it" text="#ffffff" link=#ffffff alink=#ffffff vlink=#ffffff><table width=800 height=300 align="center" cellspacing=8 cellpadding=0 border=0>
<tr align="center" valign="center">
<td width=800 height=200 valign="center"><form name="modulo" method="post" action="inviamail.php">
<div align="center">
<table border="0">
<tr>
<td align="right"><small><font color="#FF0000" face="Verdana"></font><font face="Verdana" color="#000080">
Nome Cognome:</font></small></td>
<td><input type="text" name="nome" size="28"></td>
</tr>
<tr>
<td align="right"><small><font color="#FF0000" face="Verdana"></font><font face="Verdana" color="#000080">
E-Mail:</font></small></td>
<td><input type="text" name="email" size="28"></td>
</tr><td align="right"><small><font color="#FF0000" face="Verdana">*</font><font size="2" face="Verdana" color="#000080"> Prodotti:</font></small></td> <tr> <td align="right"><td align="right"><input type="checkbox" name="a" value="a"/><font size="2" face="Verdana" color="#000080">a</td></font> </tr> <tr> <td align="right"><td align="right"><input type="checkbox" name="b" value="b"/><font size="2" face="Verdana" color="#000080">b</td></font> </tr> <tr> <td align="right"><td align="right"><input type="checkbox" name="c" value="c"/><font size="2" face="Verdana" color="#000080">c</td></font> </tr> </table> <table border="0"> <tr> <tr> <td align="left"><font color="#000080" face="Verdana"><small><br> Spazio per richiesta informazioni:<br> <textarea name="note" rows="8" cols="60">
</textarea> </small></font></td>
</tr>
<tr>
<td align="left"><strong><font color="#FF0000" face="Verdana"><small>*</small></font><font color="#FF0000" face="Arial" size="1">
dato obbligatorio</font></strong></td>
</tr>
</table>
</div><p> <br><font color="#000000" face="Arial">
<input type="submit" value="Invia"> <br>
<br>
<br>
</font></p>
</form>
</td>
</tr></td>
</tr>
</table>
<br>
</body>
</html>Vorrei che l'utente selezionasse almeno un prodotto a-b-c obbligatoriamente prima di inviare l'email. Grazie.
-
[php]
########### CONTROLLO CHECKBOX ###########
$control_checkbox = 0;if(array_key_exists("a", $_POST) || array_key_exists("b", $_POST) || array_key_exists("c", $_POST)) {
$control_checkbox = 0; } else { $control_checkbox ++; } }
[/php]
poi dove c'è scritto #invio email aggiungi all'inizio
[php]
if($control_checkbox == 0) {
[/php]ed alla fine della pagina aggiungi un
[php]
} else {
header("Location: non_ho_segnato_alcuna_checkbox.php");
}
[/php]Comunque sia... Non so da dove hai preso quel codice ma la parte che gestisce il controllo dei campi è veramente allucinante o.O
In 40 righe quello che puoi fare in 5, ed alla fine 500 if concatenati.. Il codice che ti ho postato sopra l'ho scritto in quel modo per non cambiare niente di quella pagina... ma sinceramente potesti ottimizzarla molto facilmente... Ad esempio mettendo tutti gli errori in un array, ed alla fine fai un'unico if in cui fai partire la mail se l'array errori è vuoto, altrimenti mostri a video gli errori, che così mostreresti anche tutti insieme, piuttosto che mandare l'utente alla pagina del primo errore.
Salut.
-
Ti ringrazio Pater, ora funziona tutto perfettamente!
-
Ad esempio mettendo tutti gli errori in un array, ed alla fine fai un'unico if in cui fai partire la mail se l'array errori è vuoto, altrimenti mostri a video gli errori, che così mostreresti anche tutti insieme, piuttosto che mandare l'utente alla pagina del primo errore.
Ciao pater, come potrei fare per far appunto visualizzare gli errori a video piuttosto che mandare l'utente alla pagine d' errore?
Questa tua soluzione mi piace molto anche perchè molti utenti pensano che l'email è stata inviata non facendo attenzione alla pagina d' errore!
Grazie.
-
mmm... esempio veloce:
[php]
$errori = array();
if(/* controllo campo #1*/) $errori[] = "Errore al campo 1.";if(/* controllo campo #2*/) $errori[] = "Errore a campo 2.";
// etc... e poi alla fine
if(!$array)
// spedisci mail
else
foreach($errori AS $errore) print("ERRORE: ".$errore."<br />");
[/php]Applicato al primo campo:
[php]########### CONTROLLO DEI CAMPI ###########
if($all_free != "y"){
foreach($_POST as $key => $valore){
if(in_array($key,$campi_req)){
if(trim($valore) == ""){
$errori[] = "Campo ".$key." vuoto.";
}
}
}
}[/php]
-
Grazie pater per i tuoi preziosissimi aiuti. Sto imparando piano piano ad usare il php per passione, spero di riuscirci.
Allora ho provato ad inserire il tuo codice esattamente qui:######controllo referer###### if(empty($_SERVER["HTTP_REFERER"])){ header ("Location: $pagina_error_referer"); exit(); } $errori = array(); if("nome") $errori[] = "Errore al campo 1"; if(!$array) ```poi su controllo dei campi ho cancellato e aggiunto:
########### CONTROLLO DEI CAMPI ###########
$control_campi = "nome";if($all_free != "y"){
foreach($_POST as $key => $valore){
if(in_array($key,$campi_req)){
if(trim($valore) == ""){
$errori[] = "nome".$key." vuoto.";
}
}
}
}else
foreach($errori AS $errore) print("ERRORE: ".$errore."<br />");Sto sbagliando qualcosa ? Stavo pensando di far uscire "errore:errore al campo 1" vicino al campo non inserito, è fattibile? Grazie. :gthi:
-
Il messaggio d'errore te lo mostra perchè... hai fatto un IF senza molto senso:
[php]if("nome") //[/php]
Cosa avresti voluto fare? TI mostra il messaggio perchè quello che hai scritto equivarrebbe ad un:
[php]if("nome" == TRUE) //[/php]
Il che è vero in booleano ( stringhe, interi diversi da 0, array e quant'altro con un qualsiasi valore sono considerati come VERI, in quanto non = a 0 ).
Per il referer.. avresti dovuto fare così:
[php]
$errori = array();if(empty($_SERVER["HTTP_REFERER"]))
$errori[] = "Errore referer";
[/php]Per quello che dici tu, si potrebbe fare. Personalmente assegnerei una precisa chiave dell'array per ogni posizione, ad esempio:
$errori[0] per il referer
$errori[1] per il primo campo
$errori[2] per il secondo...etc etc... Tuttavia ti consiglio di prendere ancora un pò la mano con la logica if e con gli array monodimensionali prima di passare a queste applicazioni un pò più complesse.
Oppure, potresti fare i controlli direttamente in javascript:
<form onsubmit="check(this);">
function check(obj) { var inputs = obj.getElementsByTagName("input"); for ( var key; key <= inputs.length; key++) if( inputs[key].value.rtrim().ltrim() == "" ) alert("campo "+inputs[key].name+" vuoto!"); }
( Ho scritto il codice al volo, non ti assicuro sia corretto )
Comunque sia, se sei interessato a questo tipo di approccio ( comunque complementare a quello in php, che devi mantenere per motivi di sicurezza ), dovresti postare nell'apposito forum, se no i mod ci linciano XD.
Se hai dubbi non esitare a postare