aggiungere input a form php

  • Creatore Discussione Creatore Discussione idrev
  • Data di inizio Data di inizio

idrev

Utente Attivo
8 Ott 2010
45
0
0
sto utilizzando questo form contact in html+php, devo aggiungere dei tag input e nella parte html non ho avuto problemi, il problema sta quando devo andarli ad operare con il php.

PHP:
<form action="formmail.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="destinatario" value="[email protected]">
<!-- INPUT AGGIUNTI -->
<input type="text" name="nome" />
<input type="text" name="cognome" />
<!-- CHIUSURA INPUT AGGIUNTI -->
<input type="text" name="mittente" value="" />
<input type="text" name="oggetto" value="" />
<textarea cols="20" rows="4" name="messaggio"></textarea>
<input type="file" name="allegato" />
<input type="submit" value="Invia" />
</form>

questo è il php che lo gestisce

PHP:
<?php 
// Recupero il valore dei campi del form 
$destinatario = $_POST['destinatario'];

// CAMPI NOME E COGNOME AGGIUNTI 
$nome = $_POST['nome'];
$cognome = $_POST['cognome'];

$mittente = $_POST['mittente']; 
$oggetto = $_POST['oggetto']; 
$messaggio = $_POST['messaggio']; 

// Valorizzo le variabili relative all'allegato 
$allegato = $_FILES['allegato']['tmp_name']; 
$allegato_type = $_FILES['allegato']['type']; 
$allegato_name = $_FILES['allegato']['name']; 

// Creo 2 variabili che riempirò più avanti... 
$headers = "From: " . $mittente; 
$msg = ""; 

// Verifico se il file è stato caricato correttamente via HTTP 
// In caso affermativo proseguo nel lavoro... 
if (is_uploaded_file($allegato)) 
{ 
// Apro e leggo il file allegato 
$file = fopen($allegato,'rb'); 
$data = fread($file, filesize($allegato)); 
fclose($file); 

// Adatto il file al formato MIME base64 usando base64_encode 
$data = chunk_split(base64_encode($data)); 

// Genero il "separatore" 
// Serve per dividere, appunto, le varie parti del messaggio. 
// Nel nostro caso separerà la parte testuale dall'allegato 
$semi_rand = md5(time()); 
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 

// Aggiungo le intestazioni necessarie per l'allegato 
$headers .= "\nMIME-Version: 1.0\n"; 
$headers .= "Content-Type: multipart/mixed;\n"; 
$headers .= " boundary=\"{$mime_boundary}\""; 

// Definisco il tipo di messaggio (MIME/multi-part) 
$msg .= "This is a multi-part message in MIME format.\n\n"; 

// Metto il separatore 
$msg .= "--{$mime_boundary}\n"; 

// Questa è la parte "testuale" del messaggio 
$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n"; 
$msg .= "Content-Transfer-Encoding: 7bit\n\n"; 
// CAMPI NOME E COGNOME AGGIUNTI 
$msg .= $nome . "\n\n";
$msg .= $cognome . "\n\n";
$msg .= $messaggio . "\n\n"; 

// Metto il separatore 
$msg .= "--{$mime_boundary}\n"; 

// Aggiungo l'allegato al messaggio 
$msg .= "Content-Disposition: attachment;\n"; 
$msg .= " filename=\"{$allegato_name}\"\n"; 
$msg .= "Content-Transfer-Encoding: base64\n\n"; 
$msg .= $data . "\n\n"; 

// chiudo con il separatore 
$msg .= "--{$mime_boundary}--\n"; 
} 
else 
{ 
$msg = $nome;
$msg = $cognome;
$msg = $messaggio; 
} 

// Invio la mail 
if (mail($destinatario, $oggetto, $msg, $headers)) 
{ 
echo "<p>Mail inviata con successo!</p>"; 
}else{ 
echo "<p>Errore!</p>"; 
} 
?>

impostandolo in questo modo mi arriva il campo nome e cognome solo se invio in allegato anche un file, io invece avrei bisogno di farmi arrivare questi campi anche se non allego nulla cosi come succede per il campo messaggio. Se compilo i campi nome, cognome e messaggio senza l'allegato mi arriva nella posta solo il campo messaggio. Mi date una mano
 
