Form con campi obbligatori

::silver73::

Nuovo Utente
26 Set 2012
19
0
0
Ciao a tutti,

devo inserire in un sito in html un form di invio dati con upload di un file, il tutto da inviare via mail. Sono riuscita ad impostare i due file (creazione del form in .html e file .php per controllare l'invio della mail e l'upload del file) e tutto funziona.

Adesso non so come impostare il codice per rendere tutti i campi obbligatori, premetto che non sono esperta in php. Ho provato ma al momento l'unico errore mi compare quando non carico il file, posso anche lasciare tutti i campi vuoti ma invia comunque la mail; non mi compare nemmeno il messaggio che ho impostato ma piuttosto due righe di errore col codice annesso.

Questo è il codice che ho impostato:

PHP:
<?php  
if(isset($_POST['title']) && isset($_POST['name'])  && isset($_POST['surname']) && isset($_POST['email'])  && isset($_POST['telephone']) && isset($_POST['fax']) ) 
 {   
$header="";   
$msg="";    
$boundary='--' . md5( uniqid(time()) );    
$ctencoding="8bit";    
$subject="Submission of a new Article";
$testo_del_messaggio="Title: $title\n"; 
$testo_del_messaggio.="Name: $name\n";
$testo_del_messaggio.="Surname: $surname\n";
$testo_del_messaggio.="Email: $email\n";
$testo_del_messaggio.="Telephone: $telephone\n";
$testo_del_messaggio.="Fax: $fax\n"; 
$to="[email protected]";    
$from=$_POST['email'];    
$fromname=$_POST['surname'];   
$ctype="application/octet-stream";    
$basename=$_FILES['all']['tmp_name'];    
$name=$_FILES['all']['name'];   
$header.="From: \"$fromname\" <$from>\nReturn-Path: $from\nX-Priority: 3\nTo: $to\n";  
$header.="Mime-Version: 1.0\nContent-Type: multipart/mixed;  \n boundary=\"$boundary\"\n";    
$header.="Content-Transfer-Encoding: 8bit\n";   
$msg .="This is a multi-part message in MIME format.\n--$boundary\n";  
$msg .= "Content-Type: text/plain; charset=iso-8859-1\n";   
$msg .= "Content-Transfer-Encoding: 8bit\n\n" . $testo_del_messaggio ."\n";   
$msg .="--$boundary\nContent-type: $ctype;\n name=\"$name\"\n";    
$msg .="Content-Transfer-Encoding: base64\nContent-Disposition: attachment\n filename=\"$name\"\n";    
$linesz= filesize( $basename)+1;    
$fp= fopen( $basename, 'r' );    
$content = chunk_split(base64_encode(fread( $fp, $linesz)));    
fclose($fp);    
$msg .= chr(13) . chr(10).$content;    
$result = @mail($to,$subject,$msg."\n",$header);    
if($result){   
echo "<p>Your data and your article have been successfully sent</p> <p>Thank you very much for your contribution!</p>";  }   
else{   
echo " <p>Error.<br>Impossible to send the data.</p><p>Riprova più tardi.</p>";  
}  
}   else{ echo "<p>You didn't fill all the fields.</p><p>Missing fields:</p>";   
if(!isset($_POST['title'])){ echo "Title<br>";}    
if(!isset($_POST['name'])){ echo "Name<br>";}  
if(!isset($_POST['surname'])){  echo "Surname<br>";}    
if(!isset($_POST['email'])){ echo "Email<br>";}   
if(!isset($_POST['telephone'])){ echo "Telephone<br>";}   
if(!isset($_POST['fax'])){  echo "Fax<br>";}  
}   
?>

Qualcuno potrebbe darmi una mano col codice?

Grazie mille
 
