Mail: controllo campi

  • Creatore Discussione Creatore Discussione IImanuII
  • Data di inizio Data di inizio

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Sempre per il mio stramaledetto form, leggendo in giro, ho compreso l'utilità del controllo dei campi all'interno di un form. :mavieni:

Così vorrei impostare i controlli all'interno del form.

La pagina dove devono andare i controlli è strutturata in questo modo:
PHP:
<?php 
//tutti le variabili che vengono prima


// ...controllo tutte le variabili che non devono essere vuote per inviare la mail, e poi setto nulle se inviata o faccio un redirect 
if(!empty($oggetto) && !empty($msg)  ) { 

//parte dove uso la classe phpmailer
 $mail->Subject = $oggetto; 
  $mail->Body = $msg; 

// controllo se il codice di verifica è corretto (il captcha)
if(md5($verif_box).'a4xn' == $_COOKIE['tntcon']){
	// se il codice di verifica è corretto invio il messaggio
	$mail->Send();
	// cancello il cookie del campo di verifica
	setcookie('tntcon','');
} else if(isset($message) and $message!=""){
	// se il codice di verifica non è corretto o provano ad accedere direttamente alla pagina php mostro l'errore.
} else {

	header('Location: ops.php');
	
	exit;
	}
	
} //fine del controllo dei campi vuoti 

else {  //se i campi sono vuoti mostro l'errore

header('Location: ops.php'); 
     
    exit; 
    }

?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>E-Mail Inviata</title>
<style type="text/css">
<!--
body,td,th {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 12px;
}
-->
</style></head>
h="100%" height="100%">
<tr>
<td align="center" valign="middle">

Email inviata. Grazie.<br />
<br />
<a href="javascript:history.go(-1)">Torna indietro</a>

</td>
</tr>
</table>
</body>
<body>
<table widt
</html>

Adesso vorrei sostituire il controllo dei campi vuoti che già c'è con questo script http://www.phpnews.it/articoli/controllare-la-validita-di-una-email/
Come lo adatto? Inoltre vorrei che il controllo della mail "function chkEmail($email)" non controlli solo $email ma più campi es. $email2 $email3 $email4 ecc...
 
ciao
per verificare se l'indirizzo email è valido usa la funzione php filter_var

PHP:
if(filter_var($email, FILTER_VALIDATE_EMAIL))){
	echo "indirizzo valido";
}else{
	echo "indirizzo NON valido";
}
per controllare piu campi si deve vedere come ai chiamato i campi, se es.

HTML:
<!--............-->
email 1<input name="email[]" type="text" id="email" >
email 2<input name="email[]" type="text" id="email" >
email 3<input name="email[]" type="text" id="email" >
<!--............-->
poi per controllarle tutte poi fai un ciclo foreach
PHP:
<?php
//....
foreach($_POST['email'] as $valore){
     if(!filter_var($valore, FILTER_VALIDATE_EMAIL))){
          //non valido
     }else{
          //valido
     }
}
//.....
?>
 
Sei sempre tu oh fanciullo borgo ad aiutarmi! xD

Se ho ben capito, la struttura dovrebbe essere così, illuminami se erro

PHP:
<?php 
//tutti le variabili che vengono prima

//arrivo alla parte dell'invio del messaggio
if ($_POST['Submit'] == 'Invia')
{

// Recupero il valore dei campi del form per es:

$email1 = $_POST['emailA'];
$email2 = $_POST['emailB'];
$email3 = $_POST['emailC'];

//uso la classe phpmailer

  $mail->ValorePhpmailer($email1 ); 
  $mail->ValorePhpmailer($email2 ); 
  $mail->ValorePhpmailer($email3 ); 

//controllo con il ciclo

$tutte = ($email1, $email2, $email3);

foreach($tutte as $valore){ 
     if(!filter_var($valore, FILTER_VALIDATE_EMAIL))){ 

          //non valido => reindirizzo sulla mia pagina d'errore
        header('Location: ops.php');
	
	exit;

     }else{ 

          //valido => posso inviare la mail
          $mail->Send();

     } 
} 

} //chiudo l'if dell'invio