ciao
se hai pazienza ci do un occhio.
comunque volevo dirti: non usare i $_POST così brutalmente, soprattutto per farti inviare gli allegati (qualche "ben intenzionato" potrebbe inviarti un bell' .exe con conseguenze non piacevoli)
 
ciao
se hai pazienza ci do un occhio.
comunque volevo dirti: non usare i $_POST così brutalmente, soprattutto per farti inviare gli allegati (qualche "ben intenzionato" potrebbe inviarti un bell' .exe con conseguenze non piacevoli)

Ti ringrazio aspetto con piacere se riesco a risolvere :), in ogni caso io vorrei impostare l'invio dei file solo di pdf e doc...risulterebbe lo stesso pericoloso ?
 
Ti ringrazio aspetto con piacere se riesco a risolvere :), in ogni caso io vorrei impostare l'invio dei file solo di pdf e doc...risulterebbe lo stesso pericoloso ?

Ho provato ad aggiungere i campi
$nome = $nome;
$cognome = $cognome;

dove ci sono quelli che riguardano $msg = $messaggio; ma mi da errore
 
Ho provato ad aggiungere i campi
$nome = $nome;
$cognome = $cognome;

dove ci sono quelli che riguardano $msg = $messaggio; ma mi da errore


Ho risolto in questo modo, ma come dicevi tu poteva essere pericoloso...potrei impostare solo file doc e pdf ?
PHP:
$messaggio ="NOME: ".$_POST['nome']. "\n\n"."COGNOME: ".$_POST['cognome']. "\n\n"."MESSAGGIO: ".$_POST['messaggio']. "\n\n";
 
ciao
si si può fare (anzi si deve), però dimmi una cosa:
l'allegato deve essere obbligatorio e se non adatto cosa vuoi fare, es eliminarlo e inviare lo stesso o rimandare al form con un messaggio di errore e non inviare l'email?.
 
ciao
si si può fare (anzi si deve), però dimmi una cosa:
l'allegato deve essere obbligatorio e se non adatto cosa vuoi fare, es eliminarlo e inviare lo stesso o rimandare al form con un messaggio di errore e non inviare l'email?.

non è obbligatorio, ho impostato un campo oggetto che in base a quello che vogliono comunicarmi possono mandare o meno un file in allegato...anzi in realtà necessito proprio che il file non sia obbligatorio
 
