Form con campi obbligatori

Perfetto, l'ho testato e così mi pare che funzioni alla perfezione anche se ho lasciato nel codice la parte riguardante la privacy che invece dal form è stata eliminata. Potrei toglierla per una questione di pulizia del codice ma temo di far danni!!! :rolleyes:

Ho lasciato tutto così:
PHP:
if (isset($_POST['submit']) && $_POST['submit'] == "submit") {
    // inizializzo campi obbligatori
    $obbligatorio = array();
    // eliminiamo il post submit 
    unset($_POST['submit']);
    // ciclo del POST
    
  // se sceglie no 
        if ($_POST['selfCandidature'] == 'no') { 
            // lo cancelliamo per non ciclarlo 
            unset($_POST['expertise']); 
        } 
    
   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[] = "\nIl campo $key e' obbligatorio";
}
	}

Nei controlli che vengono fatti con questo codice però, non sono inclusi 5 checkbox perchè anche se non spunto la casella non mi dice che sono obbligatori e invece dovrebbero esserlo anche loro. In HTML appaiono così:

HTML:
The article is original <input type="checkbox" name="original" id="original" value="yes"><br/>
The article obeys to the ethical code <input type="checkbox" name="ethicalCode" id="ethicalCode" value="yes"><br/>
The author accepts the rules about the copyright <input type="checkbox" name="copyright" id="copyright" value="yes"><br/>
The author accepts the rules concerning the page charge (if due) <input type="checkbox" name="charge" id="charge" value="yes"><br/>
The article will be anonymously peer reviewed <input type="checkbox" name="peerReview" id="peerReview" value="yes"><br/>

devo aggiungere qualcosa in questa parte di codice o riguarda anche questo il file php?
 
puoi tranquillamente togliere tutto questo pezzo ( parentesi } comprese ) senza crear nessun danno
PHP:
if ($privacy == "no") {
                $obbligatorio[] = "E' obbligatorio accettare le condizioni sulla privacy";
               break;
           }

per i ceckbox intendi che almeno uno dei 5 deve essere spuntato?
 
