Accents et Charset dans formulaire PHP

Fermé
lT4_ - 13 avril 2009 à 23:21
 toto - 22 nov. 2011 à 00:30
Bonjour,

J'ai vraiment besoin d'aide sur un soucis d'accents dans un formulaire de contact en PHP.
Je m'explique :
Je fais un site internet pour un ami, et dans la page de contact j'utilise un formulaire dans lequel je récupère des données comme le nom, la société, l'email et le message du visiteur.
J'utilise un charset utf-8 pour ma page, mais un ISO-8859-1 dans l'entête du message. Le soucis : je ne comprends vraiment pas pourquoi mes accents ne sont pas pris en compte et pourquoi je vois des \n \r au lieu de retours chariots...
De l'ordre général, quelles sont les fonctions (et dans quel ordre) et charset à adopter dans toutes les situations? J'aimerais avoir un code sur lequel je pourrais me baser pour mes prochains formulaires... Merci de votre aide !

Voici mon code :

<?php include_once("include/connexion_bdd.php"); ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" type="text/css" href="style.css" />
    <link rel="icon" type="image/x-icon" href="images/favicon.ico" />
	<title>Mon site - Contact</title>
</head>

<body>
	
    <div id="corps">
			
            <?php 	$page = 6;
            		include('include/header.php');
			?>


		<div id="corps_contenu">
        
                <div id="bloc_formulaire"><br />				
                <center><h4>Formulaire de contact</h4></center>
                    
				<?php
                    
                    // Inclusion de la fonction de vérification de mail.
                    include("fonctions.php");
                    
                    // Définition des variables dans le mail.
                            $nom = utf8_decode(mysql_real_escape_string(htmlspecialchars($_POST['nom'])));
                            if(isset($_POST['envoyer']))	
                                {	if(isset($_POST['societe']))
                                        $societe = utf8_decode(mysql_real_escape_string(htmlspecialchars($_POST['societe'])));
                                    else
                                        $societe = "Inconnue";
                                }
                            $email = utf8_decode(mysql_real_escape_string(htmlspecialchars($_POST['email'])));
                            $objet = utf8_decode(mysql_real_escape_string(htmlspecialchars($_POST['objet'])));
                            $message_envoi = nl2br(utf8_decode(mysql_real_escape_string(htmlspecialchars($_POST['message_envoi']))));
                            
                            
                    // Création des headers !
                            $headers ='From: "'.$nom.'"<'.$email.'>'."\n";
                            $headers .='Reply-To: '.$email.''."\n";
							$headers  .= 'Mime-Version: 1.0'."\r\n";
                            $headers .='Content-type: text/html; charset=ISO-8859-1'."\r\n";
 							$headers  .= "\r\n";
                    
                
                
                    // Vérification formulaire bien rempli !	
                            if(isset($_POST['envoyer']))
                            {
                                if( (empty($nom) || empty($email) || empty($objet) || empty($message_envoi)))
                                    $verif = 1;
                                
                                elseif(strlen($message_envoi) <= 20)
                                    $verif = 2;
                                
                                elseif (verif_mail($email) == false)
                                    $verif = 3;
                                
								elseif ($_SERVER["HTTP_REFERER"] != "contact.php" || strstr($nom, "http://") || strstr($societe, "http://") || strstr($email, "http://") || strstr($objet, "http://") || strstr($message_envoi, "http://") )
				   				$verif = 4; // Sécurité...
								
                                elseif((!empty($nom) || !empty($email) || !empty($objet) || !empty($message_envoi))) 
                                    $verif = 5;
                        
                                
                                switch ($verif)
                                {
                                    case 1 : $message_erreur = "<span class='msg_erreur'>Vous devez remplir tous les champs !</span>"; break;
                                    case 2 : $message_erreur = "<span class='msg_erreur'>Votre message doit faire au moins 20 caract&egrave;res.</span>"; break;
                                    case 3 : $message_erreur = "<span class='msg_erreur'>Votre adresse mail est invalide !</span>"; break;
                                    case 4 : $message_erreur = "<span class='msg_erreur'>Par mesure de sécurité, l'envoi est impossible...</span>"; break;
									
                                    // Tout est correct, ENVOI DU MAIL !!
                                    case 5 : $message_final = "Monsieur ".$nom.", entreprise ".$societe.", vous a laiss&eacute; un message :\n".$message_envoi;
                                             $succes_envoi = 1;
                                             
                                             if(mail('monmail', $objet, $message_final, $headers))
                                             $message_erreur = "<br /><span class='msg_succes'>Votre message &agrave; bien &eacute;t&eacute; envoy&eacute;. Nous vous recontacterons dans les plus brefs d&eacute;lais.<br />L'&eacute;quipe.</span>";
                                             else
                                             $message_erreur = "<br /><span class='msg_erreur'>Erreur lors de l'envoi du mail. Veuillez réessayer ultérieurement.</span>";
                                             break;
                                             
                                }
                            }
                
                ?>  
				
                
				<form action="" method="post" name="formulaire_contact">
                    		
                <?php	if($succes_envoi == 1) echo $message_erreur.'<br /><br />';
						else {
				?>
                
                <?php if(isset($message_erreur))
						echo $message_erreur.'<br /><br />';
				?>
                
                <br /><label for="nom">Votre nom :</label>
                <input type="text" name="nom" id="nom" maxlength="30" <?php echo "value='".$nom."'"; ?> /><br />
                
                <label for="societe">Soci&eacute;t&eacute; (Facultatif) :</label>
                <input type="text" name="societe" id="societe" maxlength="30" <?php echo "value='".$societe."'"; ?> /><br />
                
                <label for="email">Adresse Email :</label>
                <input type="text" name="email" id="email" maxlength="30" <?php echo "value='".$email."'"; ?> /><br /><br />
                
                <label for="objet">Objet :</label>
                <input type="text" name="objet" id="objet" maxlength="30" <?php echo "value='".$objet."'"; ?> /><br />
                
                <label for="message_envoi">Votre message :</label>
                <textarea name="message_envoi" id="message_envoi" rows="" cols="" ><?php echo $message_envoi; ?></textarea><br /><br />
                

               	<label for="submit">Valider :</label>
                <input type="submit" name="envoyer" value="Envoyer mon message" id="submit" />
                
                <?php
						}
				?>
                        
                </form>
                </div>
                
		</div>
        
        
        <div id="right">
        	<h3>Contactez le groupe </h3>
    
                <p> <!-- Texte intro au formulaire de contact! -->
                        <?php 	$req_contact = mysql_query("SELECT texte FROM contact LIMIT 0,1");
								while($contact = mysql_fetch_array($req_contact) )
                        		{	echo nl2br($contact['texte']);	}
						?>                
                </p>
        </div>
		
        
        <?php include("include/footer.php"); ?>
		
        
        
    </div> <!-- Corps-->