ciao
ecco uno schema di come puoi fare, se l'allegato è valido viene inviato altrimenti l'email parte senza allegato.
PHP:
<?php
//......
// Valorizzo le variabili relative all'allegato 
$allegato = $_FILES['allegato']['tmp_name']; 
$allegato_type = $_FILES['allegato']['type']; 
$allegato_name = $_FILES['allegato']['name'];
//definisci i tipo di file ammessi
$ammessi=array('doc', 'docx', 'pdf', 'txt');//puoi aggiungerne o elimininarne
$estensione=pathinfo($allegato_name, PATHINFO_EXTENSION);//ricavo l'estenzione del file
if(!in_array($estensione,$ammessi)){//verifico se l'estenzione è tra le ammesse
	//non c'è quindi vuoto tutto
	$allegato ="";
	$allegato_type = ""; 
	$allegato_name = "";
}
// Creo 2 variabili che riempirò più avanti... 
$headers = "From: " . $mittente; 
$msg = "";
//.......
//poi modifico anche il caricamento
if (is_uploaded_file($allegato) && $allegato !=""){ //verifico che sia caricato e comunque non vuoto
	// Apro e leggo il file allegato 
	$file = fopen($allegato,'rb'); 
	$data = fread($file, filesize($allegato)); 
	fclose($file); 
	// Adatto il file al formato MIME base64 usando base64_encode
//......
?>
 
ciao
ecco uno schema di come puoi fare, se l'allegato è valido viene inviato altrimenti l'email parte senza allegato.
PHP:
<?php
//......
// Valorizzo le variabili relative all'allegato 
$allegato = $_FILES['allegato']['tmp_name']; 
$allegato_type = $_FILES['allegato']['type']; 
$allegato_name = $_FILES['allegato']['name'];
//definisci i tipo di file ammessi
$ammessi=array('doc', 'docx', 'pdf', 'txt');//puoi aggiungerne o elimininarne
$estensione=pathinfo($allegato_name, PATHINFO_EXTENSION);//ricavo l'estenzione del file
if(!in_array($estensione,$ammessi)){//verifico se l'estenzione è tra le ammesse
	//non c'è quindi vuoto tutto
	$allegato ="";
	$allegato_type = ""; 
	$allegato_name = "";
}
// Creo 2 variabili che riempirò più avanti... 
$headers = "From: " . $mittente; 
$msg = "";
//.......
//poi modifico anche il caricamento
if (is_uploaded_file($allegato) && $allegato !=""){ //verifico che sia caricato e comunque non vuoto
	// Apro e leggo il file allegato 
	$file = fopen($allegato,'rb'); 
	$data = fread($file, filesize($allegato)); 
	fclose($file); 
	// Adatto il file al formato MIME base64 usando base64_encode
//......
?>


Tra i 4 formati impostati mi arriva solo il .doc e il .pdf dove quest'ultimo nonostante mi mandi il file mi da comunque questo errore:
Warning: fread() [function.fread]: Length parameter must be greater than 0 in /web/htdocs/www.sito.it/send_form.php on line 33

ho provato ad allegare altri tipi di file che non sono specificati ma mi fa inviare cmq il form anche se poi non mi arriva il file, ma potrei risolvere specificando testualmente che si possono inviare solo un determinato tipo di file. Mi sapresti dare ancora una mano ? ti allego il php

PHP:
<?php
// Recupero il valore dei campi del form
$destinatario = $_POST['destinatario'];
$mittente = $_POST['mittente'];
$oggetto = $_POST['oggetto'];
$messaggio ="NOME: ".$_POST['nome']. "\n\n"."COGNOME: ".$_POST['cognome']. "\n\n"."MESSAGGIO: ".$_POST['messaggio']. "\n\n";



// Valorizzo le variabili relative all'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];

//definisci i tipo di file ammessi 
$ammessi=array('doc', 'docx', 'pdf', 'txt');//puoi aggiungerne o elimininarne 
$estensione=pathinfo($allegato_name, PATHINFO_EXTENSION);//ricavo l'estensione del file 
if(!in_array($estensione,$ammessi)){//verifico se l'estenzione è tra le ammesse 
    //non c'è quindi vuoto tutto 
    $allegato =""; 
    $allegato_type = "";  
    $allegato_name = ""; 
} 

// Creo 2 variabili che riempirò più avanti...
$headers = "From: " . $mittente;
$msg = "";

//poi modifico anche il caricamento 
if (is_uploaded_file($allegato) && $allegato !=""){ //verifico che sia caricato e comunque non vuoto 
    // Apro e leggo il file allegato  
    $file = fopen($allegato,'rb');  
    $data = fread($file, filesize($allegato));  
    fclose($file);  
    // Adatto il file al formato MIME base64 usando base64_encode 

// Adatto il file al formato MIME base64 usando base64_encode
$data = chunk_split(base64_encode($data));

// Genero il "separatore"
// Serve per dividere, appunto, le varie parti del messaggio.
// Nel nostro caso separerà la parte testuale dall'allegato
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

// Aggiungo le intestazioni necessarie per l'allegato
$headers .= "\nMIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed;\n";
$headers .= " boundary=\"{$mime_boundary}\"";

// Definisco il tipo di messaggio (MIME/multi-part)
$msg .= "This is a multi-part message in MIME format.\n\n";

// Metto il separatore
$msg .= "--{$mime_boundary}\n";

// Questa è la parte "testuale" del messaggio
$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$msg .= "Content-Transfer-Encoding: 7bit\n\n";
$msg .= $messaggio . "\n\n";

// Metto il separatore
$msg .= "--{$mime_boundary}\n";

// Aggiungo l'allegato al messaggio
$msg .= "Content-Disposition: attachment;\n";
$msg .= " filename=\"{$allegato_name}\"\n";
$msg .= "Content-Transfer-Encoding: base64\n\n";
$msg .= $data . "\n\n";

// chiudo con il separatore
$msg .= "--{$mime_boundary}--\n";
}
else
{
$msg = $messaggio;
}

// Invio la mail
if (mail($destinatario, $oggetto, $msg, $headers))
{
echo "<p>Mail inviata con successo!</p>";
}else{
echo "<p>Errore!</p>";
}
?>
 
ciao
Warning: fread() [function.fread]: Length parameter must be greater than 0 in /web/htdocs/www.sito.it/send_form.php on line 33
ho l'impressione intanto che non possa leggere il pdf.
comunque penso che ti convenga abbandonare la funzione mail() e passare alla classe phpmailer.
se hai pazienza ti butto giu come fare.
intanto dai un occhio qui, così intanto puoi scaricarla
https://www.mrw.it/php/inviare-email-classe-phpmailer_7047.html

p.s.
ti metterò anche altri controlli es. sull'indirizzo email
 
ciao

ho l'impressione intanto che non possa leggere il pdf.
comunque penso che ti convenga abbandonare la funzione mail() e passare alla classe phpmailer.
se hai pazienza ti butto giu come fare.
intanto dai un occhio qui, così intanto puoi scaricarla
https://www.mrw.it/php/inviare-email-classe-phpmailer_7047.html

p.s.
ti metterò anche altri controlli es. sull'indirizzo email

Si infatti si, anche con la stringa che avevo prima e non specificando i tipi di file ammessi mi da sempre l'errore anche se poi alla fine mi arriva cmq. Comincio ad installare questo phpmailer sul server. Grazie
 
perdona la mia ignoranza in campo php ma con questo phpmailer non necessita piu dei tag form html ?
 
ciao
no non il form serve comunque.
la classe funziona abbastanza bene, ma è difficile che indovini il nome dell'utente :).
per stasera ti mando uno schema
 
ciao
eccho uno schema di come dovresti/potresti fare.
ho usato una pagina unica (mi raccomando che sia .php)
guarda che l'ho buttato giù di brutto quindi potrebbero esserci degli errori, casomai posta
credo che i commenti che ho messo siano chiari
PHP:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento senza titolo</title>
</head>
<body>
<?php
if(isset($_POST['invia'])){//verifico che sia stato premuto il submit
	//metto un messaggio di errore a vuoto
	$ok_ko="";
	//leggo i vari input e li verifico
	$nome=trim(strip_tags($_POST['nome']));//con stip tag tolgo i tag html
	$cognome=trim(strip_tags($_POST['cognome']));
	$mittente=trim(strip_tags($_POST['mittente']));
	$oggetto=trim(strip_tags($_POST['oggetto']));
	//nel messaggio trasformo gli eventuali \n in br e non li tolgo, gli altri li elimino
	$messaggio=trim(strip_tags(nl2br($_POST['messaggio']);"<br> <br />"));
	$allegato_name=$_FILES['allegato']['name'];
	//inizio i controlli
	if($nome == ""){
		$ok_ko.="il nome &eacute; obbligatorio<br>";
	}
	if($cognome == ""){
		$ok_ko.="il cognome &eacute; obbligatorio<br>";
	}
	if(!filter_var($mittente, FILTER_VALIDATE_EMAIL)){
		$ok_ko.="l'indirizzo email &eacute; obbligatorio<br>o indirizzo non valido<br>";
	}
	if($messaggio =="" || strlen($messaggio)<10){
		$ok_ko.="non hai scritto il messaggio<br>o troppo corto, minimo 10 caratteri<br>";
	}
	$ammessi=array('doc', 'docx', 'pdf', 'txt');//puoi aggiungerne o elimininarne
	$estensione=pathinfo($allegato_name, PATHINFO_EXTENSION);//ricavo l'estenzione del file
	if(!in_array($estensione,$ammessi)){//verifico se l'estenzione è tra le ammesse
		//non c'è quindi vuoto tutto
    	$allegato_name ="";
		$allegato_si_no="non c'&eacute; allegato";
	}else{
		//e lo carico (qui se non caricato metto solamente come se fosse vuoto o errato)
		if(move_uploaded_file($_FILES['allegato']['tmp_name'], $_FILES['allegato']['name'])){
			$allegato_si_no="allegato: ".basename($allegato_name);
		}else{
			$allegato_name ="";
		$allegato_si_no="non c'&eacute; allegato";
		}
	} 
	//a questo punto verifico il messaggio di errore
	//se è rimasto vuoto non sono stati fatti errori quindi posso iniziare a spedire
	if($ok_ko==""){
		$destinatario="[email protected]"; //qui le tua email
		require_once "phpmailler/class.phpmailer.php";//richiamo la classe (verifica il percorso)
		// e comincio ad istanziarla
		$Emailmessaggio = new PHPmailer();
		$Emailmessaggio->SetLanguage('it','language/'); //messo italiano, ma la scelta è vasta
		$Emailmessaggio->IsHTML(true); // invio l'email in formato HTML
		$Emailmessaggio->AddAddress($destinatario);
		$Emailmessaggio->FromName= "mio_sito";//da dove ti arriva il messaggio, cioè dal form del tuo sito
		$Emailmessaggio->AddReplyTo($mittente,"");//a chi rispondere es. con il rispondi di outlook
		$Emailmessaggio->Subject=$oggetto;//oggetto dell'email
		//preparo il testo che ti verrà inviato
		$testo="<hr>";
		$testo.="email inviata da: $nome $cognome<br>";
		$testo.= "il ".date("d.m.Y H:i:s")."<hr>";
		$testo.="$messaggio<hr>$allegato_si_no";
		//preparo l'allegato se c'è o se non l'ho eliminato
		if($allegato_name !=""){
			$Emailmessaggio->AddAttachment($allegato_name);
		}
		//ora dovrebbe essere tutto pronto per l'invio
		if(!$Emailmessaggio->Send()){ //errore di trasmissione
  			$ok_ko="c'&eacute; stato un errore di trasmissione, riprova pi&ugrave; tardi<br>";
		}else{ //invio avvenuto
  			$ok_ko="grazie di averci contattato, sarai richiamato al pi&ugrave; presto<br>";
		}
	}
	//quindi mostro il messaggio di errore o di invio (a te sistemarlo graficamente)
	echo $ok_ko;
	//e ritorno, dopo 4 secondi per dare il tempo di leggere il messaggio al form pulito
	echo "<meta http-equiv='Refresh' content='4; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
}else{
?>
<form action="<?php htmlspecialchars($_SERVER['PHP_SELF']);?>" method="POST" enctype="multipart/form-data">
<table width="51%"  border="0" cellspacing="0" cellpadding="2">
  <tr>
    <td width="14%">nome:</td>
    <td width="26%"><input type="text" name="nome" /></td>
    <td width="60%">*</td>
  </tr>
  <tr>
    <td>cognome: </td>
    <td><input type="text" name="cognome" /></td>
    <td>*</td>
  </tr>
  <tr>
    <td>email: </td>
    <td><input type="text" name="mittente" value="" /></td>
    <td>*</td>
  </tr>
  <tr>
    <td>oggetto: </td>
    <td><input type="text" name="oggetto" value="" /></td>
    <td>*</td>
  </tr>
  <tr>
    <td>testo: </td>
    <td><textarea cols="40" rows="4" name="messaggio"></textarea></td>
    <td>* minimo 10 caratteri </td>
  </tr>
  <tr>
    <td>allegato</td>
    <td><input type="file" name="allegato" /></td>
    <td>file ammessi: .doc, .pdf, .txt</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><div align="right">*</div></td>
    <td>campi obbligatori </td>
  </tr>
    <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td><input type="submit" name ="invia" value="Invia" /></td>
  </tr>
</table>
</form>
<!--qui ci andrebbe un link per uscire dalla pagina -->
<?php
}
?>
</body>
</html>
fai delle prove e sappimi dire se e dove eventualmente da errore
 
Ma sarebbe possibile implementarlo in una pagina html ?
Cmq mi da errore alla riga 18
 
Ultima modifica:
ciao
il form se vuoi si, la parte di invio no deve essere una pagina con estenzione .php.
ma dato quello che devi fare per me è inutile farlo in due pagine.
ora do un occhio alla riga 18
 
Ho corretto ma quando provo ad inviare il form mi dice che c'é stato un errore di trasmissione, riprova più tardi. Per quanto riguarda il form in html, io ho creato un sito tutto in html interamente in una sola pagina e lo stesso form si trova o meglio si deve trovare all'interno di esso. In ogni caso penso di risolvere trasformando l'intera pagina in php...non mi dovrebbe dare problemi
 
Ultima modifica:
ciao
stupodaggine, mi sono dimenticato di una riga
PHP:
<?php
//....
        $testo.="$messaggio<hr>$allegato_si_no";
	$Emailmessaggio->Body=$testo;//AGGIUNGI QUESTA
        //preparo l'allegato se c'è o se non l'ho eliminato
//.....
?>
 
ma volendo aggiungere l'email del mittente al posto di mio_sito ho provato a fare delle modifiche ma non mi arriva piu l'email

PHP:
$Emailmessaggio->FromName= "mio_sito";//da dove ti arriva il messaggio, cioè dal form del tuo sito

modifica effettuatat da me

PHP:
$Emailmessaggio->FromName($mittente);//da dove ti arriva il messaggio, cioè dal form del tuo sito
 

Discussioni simili