Ciao,
con isset controlli se esiste ma puo anche essere vuoto
prova con empty()
PHP:
if (!empty($_POST['title']) && ........
ceh vuol dire se non è vuoto
poi pero dovresti controllare e ripulire quello che c'è dentro per evitare che qualcuno possa scrivere codice malevolo
 
oppure una soluzione + elegante
considerando che il pulsante del submit sia cosi
HTML:
<input type='submit' name='invia' value='Invia'/>
PHP:
<?php

// se hanno premuto il pulsante invia
if (isset($_POST['invia']) && $_POST['invia'] == "Invia") {
    $errore = 0;
    // ciclo del POST
    foreach ($_POST as $key => $value) {
        // se non è vuoto
        if (!empty($value)) {
            // minimo controllo
            $_POST[$key] = mysql_real_escape_string($value);
        } else {
            $errore++;
        }
    }
    if ($errore == 0) {
        // tutto il tuo codice
    } else {
        echo "tutti i campi sono obbligatori";
    }
} else {
    echo "Post non settato, pagina non accessibile";
}
?>
 
Ultima modifica:
ciao
è giusto, ma un piccolo accorgimento
1. prima del foreach annullerei il $_POST['invia'] cun unset($_POST['invia']) altrimenti ciclo anche quello
 
Scusatemi credo di essermi persa tra i vari suggerimenti soprattutto perchè non uso mysql ma i dati vengono semplicemente inviati via mail.
Questo che segue è il mio semplice form:

HTML:
<body>
<form name="personalContact" enctype="multipart/form-data" method="post" action="mail.php">
<fieldset>
  <legend>Corresponding author</legend><br/>
  <label>Title: <input name="title" type="text" id="title" size="25" maxlength="30"></label>
  <label>Name: <input name="name" type="text" id="name" size="25" maxlength="30"></label>
  <label>Surname: <input name="surname" type="text" id="surname" size="25" maxlength="30"></label>
  <label>Email: <input name="email" type="text" id="email" size="25" maxlength="40"/> </label>
  <label>Telephone: <input name="telephone" type="text" id="telephone" size="25" maxlength="30"></label>
  <label>Fax: <input name="fax" type="text" id="fax" size="25" maxlength="30"></label></fieldset>
<br/>

<fieldset>
  <legend>Article</legend><br/>
  <label>Title: <input name="titleArticle" type="text" id="titleArticle" size="25" maxlength="160"></label>
  <label>Category: &nbsp;
  <select name="category" id="category">
	<option selected>Original papers</option>
	<option>Negative experimental results</option>
	<option>New ideas</option>
	<option>Dialogues</option>
</select><br/>
  Select a file to upload:
  <input name="all" type="file" id="all">
 </fieldset>
<fieldset>
<legend>Privacy</legend><br/>
Do you agree?<br/><br/>
<center><input type="radio" name="privacyy" id="yes"/> Yes &nbsp;&nbsp;&nbsp;
<input type="radio" name="privacyn" id="no"/> No</center><br/>
<label>Privacy: <input name="Interests" id="interests" type="text" size="75" maxlength="80"/></label>
</fieldset><br/>
 <button type="reset">Reset</button>&nbsp;<button type="submit">Send</button></form>
</body>

Tutti i campi sono obbligatori (compreso l'invio del file, tranne uno, il campo "Privacy" che dovrà essere compilato solo se al precedente radio button è stato spuntato lo Yes.

Ho buttato giù questo codice che non funziona per niente per quanto riguarda i campi obbligatori e funziona solo in parte per l'upload del file; mi spiego: se non viene caricato il file vengono visualizzate nel browser due righe di codice del file php e di seguito riporta il messaggio che i dati sono stati inviati con successo.

Questo è il file php:

PHP:
<?php  
if(isset($_POST['title']) && isset($_POST['name'])  && isset($_POST['surname']) && isset($_POST['email'])  && isset($_POST['telephone']) 
&& isset($_POST['fax']) ) && !isset($_POST['titleArticle']) && (!isset($_POST['category']) && (!isset($_POST['pryvacyy']) && (!isset($_POST['pryvacyn'])
&& (!isset($_POST['interests'])
 {   
$header="";   
$msg="";    
$boundary='--' . md5( uniqid(time()) );    
$ctencoding="8bit";    
$subject="Submission of a new Article";
$testo_del_messaggio="Title: $title\n"; 
$testo_del_messaggio.="Name: $name\n";
$testo_del_messaggio.="Surname: $surname\n";
$testo_del_messaggio.="Email: $email\n";
$testo_del_messaggio.="Telephone: $telephone\n";
$testo_del_messaggio.="Fax: $fax\n"; 
$testo_del_messaggio.="Title of the Article: $titleArticle\n";
$testo_del_messaggio.="Category: $category\n";  
$testo_del_messaggio.="Privacy: $pryvacyy\n";  
$testo_del_messaggio.="Privacy: $privacyn\n";  
$testo_del_messaggio.="Interests: $interests\n";  
$to="[email protected]";    
$from=$_POST['email'];    
$fromname=$_POST['surname'];   
$ctype="application/octet-stream";    
$basename=$_FILES['all']['tmp_name'];    
$name=$_FILES['all']['name'];   
$header.="From: \"$fromname\" <$from>\nReturn-Path: $from\nX-Priority: 3\nTo: $to\n";  
$header.="Mime-Version: 1.0\nContent-Type: multipart/mixed;  \n boundary=\"$boundary\"\n";    
$header.="Content-Transfer-Encoding: 8bit\n";   
$msg .="This is a multi-part message in MIME format.\n--$boundary\n";  
$msg .= "Content-Type: text/plain; charset=iso-8859-1\n";   
$msg .= "Content-Transfer-Encoding: 8bit\n\n" . $testo_del_messaggio ."\n";   
$msg .="--$boundary\nContent-type: $ctype;\n name=\"$name\"\n";    
$msg .="Content-Transfer-Encoding: base64\nContent-Disposition: attachment\n filename=\"$name\"\n";    
$linesz= filesize( $basename)+1;    
$fp= fopen( $basename, 'r' );    
$content = chunk_split(base64_encode(fread( $fp, $linesz)));    
fclose($fp);    
$msg .= chr(13) . chr(10).$content;    
$result = @mail($to,$subject,$msg."\n",$header);    
if($result){   
echo "<p>Your data and your article have been successfully sent</p> <p>Thank you very much for your contribution!</p>";  }   
else{   
echo " <p>Error.<br>Impossible to send the data.</p><p>Try once again.</p>";  
}  
}   else{ echo "<p>You didn't fill all the fields.</p><p>Missing fields:</p>";   
if(!isset($_POST['title'])){ echo "Title<br>";}    
if(!isset($_POST['name'])){ echo "Name<br>";}  
if(!isset($_POST['surname'])){  echo "Surname<br>";}    
if(!isset($_POST['email'])){ echo "Email<br>";}   
if(!isset($_POST['telephone'])){ echo "Telephone<br>";}   
if(!isset($_POST['fax'])){  echo "Fax<br>";}  
if(!isset($_POST['titleArticle'])){  echo "Title of the article<br>";}
if(!isset($_POST['category'])){  echo "Category<br>";}
if(!isset($_POST['pryvacyy'])){  echo "Pryvacyy<br>";}
if(!isset($_POST['pryvacyn'])){  echo "Pryvacyn<br>";}
if(!isset($_POST['interests'])){  echo "Interests<br>";}
}   
?>

Ho provato come suggerito a modificare gli ultimi if da

PHP:
if(!isset($_POST['title'])){ echo "Title<br>";}
a
PHP:
if(!empty($_POST['title'])){ echo "Title<br>";}

ma questa soluzione non va

Potreste darmi una mano per il codice perchè non ho mai usato php e infatti se ne vedono i risultati

Grazie a tutti
 
ciao
scusa una cosa, la parte php che hai postato è completa? dici che funziona tutto, ma hai provato a inviarti una email?
ti chiedo questo perche secondo me, se invia, posso sbagliarmi ma ti arriva una email vuota.
poi quello che diceva criric sul controllo dei dati malevoli non si riferisce solo a mysql ma anche a quanto possono invirti per email.
tanto per dirne una se il file che ti inviano fosse cancella_tutto_hardisk.exe ?
mi sembra che la parte php sia come minimo da rifare tutta
poi spero che la parte html del form tu la formatti con i css, perchè vista così è piuttosto disordinata
 
Ciao ti posto una prima bozza
prima di tutto devi assegnare un name ed un value al bottene del submit

HTML:
<button name="submit" value="submit" type="submit">Send</button>

per il php puoi provare piu o meno cosi
PHP:
<?php
// se hanno premuto il pulsante submit
if (isset($_POST['submit']) && $_POST['submit'] == "Invia") {
    // inizializzo campi obbligatori
    $obbligatorio = array();
    // eliminiamo il post submit 
    unset($_POST['submit']);
    // ciclo del POST
    foreach ($_POST as $key => $value) {
        // se non è vuoto
        if (!empty($value)) {
            // minimo controllo
            ${$_POST[$key]} = htmlentities($value);
            if ($privacy == "no") {
                $obbligatorio[] = "E' obbligatorio accettare le condizioni sulla privacy";
                break;
            }
        } else {
            $obbligatorio[] = "Il campo $key e' obbligatorio";
        }
    }
    if (count($obbligatorio) == 0) {
        $header = "";
        $msg = "";
        $boundary = '--' . md5(uniqid(time()));
        $ctencoding = "8bit";
        $subject = "Submission of a new Article";
        $testo_del_messaggio = "Title: $title\n";
        $testo_del_messaggio.="Name: $name\n";
        $testo_del_messaggio.="Surname: $surname\n";
        $testo_del_messaggio.="Email: $email\n";
        $testo_del_messaggio.="Telephone: $telephone\n";
        $testo_del_messaggio.="Fax: $fax\n";
        $testo_del_messaggio.="Title of the Article: $titleArticle\n";
        $testo_del_messaggio.="Category: $category\n";
        $testo_del_messaggio.="Privacy: $pryvacyy\n";
        $testo_del_messaggio.="Privacy: $privacyn\n";
        $testo_del_messaggio.="Interests: $interests\n";
        $to = "[email protected]";
        $from = $_POST['email'];
        $fromname = $_POST['surname'];
        $ctype = "application/octet-stream";
        $basename = $_FILES['all']['tmp_name'];
        $name = $_FILES['all']['name'];
        $header.="From: \"$fromname\" <$from>\nReturn-Path: $from\nX-Priority: 3\nTo: $to\n";
        $header.="Mime-Version: 1.0\nContent-Type: multipart/mixed;  \n boundary=\"$boundary\"\n";
        $header.="Content-Transfer-Encoding: 8bit\n";
        $msg .="This is a multi-part message in MIME format.\n--$boundary\n";
        $msg .= "Content-Type: text/plain; charset=iso-8859-1\n";
        $msg .= "Content-Transfer-Encoding: 8bit\n\n" . $testo_del_messaggio . "\n";
        $msg .="--$boundary\nContent-type: $ctype;\n name=\"$name\"\n";
        $msg .="Content-Transfer-Encoding: base64\nContent-Disposition: attachment\n filename=\"$name\"\n";
        $linesz = filesize($basename) + 1;
        $fp = fopen($basename, 'r');
        $content = chunk_split(base64_encode(fread($fp, $linesz)));
        fclose($fp);
        $msg .= chr(13) . chr(10) . $content;
        $result = @mail($to, $subject, $msg . "\n", $header);
        if ($result) {
            echo "<p>Your data and your article have been successfully sent</p> <p>Thank you very much for your contribution!</p>";
        } else {
            echo " <p>Error.<br>Impossible to send the data.</p><p>Try once again.</p>";
        }
    } else {
        foreach ($obbligatorio as $value) {
            echo $value . "<br/>";
            echo "Torna al form";
        }
    }
} else {
    echo "Post non settato, pagina non accessibile";
}
?>

è solo un inizio, non ho testato
giustamente come dice Borgo dovrai controllare che tipo di file ti mandano
 
Ultima modifica:
ciao
scusa una cosa, la parte php che hai postato è completa? dici che funziona tutto, ma hai provato a inviarti una email?
ti chiedo questo perche secondo me, se invia, posso sbagliarmi ma ti arriva una email vuota.
ciao
si, ho provato e per fortuna mi arrivano i vari campi compilati con quello che scrivo...ogni modifica che faccio al file php provo ad inviarmi la mail per testare; mi sarò mandata un centinaio di mail e per fortuna riportando il contenuto dei vari campi.

poi quello che diceva criric sul controllo dei dati malevoli non si riferisce solo a mysql ma anche a quanto possono invirti per email.
tanto per dirne una se il file che ti inviano fosse cancella_tutto_hardisk.exe ?

ok, scusate l'obiezione allora, parlava la mia ignoranza :)

poi spero che la parte html del form tu la formatti con i css, perchè vista così è piuttosto disordinata
confermo, il tutto è formattato tramite css, ho postato solo il codice necessario alla comprensione del form.

Immagino ci siano modi più eleganti e più efficaci di far compiere ad un form le azioni che vorrei inserire io ma non conoscendo php sto un po' annaspando e andando per tentativi

:byebye:
 
Grazie del codice criric

appena riesco a rimettere le mani sul codice testo ciò che mi hai suggerito

:byebye:
 
ho modificaquesta parte errata del codice che ti ho postato
PHP:
 if ($count($obbligatorio) == 0) {
con
PHP:
 if (count($obbligatorio) == 0) {
 
ciao
scusa una cosa, che versione di php stai usando?
sarò orbo ma non vedo la valorizzazione di alcune variabili, es.
PHP:
$testo_del_messaggio = "Title: $title\n";
cioè non vedo l'istruzione
PHP:
$title=$_POST['title'];
e naturalmente la sua verifica o sanificazione (uno potrebbe es inviarti come titolo " ")

la variabile $title dove si valorizza? non starai usando una vecchissima versione dove i nomi dei campi di input del form erano direttamente leggibili?
 
Ciao,

per criric ho provato il codice che mi hai inviato ma, anche se compilo tutti i campi e includo l'upload del file, viene fuori il messaggio 'Post non settato, pagina non accessibile' e di conseguenza non parte la mail.

per borgoitalia non so quale sia la versione che sto usando, come faccio a vedere...brancolo nel buio :(
 
Ciao,
si colpa mia

se il button lo ha fatto cosi
HTML:
<button name="submit" value="submit" type="submit">Send</button>
devi modificare la prima riga da
PHP:
if (isset($_POST['submit']) && $_POST['submit'] == "Invia") {
a
PHP:
if (isset($_POST['submit']) && $_POST['submit'] == "submit") {
 
Ciao,

ho fatto varie prove e direi che in linea di massima se compilo tutti i campi del form e allego il file il form funziona alla perfezione e invia tutto via mail nel modo più corretto.

Ci sono una serie di piccole sviste da mettere a posto e proverò a risolverle con calma modificando il codice; il problema più grosso però al momento mi viene creato nel momento in cui compilo tutti i campi ma non allego il file (anch'esso obbligatorio come tutti i campi compilati), perchè invece di comparire a video "E' obbligatorio caricare il file" o un messaggio simile, ciò che appare a video è questo:

Warning: fopen() [function.fopen]: Filename cannot be empty in D:\inetpub\webs\cdialcom\mail.php on line 58

Warning: fread(): supplied argument is not a valid stream resource in D:\inetpub\webs\cdialcom\mail.php on line 59

Warning: fclose(): supplied argument is not a valid stream resource in D:\inetpub\webs\cdialcom\mail.php on line 60
Your data and your article have been successfully sent

Thank you very much for your contribution!

ovvero i dati vengono correttamente inviati via mail, però l'utente non capisce che ha scordato di caricare il file, ho dimenticato qualcosa nel codice php???

Grazie ancora

:byebye:
 
A proposito c'è differenza se tra i campi obbligatori ci sono sia checkbox sia radio button, mi spiego: il controllo dell'obbligatorietà di questo tipo di campi del form va fatto in modo diverso? perchè i checkbox anche se non spuntati non vengono visti (anche se sono anch'essi obbligatori) e dei radio button non viene inviato il valore spuntato via mail...

:crying::crying:
 
Come ho detto era solo un inizio, ora bisogna perfezionarlo

incominciamo dalla privacy, tu scrivi
HTML:
<input type="radio" name="privacyy" id="yes"/> Yes &nbsp;&nbsp;&nbsp;
<input type="radio" name="privacyn" id="no"/> No</center><br/>

in realta il name deve essere uguale per tutti i radio e deve avere un value
HTML:
<input type="radio" name="privacy" value='yes' id="yes"/> Yes &nbsp;&nbsp;&nbsp;
<input type="radio" name="privacy" value='no' id="no"/> No</center><br/>

anche le option devono avere un value
HTML:
<label>Category: &nbsp;
  <select name="category" id="category">
	<option value='Original papers' selected>Original papers</option>
	<option value='Negative experimental results'>Negative experimental results</option>
	<option value='New ideas'>New ideas</option>
	<option value='Dialogues'>Dialogues</option>
</select><br/>

per i file come diceva Borgo bisognerà fare un controllo particolare
ma facciamo un passo alla volta
 
Perfetto, inserendo il value nei radio il valore checked mi viene riportato via mail; qui però penso di essermi spiegata male:

Questa è la relativa parte del form (ho dovuto modificarla nei valori dei fields):

HTML:
<input type="radio" name="selfCandidature" id="yes" value="yes"/> Yes &nbsp;
<input type="radio" name="selfCandidature" id="no" value="no"/> No<br/>
<label>Expertise: <input name="expertise" id="interests" type="text" size="75" maxlength="80"/></label>
se l'utente spunta lo 'yes' il campo "expertise" è obbligatorio, altrimenti se viene scelto il 'no' il campo successivo può rimanere vuoto (adesso anche con la scelta 'no' il campo successivo è obbligatorio), credo sia un controllo leggermente diverso rispetto al campo della privacy di cui avevamo parlato in precedenza.

Per quanto riguarda invece il value delle option, non so se sia proprio necessario, perchè col codice
HTML:
<select name="category" id="category">
	<option selected>Original papers</option>
	<option>Negative experimental results</option>
	<option>New ideas</option>
	<option>Dialogues</option>
</select>
il valore mi viene riportato correttamente vial mail; dimmi tu se è il caso di modificarlo...
 
altrimenti se viene scelto il 'no' il campo successivo può rimanere vuoto
se sceglie no cancelliamo il campo per non verificarlo
vediamo se ho capito prova a modificare il ciclo cosi
PHP:
foreach ($_POST as $key => $value) {
        // se sceglie no
        if ($_POST['selfCandidature'] == 'no') {
            // lo cancelliamo per non verificarlo
            unset($_POST['expertise']);
        }
        // se non è vuoto
        if (!empty($value)) {
            // minimo controllo
            ${$_POST[$key]} = htmlentities($value);
            if ($privacy == "no") {
                $obbligatorio[] = "E' obbligatorio accettare le condizioni sulla privacy";
                break;
            }
        } else {
            $obbligatorio[] = "Il campo $key e' obbligatorio";
        }
    }

potresti mettere un checked su uno dei due radio in modo che di default sia aettata almeno una delle due opzioni
esempio
HTML:
<input type="radio" name="privacy" id="yes"/> Yes &nbsp;&nbsp;&nbsp;
<input type="radio" name="privacy" checked id="no"/> No</center><br/>
 
Ultima modifica:
Per la select mi sa che hai ragione

non sapevo si postessero omettere i value

funziona lo stesso
 
ci ho ripensato meglio metterlo fuori dal ciclo
PHP:
        // se sceglie no
        if ($_POST['selfCandidature'] == 'no') {
            // lo cancelliamo per non ciclarlo
            unset($_POST['expertise']);
        }
        foreach ($_POST as $key => $value) {

                   ...............
 

Discussioni simili