Se è come penso mi è venuta questa idea
creiamo un array che contiene i name delle check e lo cicliamo per vedere se almeno una è spuntata
riposto la prima parte del codice
PHP:
<?php
// se hanno premuto il pulsante submit
if (isset($_POST['submit']) && $_POST['submit'] == "submit") {
    // inizializzo campi obbligatori
    $obbligatorio = array();
    // eliminiamo il post submit 
    unset($_POST['submit']);
    // array ceck obbligatorie
    $array_check = array("original", "ethicalCode", "copyright", "charge", "peerReview");
    // inizializzo conteggio check
    $ck = 0;
    // ciclo array ceck obbligatorie
    foreach ($array_check as $value) {
        // se settata 
        if (isset($_POST[$value])) {
            // incremento
            $ck++;
        }
    }
    // se non ne trovo neanche una
    if ($ck == 0) {
        $obbligatorio[] = "Checkbox obbligatorie";
    }
    // se sceglie no 
    if ($_POST['selfCandidature'] == 'no') {
        // lo cancelliamo per non verificarlo 
        unset($_POST['expertise']);
    }
    // ciclo del POST
    foreach ($_POST as $key => $value) {
        // se non è vuoto
        if (!empty($value)) {
            // minimo controllo
            ${$_POST[$key]} = htmlentities($value);
        } else {
            $obbligatorio[] = "\nIl campo $key e' obbligatorio";
        }
    }
 
Ho provato il codice e funziona: se almeno una delle checkbox è spuntata l'invio della mail va a buon fine, solo che dovrebbero essere tutte obbligatorie, non c'è un modo semplice per rendere l'intero array obbligatorio???

Forse sto semplificando un po' troppo!!!!
 
se è minore di 5
PHP:
if ($ck < 5) {
        $obbligatorio[] = "Checkbox obbligatorie";
    }
 
Avevo provato a risolvere inserendo istruzioni di verifica singola di ogni checkbox, ma andavano in conflitto l'una con l'altra restituendo a video messaggi come se ci fossero altri campi vuoti oltre alle stesse checkbox.

Ho dato un'occhiata alla parte di caricampento del file ma non riesco a capire perchèscinde completamente l'invio del file dall'invio degli altri dati; mi spiego: se i campi sono completati correttamente e il file non caricato invia comunque mail coi dati e a video appaiono righe di codice piuttosto che il messaggio di errore.

So che non è poco ma è l'ultimo pezzetto che non riesco a rimettere in sesto :dipser:
 
Ciao,
riposta il codice aggiornato

con le check hai risolto? , non ho capito
 
Ultima modifica:
Ciao,

si con le checkbox è stato sufficiente il cambiamento che mi hai suggerito e sembra che tutto funzioni.
Questo è il codice php aggiornato all'ultima versione:

PHP:
<?php 
// se hanno premuto il pulsante submit 
if (isset($_POST['submit']) && $_POST['submit'] == "submit") { 
    // inizializzo campi obbligatori 
    $obbligatorio = array(); 
    // eliminiamo il post submit  
    unset($_POST['submit']); 
    // array check obbligatorie 
    $array_check = array("original", "ethicalCode", "copyright", "charge", "peerReview"); 
    // inizializzo conteggio check 
    $ck = 0; 
    // ciclo array check obbligatorie 
    foreach ($array_check as $value) { 
        // se settata  
        if (isset($_POST[$value])) { 
            // incremento 
            $ck++; 
        } 
    } 
    // se non ne trovo neanche una 
    if ($ck < 5) { 
        $obbligatorio[] = "Checkbox obbligatorie"; 
    } 
    // se sceglie no  
    if ($_POST['selfCandidature'] == 'no') { 
        // lo cancelliamo per non verificarlo  
        unset($_POST['expertise']); 
    } 
    // ciclo del POST 
    foreach ($_POST as $key => $value) { 
        // se non è vuoto 
        if (!empty($value)) { 
            // minimo controllo 
            ${$_POST[$key]} = htmlentities($value); 
        } else { 
            $obbligatorio[] = "\nIl 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.="Originality of the article: $original\n"; 
	$testo_del_messaggio.="Ethical Code: $ethicalCode\n"; 
	$testo_del_messaggio.="Rules of the copyright: $copyright\n"; 
	$testo_del_messaggio.="Rules of the page charge: $charge\n"; 
	$testo_del_messaggio.="Anonymous peer review: $peerReview\n"; 
        $testo_del_messaggio.="Self Candidature: $selfCandidature\n";
        $testo_del_messaggio.="Expertise: $expertise\n";
        $to = "dc@mail.com";
        $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";
}
?>

Il form è questo:

HTML:
<form name="personalContact" enctype="multipart/form-data" method="post" action="mail.php">
...
Select a file to upload:
  <input name="all" type="file" id="all"> 
...
<button type="reset">Reset</button>&nbsp;<button name="submit" value="submit" type="submit">Send</button>
</form>

Ho tolto il codice superfluo che sta in mezzo dei vari campi da compilare
 
ora vado anchio per tentativi visto che non ho mai spedito un file via mail

potresti intanto verificare che il nome non sia vuoto
PHP:
// se diverso da vuoto
if ($basename != '') {
            $linesz = filesize($basename) + 1;
            $fp = fopen($basename, 'r');
            $content = chunk_split(base64_encode(fread($fp, $linesz)));
            fclose($fp);
            $msg .= chr(13) . chr(10) . $content;
        }
prova fami sapere
 
Ho provato inserendo il codice subito prima di questa riga

PHP:
if (count($obbligatorio) == 0)

ho riempito tutti i campi del form ma non ho caricato di proposito il fileper vedere qual è il messaggio che viene fuori, ed è questo:

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

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

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

Thank you very much for your contribution!

la mail coi dati viene mandata in maniera corretta.

Magari ho sbagliato il posizionamento del codice...
 
ma il file è obbligatorio?

se si potresti aggiungere un altro controllo simile a quelli che abbiamo fatto fin ora

PHP:
if (empty($_FILES['all']['tmp_name'])) {
        $obbligatorio[] = "File obbligatorio";
    }
 
si, il file è obbligatorio e sembra che il tuo codice funzioni, ho fatto una prova e sembra che vada...

Questo è il codice finale aggiornato, se non ho sbagliato nel riportare qualcosa al posto giusto

PHP:
<?php 
// se hanno premuto il pulsante submit 
if (isset($_POST['submit']) && $_POST['submit'] == "submit") { 
    // inizializzo campi obbligatori 
    $obbligatorio = array(); 
    // eliminiamo il post submit  
    unset($_POST['submit']); 
    // array ceck obbligatorie 
    $array_check = array("original", "ethicalCode", "copyright", "charge", "peerReview"); 
    // inizializzo conteggio check 
    $ck = 0; 
    // ciclo array ceck obbligatorie 
    foreach ($array_check as $value) { 
        // se settata  
        if (isset($_POST[$value])) { 
            // incremento 
            $ck++; 
        } 
    } 
    // se non ne trovo neanche una 
    if ($ck < 5) { 
        $obbligatorio[] = "Checkbox obbligatorie"; 
    } 
    // se sceglie no  
    if ($_POST['selfCandidature'] == 'no') { 
        // lo cancelliamo per non verificarlo  
        unset($_POST['expertise']); 
    } 
    // ciclo del POST 
    foreach ($_POST as $key => $value) { 
        // se non è vuoto 
        if (!empty($value)) { 
            // minimo controllo 
            ${$_POST[$key]} = htmlentities($value); 
        } else { 
            $obbligatorio[] = "\nIl campo $key e' obbligatorio"; 
        } 
    }
	//tentativo per i checkbox ma è inutile una volta che ripeto la stessa dicitura per i 5 checkbox
	//in teoria il codice per includere più cambi è  ...empty($campo1) || empty($campo2) || empty($campo3)...
	//if (empty($original)){
	//$obbligatorio[] = "\nIl campo $key e' obbligatorio";
	//echo '<a href="java script:history.go(-1)">Torna indietro</a>';
	//} 
	
	// se diverso da vuoto
if ($basename != '') {
            $linesz = filesize($basename) + 1;
            $fp = fopen($basename, 'r');
            $content = chunk_split(base64_encode(fread($fp, $linesz)));
            fclose($fp);
            $msg .= chr(13) . chr(10) . $content;
        } 
if (empty($_FILES['all']['tmp_name'])) { 
        $obbligatorio[] = "File 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.="Originality of the article: $original\n"; 
	$testo_del_messaggio.="Ethical Code: $ethicalCode\n"; 
	$testo_del_messaggio.="Rules of the copyright: $copyright\n"; 
	$testo_del_messaggio.="Rules of the page charge: $charge\n"; 
	$testo_del_messaggio.="Anonymous peer review: $peerReview\n"; 
        $testo_del_messaggio.="Self Candidature: $selfCandidature\n";
        $testo_del_messaggio.="Expertise: $expertise\n";
        $to = "daniela.cardillo@gmail.com";
        $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";
}
?>

Credo ci siano parti di codice superflui ma non penso creino conflitti con la parte necessaria!!!!

Funzionaaaaaaa :mavieni:
 
ma non è ancora finita

come diceva Borgo bisogna verificare che non vengano inviati file malevoli

che tipo di file ti aspetti che vengano caricati ? pdf doc immagini ?
 
Per me è già un traguardo essere riusciti fino a questo punto!!! grazie mille dell'aiuto che mi stai dando.

Gli unici file che l'utente dovrebbe poter inviare sono doc o rtf, insomma tutti file di scrittura...
 
Potresti verificare l'estensione del file caricato

crei un array che contiene le estensione che vuoi far passare

PHP:
// estensioni ammesse
    $estensioni = array("doc", "rtf", "txt");
    // se vuoto
    if (empty($_FILES['all']['tmp_name'])) {
        $obbligatorio[] = "File obbligatorio";
    } else {
        //altrimenti verifichiamo l'estensione
        // recuperiamo l'esensione
        $estensionefile = pathinfo($_FILES["all"]["name"], PATHINFO_EXTENSION);
        // se non è nell array
        if (!in_array(strtolower($estensionefile), $estensioni)) {
            $obbligatorio[] = "File non ammesso";
        }
    }

ti riposto tutto il file

PHP:
<?php
// se hanno premuto il pulsante submit 
if (isset($_POST['submit']) && $_POST['submit'] == "submit") {
    // inizializzo campi obbligatori 
    $obbligatorio = array();
    // eliminiamo il post submit  
    unset($_POST['submit']);
    // array ceck obbligatorie 
    $array_check = array("original", "ethicalCode", "copyright", "charge", "peerReview");
    // inizializzo conteggio check 
    $ck = 0;
    // ciclo array ceck obbligatorie 
    foreach ($array_check as $value) {
        // se settata  
        if (isset($_POST[$value])) {
            // incremento 
            $ck++;
        }
    }
    // se non ne trovo neanche una 
    if ($ck < 5) {
        $obbligatorio[] = "Checkbox obbligatorie";
    }
    // se sceglie no  
    if ($_POST['selfCandidature'] == 'no') {
        // lo cancelliamo per non verificarlo  
        unset($_POST['expertise']);
    }
    // ciclo del POST 
    foreach ($_POST as $key => $value) {
        // se non è vuoto 
        if (!empty($value)) {
            // minimo controllo 
            ${$_POST[$key]} = htmlentities($value);
        } else {
            $obbligatorio[] = "\nIl campo $key e' obbligatorio";
        }
    }
    // estensioni ammesse
    $estensioni = array("doc", "rtf", "txt");
    // se vuoto
    if (empty($_FILES['all']['tmp_name'])) {
        $obbligatorio[] = "File obbligatorio";
    } else {
        //altrimenti verifichiamo l'estensione
        // recuperiamo l'esensione
        $estensionefile = pathinfo($_FILES["all"]["name"], PATHINFO_EXTENSION);
        // se non è nell array
        if (!in_array(strtolower($estensionefile), $estensioni)) {
            $obbligatorio[] = "File non ammesso";
        }
    }

    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.="Originality of the article: $original\n";
        $testo_del_messaggio.="Ethical Code: $ethicalCode\n";
        $testo_del_messaggio.="Rules of the copyright: $copyright\n";
        $testo_del_messaggio.="Rules of the page charge: $charge\n";
        $testo_del_messaggio.="Anonymous peer review: $peerReview\n";
        $testo_del_messaggio.="Self Candidature: $selfCandidature\n";
        $testo_del_messaggio.="Expertise: $expertise\n";
        $to = "daniela.cardillo@gmail.com";
        $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";
}
?>
 
cimito = rimbambito ?

non ho mai sentito questo aggettivo :book:
 

Discussioni simili