<div class="space"></div> <!-- Correspond à l'espace de fin de page -->


</body>
</html>
A voir également:

4 réponses

il faut utiliser utf8_encode($_POST['xxx'] pour l'insertion dans la base MYSQL et utf8_decode($_POST['xxx'] dans le mail, ca marche très bien j'avais le même problème
1
IpIpIpIpOne Messages postés 436 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 24 mai 2009 116
13 avril 2009 à 23:31
Salut !

Essaye ptet d'utiliser utf8_encode() plutôt qu' utf8_decode, ça me parait plus logique. Enfin, je me trompe peut-être !

Cordialement,

IpIpIp Ipone
0
Bonjour IpIpIpIpOne,

Merci de ton aide, j'ai remplacé tous mes utf8_decode() par des utf8_encode(), mais je crois que c'est encore pire... :/

Voici le résultat obtenu, sur une seule ligne (Alors que j'ai tapé des entrées dans mon textarea...) :

Monsieur Toto, entreprise TotoCorp, vous a laissé un message : Petit test encore sur les accents :\r\n\r\nààééùù


Heeelp =(
0
Alors, petite nouveauté :

Je viens de mettre toute la page en ISO-8859-1, et j'ai viré toute fonction encode / decode en utf8.
J'obtiens un résultat plus propre, mais malheureusement j'obtiens toujours des \n \r dans mon mail...
Y'a t'il un rapport avec ma fonction htmlspecialchars? Ou bien ma fonction nl2br est t'elle mal placée?
Pour rappel :

$message_envoi = nl2br(mysql_real_escape_string(htmlspecialchars($_POST['message_envoi'])));

Et voici ce que j'obtiens :

Monsieur Toto2, entreprise TotoCorp, vous a laissé un message : Encore petit test :) :) :)\r\n\r\nééààùùè
0
Re bonjour tout le monde,

Je pense avoir résolu mon problème, mais il laisse place à un nouveau problème... :/
Lors du traitement de mon message dans le textarea, j'ai supprimé le mysql_real_escape_string(), ce qui supprime mes \n et \r dans le mail reçu, et je peux donc voir mes retour à la ligne.

Voici la ligne de code qui traite mon message :

$message_envoi = utf8_decode(trim(nl2br(htmlspecialchars($_POST['message_envoi']))));


Maintenant, mon problème est le suivant : Comment sécuriser ma BDD tout en gardant mes retours chariot dans le message ?
0
Up please ! =(
0
Y'a un truc que j'ai pas pigé dans ce que tu dis.

mysql_real_escape_string() s'utilise avant l'insertion dans une table, pas pour l'envoi d'un email...
0
Hum d'accord, je pensais qu'il fallait la mettre quand même...
Merci de l'info!
Donc selon toi, inutile de protéger davantage mon $_POST['message_envoi'] ??
0