EDIT: ma tale filtro "FILTER_VALIDATE_EMAIL" controlla anche che il campo non sia vuoto?
 
Ultima modifica:
ciao
forse sarebbe meglio al posto di
PHP:
$tutte = ($email1, $email2, $email3);
mettere
PHP:
$tutte = array($email1, $email2, $email3);
credo che come hai scritto tu vada bene da php6 e non nelle precedenti (ma potrei sbagliarmi).
comunque perchè nel form non chiami i vari indirizz email[] così nel foreach puoi usare direttamente $_POST['email']?
poi
cosa è
PHP:
$mail->ValorePhpmailer($email1 ); 
$mail->ValorePhpmailer($email2 ); 
$mail->ValorePhpmailer($email3 );
?
non mi sembra che in phpmailer ci sia una funzione chiamata ValorePhpmailer.
inoltre non vedo dove la istanzi
PHP:
$mail = new PHPmailer();
e dove gli attribuisci il tutto (dall'oggetto, testo, destinatario ecc...)

poi facendo così tu imponi che tutte gli indirizzi siano obbligatori e rimandi alla oops senza avvisare quale errore è stato fatto.
secondo me è un "po'" da rivedere il tutto
 
ciao
forse sarebbe meglio al posto di
PHP:
$tutte = ($email1, $email2, $email3);
mettere
PHP:
$tutte = array($email1, $email2, $email3);
credo che come hai scritto tu vada bene da php6 e non nelle precedenti (ma potrei sbagliarmi).

Grazie è da poco che mi sono avvicinato al php ed ho cominciato dallge guide di questo sito, molte cose non le so.

comunque perchè nel form non chiami i vari indirizz email[] così nel foreach puoi usare direttamente $_POST['email']?

Perchè ho dato la possibilità di far inserire la mail di risposta (oltre ad una mail alternativa) in questo modo

$risposta = $_POST['emaildirisposta'];
$mail->AddReplyTo($risposta);

poi
cosa è
PHP:
$mail->ValorePhpmailer($email1 ); 
$mail->ValorePhpmailer($email2 ); 
$mail->ValorePhpmailer($email3 );
?
non mi sembra che in phpmailer ci sia una funzione chiamata ValorePhpmailer.
inoltre non vedo dove la istanzi
PHP:
$mail = new PHPmailer();
e dove gli attribuisci il tutto (dall'oggetto, testo, destinatario ecc...)


Infatti non ci sono funzioni chiamate così (nell'esempio mi son dimenticato l'istanza ma nel php c'è) xD il codice che avevo scritto era d'esempio, non volevo realmente dare una funzione. Ovviamente nel mio php è diverso perchè la mail funziona.

poi facendo così tu imponi che tutte gli indirizzi siano obbligatori e rimandi alla oops senza avvisare quale errore è stato fatto.
secondo me è un "po'" da rivedere il tutto

Infatti è questo che voglio, cioè che gli indirizzi siano obbligatori ma che ognuno di loro abbia un errore diverso, (es. "errore nella mail alternativa" "errore nella mail di risposta") infatti mi sa che invece di reindirizzare ad una pagina mi conviene usare un echo().

Mi sa che mi conviene studiare meglio il foreach() visto che sto cercando di implementare anche http://blog.mrwebmaster.it/2010/09/15/duplicare-i-campi-di-un-form-con-jquery.html per quanto riguarda il campo allegati xD.
 
Ultima modifica:
Effettivamente non riesco a risolvere, cioè non riesco a dare un errore specifico per ogni mail (che poi sono solo 2 )
 
poi facendo così tu imponi che tutte gli indirizzi siano obbligatori e rimandi alla oops senza avvisare quale errore è stato fatto.
secondo me è un "po'" da rivedere il tutto

Onestamente io vorrei far si che non tutte le mail siano obbligatorie e che si riesca ad identificare l'errore su quale campo è stato commesso.

Ti posto la porzione di codice interessata:
PHP:
$fromemail = $_POST['maildichiinvia'];
$risposta = $_POST['emaildirisposta'];
$oggetto = $_POST['oggetto']; 
$messaggio = $_POST['editor1']; 
$verif_box = $_POST["verif_box"];

require_once 'class.phpmailer.php';  

$mail = new PHPMailer();  
$mail->IsHTML(true); // invio l'email in formato HTML 

$msg = stripslashes($messaggio); //pulisco il messaggio dai magic quote con stripslashes e dopo lo vado a inviare con $mail->MsgHTML($msg);
 
  $mail->AddReplyTo($risposta);
  $mail->AddAddress("mailmia@prova.it"); 
  $mail->From = $fromemail;  
  $mail->Subject = $oggetto;  
  $mail->AltBody = 'Usa un editor mail compatibile con l\'html per vedere il messaggio!'; // optional - MsgHTML will create an alternate automatically  
  $mail->Body = $msg;
  $mail->AddAttachment($_FILES['allegato']['tmp_name'],$_FILES['allegato']['name']);    // Aggiungo l'allegato il nome $_FILES['allegato']

In pratica vorrei che:
l'email di risposta $risposta non sia obbligatoria (questo lo fa già phpmailer) ma se inserita questa sia controllata
l'email $fromemail; sia obbligatoria e controllata.
E che ovviamente gli altri campi siano obbligatori (messaggio oggetto ecc...) tranne l'allegato

In questo caso credo che non vada più bene la funzione php filter_var :\ sai percaso darmi qualche alternativa?
 
Ultima modifica:
Onestamente io vorrei far si che non tutte le mail siano obbligatorie e che si riesca ad identificare l'errore su quale campo è stato commesso.

Ti posto la porzione di codice interessata:
PHP:
$fromemail = $_POST['maildichiinvia'];
$risposta = $_POST['emaildirisposta'];
$oggetto = $_POST['oggetto']; 
$messaggio = $_POST['editor1']; 
$verif_box = $_POST["verif_box"];

require_once 'class.phpmailer.php';  

$mail = new PHPMailer();  
$mail->IsHTML(true); // invio l'email in formato HTML 

$msg = stripslashes($messaggio); //pulisco il messaggio dai magic quote con stripslashes e dopo lo vado a inviare con $mail->MsgHTML($msg);
 
  $mail->AddReplyTo($risposta);
  $mail->AddAddress("mailmia@prova.it"); 
  $mail->From = $fromemail;  
  $mail->Subject = $oggetto;  
  $mail->AltBody = 'Usa un editor mail compatibile con l\'html per vedere il messaggio!'; // optional - MsgHTML will create an alternate automatically  
  $mail->Body = $msg;
  $mail->AddAttachment($_FILES['allegato']['tmp_name'],$_FILES['allegato']['name']);    // Aggiungo l'allegato il nome $_FILES['allegato']

In pratica vorrei che:
l'email di risposta $risposta non sia obbligatoria (questo lo fa già phpmailer) ma se inserita questa sia controllata
l'email $fromemail; sia obbligatoria e controllata.
E che ovviamente gli altri campi siano obbligatori (messaggio oggetto ecc...) tranne l'allegato

In questo caso credo che non vada più bene la funzione php filter_var :\ sai percaso darmi qualche alternativa?

Non ci sono ancora riuscito, qualcuno può darmi una mano? :dipser:
 
ciao
un mistero???? ti avevo postato la soluzione, ma non la vedo piu:confused:
la cerco e ta la riposto (mal che vada la rifaccio)

:quote:???? non è che l'hai postata per errore in un altro topic oppure invece di invia risposta hai fatto "anteprima messaggio" xD comunque sempre grazie :P
 
ciao
ecco (ho dovuoro riscriverlo).
nel form contatti del mio sito faccio così

PHP:
<?php
//metti un minimo di controlli agli input
//lo strip tag evita es che ti arrivi js malevolo
$fromemail = strip_tags(trim($_POST['maildichiinvia']));
$risposta = strip_tags(trim($_POST['emaildirisposta']));
$oggetto = strip_tags(trim($_POST['oggetto'])); 
$messaggio = strip_tags(trim($_POST['editor1'])); 
$verif_box = strip_tags(trim($_POST["verif_box"]));//da cosa provime da una checkbox?
//*****inizio delle verifiche
$ok_ko="";//metto a stringa vuota il messaggio degli errori
if(!filter_var($fromemail, FILTER_VALIDATE_EMAIL)){
	$ok_ko.="l'indirizzo $fromemail non è valido o vuoto<br />";
}
if(!filter_var($risposta, FILTER_VALIDATE_EMAIL)){
	$ok_ko.="l'indirizzo $risposta non è valido o vuoto<br />";
}
if($oggetto ==""){
	$ok_ko.="non hai scritto l'oggetto<br />";
}
if($messaggio =="" || strlen($messaggio)< 10){//qui ti ho aggiunto anche lalunghezza minima
	$ok_ko.="messaggio vuoto o troppo corto (min 10 caratteri)<br />";
}
//questa è importante quando alleghi dei file, oppure ti puo arrivare es cancella_tutto_HarDish.exe
$tipi_ammessi=array('jpg', 'JPG','gif','png', 'zip','txt');//aggiungi o togli quali permessi
if(!in_array($_FILES['allegato']['name'], PATHINFO_EXTENSION), $tipi_ammessi){
	$ok_ko.="il tipo di file che vuoi allegare non è ammesso<br />";
}
if($verif_box ==""){//vedi te se ti serve
	$ok_ko.="non hai selezionato<br />";
}
//*****fine delle verifiche
/* a questo punto se la variabile $ok_ko è rimasta vuota vuol dire che non sono stati fatti errori
oppure contiene l'indicazione di quali errori commessi, in questo caso dai un avviso e torni al form pulito
*/
if($ok_ko !=""){//c'è almeno un errore
	echo $ok_ko; //avvisi e
	echo "<meta http-equiv='Refresh' content='3; URL=nome_pagina_form.php'>";//torni a form dopo 3 dec
}else{//non ci sono stati errori quindi puoi inviare
	require_once 'class.phpmailer.php';
	//tutto il resto dell'ambaradan di phpmailer 
	//..........
	if($mail -> send()){
		echo "grazie di averci contattato";
	}else{
		echo "errore di trasmissione, riprova più tardi";
	}
	echo "<meta http-equiv='Refresh' content='3; URL=nome_pagina_che_vuoi.php'>";//torni a dove vuoi dopo 3 dec
}
?>
 
ciao
ecco (ho dovuoro riscriverlo).
nel form contatti del mio sito faccio così

Ciao borgo, grazie per il codice me lo sto studiando. Il campo verif_box è il campo del captcha. Ho inserito già dei controlli e funzionano solo che credo sia disordinatissimo, ti posto il codice sotto. Se conosci una maniera più "economica" e ordinata da integrare con i controlli che mi hai postato tu, me lo fai sapere? Intanto continuo a integrare il tuo codice :byebye: ti faccio sapere

PHP:
// controllo che il campo di verifica non deve essere vuoto
 if(!empty($verif_box)) { //se il campo non è vuoto allora procedo
// controllo per l'inserimento di soli numeri all'interno del campo di verifica
if(is_numeric($verif_box)) { //se sono numeri procedo
// controllo se il codice di verifica è corretto
if(md5($verif_box).'a4xn' == $_COOKIE['tntcon']){
	// se il codice di verifica è corretto invio il messaggio
	$mail->Send();
	// cancello il cookie del campo di verifica
	setcookie('tntcon','');
} else if(isset($message) and $message!=""){
	// se il codice di verifica non è corretto 
} else {
		echo 'Codice di verifica non corretto!';
		exit;
	}
}else{ // fine del controllo di soli numeri, se non sono numeri mostro l'errore
		echo "Nel campo di verifica puoi inserire solo numeri!";
		exit;
}
}else{ // fine del controllo del campo di verifica vuoto, se lo è mostro l'errore
		echo "Errore: Il campo di verifica è vuoto!";
		exit;
}

Credo che tutti questi if si possano "riunire" in un unico if e per i messaggi d'errore si possa fare come hai fatto tu prima con gli altri controlli cioè lasciare la variabile vuota e riempiral in seguito :)

Per ora comincio con l'integrare il tuo codice poi ci penso xD
 
Ultima modifica:
Il codice l'ho integrato perfettamente e funziona.

Però (ci sono sempre sti maledetti però) ho un problema. Volevo che l'indirizzo mail di risposta fosse facoltativo.

Ho provato a cambiare così:

PHP:
$risposta = trim($risposta);
$num_at = count(explode( '@', $risposta )) - 1;
if($num_at != 1 || strpos($risposta,';') || strpos($risposta,',') || strpos($risposta,' ') || preg_match( '/^[\w\.\-]+@\w+[\w\.\-]*?\.\w{1,4}$/', $risposta)){
	$ok_ko.="L'indirizzo $risposta non è valido.<br />"; 
	}

Al posto di questo che mi avevi scritto tu

PHP:
if(!filter_var($risposta, FILTER_VALIDATE_EMAIL)){ 
    $ok_ko.="l'indirizzo $risposta non è valido o vuoto<br />"; 
}

Però non va mi riporta il messaggio d'errore :( e mi reindirizza
 
Come sempre il tuo aiuto è stato preziosissimo ho risolto tutto.
Il campo di verifica l'ho integrato così
PHP:
if(!filter_var(!empty($verif_box))){
	$ok_ko.="Il codice di verifica è vuoto.<br />"; 
	}
if(!filter_var(is_numeric($verif_box))){
	$ok_ko.="Il codice di verifica può contenere solo numeri.<br />"; 
	}
if(!filter_var(md5($verif_box).'a4xn' == $_COOKIE['tntcon'])){
	$ok_ko.="Il codice di verifica non è corretto.<br />"; 
	}
 
Ho modificato ancora così :)

PHP:
	if(!filter_var(!empty($verif_box) || is_numeric($verif_box) || md5($verif_box).'a4xn' == $_COOKIE['tntcon'])){
		$ok_ko.="Il codice di verifica non è corretto. Ricorda che non può essere vuoto e può contenere solo numeri.<br />"; 
		}
 
ciao
per mettere la seconda email facoltativa
basta sostituire
PHP:
//...........
if(!filter_var($risposta, FILTER_VALIDATE_EMAIL)){
    $ok_ko.="l'indirizzo $risposta non è valido o vuoto<br />";
}
//.....
con
PHP:
//.........
if(!filter_var($risposta, FILTER_VALIDATE_EMAIL)){
    $risposta="";//se errato meglio eliminarlo
}
//....
 
ciao
per mettere la seconda email facoltativa
basta sostituire
PHP:
//...........
if(!filter_var($risposta, FILTER_VALIDATE_EMAIL)){
    $ok_ko.="l'indirizzo $risposta non è valido o vuoto<br />";
}
//.....
con
PHP:
//.........
if(!filter_var($risposta, FILTER_VALIDATE_EMAIL)){
    $risposta="";//se errato meglio eliminarlo
}
//....

Decisamente meglio di tutto l'ambaradan che avevo scritto ^^

In che senso $risposta="";//se errato meglio eliminarlo ? Se dava messaggio d'errore dovevo eliminare quella stringa?
 

Discussioni simili