• User

    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.

  • Super User

    [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.


  • User

    Ti ringrazio Pater, ora funziona tutto perfettamente! 😄


  • User

    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.:gthi:


  • Super User

    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]


  • User

    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:

  • Super User

    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 🙂