8791 sujets

Développement web côté serveur, CMS

Bonjour,

Alors voilà, après avoir lu de multiples et multiples tuto et parcouru de multiples et multiples forums, j'ai toujours un problème avec mon script php..
Je ne sais pas quel est le problème, mais après avoir cliqué sur "envoyer" dans mon formulaire de contact, il ne se passe rien..
J'implore donc votre aide ; voici mon script :

<?php
	if(!empty($_POST['nom']) && !empty($_POST['adresse']) && !empty($_POST['code_postal']) && !empty($_POST['ville']) && 
		!empty($_POST['num_tel']) && !empty($_POST['email']) && !empty($_POST['objet']) && !empty($_POST['nombre']) && 
		!empty($_POST['taille']) && !empty($_POST['prix']) && !empty($_POST['couleurs']) && !empty($_POST['remarque']))
    extract($_POST);
{
    /* Récupération des valeurs des champs du formulaire */
    if (get_magic_quotes_gpc())
    {
      $nom				= stripslashes(trim($_POST['nom']));
      $adresse	     	= stripslashes(trim($_POST['adresse']));
      $code_postal		= stripslashes(trim($_POST['code_postal']));
      $ville			= stripslashes(trim($_POST['ville']));
      $num_tel			= stripslashes(trim($_POST['num_tel']));
	  $email			= stripslashes(trim($_POST['email']));
      $objet			= stripslashes(trim($_POST['objet']));
	  $nombre			= stripslashes(trim($_POST['nombre']));
      $taille			= stripslashes(trim($_POST['taille']));
	  $prix				= stripslashes(trim($_POST['prix']));
      $couleurs			= stripslashes(trim($_POST['couleurs']));
      $remarque			= stripslashes(trim($_POST['remarque']));
    }
    
    /* On vérifie que tous les champs sont remplis */
    elseif (empty($nom)
           || empty($adresse)
           || empty($code_postal)
           || empty($ville)
		   || empty($num_tel)
           || empty($email)
		   || empty($objet)
		   || empty($nombre)
           || empty($taille)
           || empty($prix))
    {
      $echo = 'Veuillez remplir les champs indiqués d\'un *.';
    }
    /* On vérifie que le format de l'e-mail est correct */
    elseif (!preg_match($regex_mail, $email))
    {
      $echo = 'Adresse e-mail non valide.';
    }
    /* On vérifie qu'il n'y a aucun header dans les champs */
    elseif (preg_match($regex_head, $nom) 
            || preg_match($regex_head, $adresse) 
            || preg_match($regex_head, $code_postal)
			|| preg_match($regex_head, $ville) 
            || preg_match($regex_head, $num_tel)
			|| preg_match($regex_head, $email) 
            || preg_match($regex_head, $objet)
			|| preg_match($regex_head, $nombre)
			|| preg_match($regex_head, $taille) 
            || preg_match($regex_head, $prix)
			|| preg_match($regex_head, $couleurs) 
			|| preg_match($regex_head, $remarque))
    {
        $echo = 'En-têtes interdites dans les champs du formulaire.';
    }
    /* Si aucun problème et aucun cookie créé, on construit le message et on envoie l'email */
    elseif (!isset($_COOKIE['sent']))
    {
        /* Destinataire */
        $to = 'seewald.andy@gmail.com';
      
        /* Construction du message */
        $msg .= 'Nouvelle commande !'."\r\n\r\n";
        $msg .= 'Nom :'.$nom.' '."\r\n";
        $msg .= 'Adresse :'.$adresse.' ."\r\n" '.$code_postal.' ."\r\n" '.$ville.''."\r\n";
        $msg .= 'Numéro :'.$num_tel.''."\r\n"; 'E-mail :'.$email.''."\r\n\r\n";
		
        $msg .= 'Objet :'.$objet.''."\r\n";
		$msg .= 'Qté :'.$nombre.''."\r\n";
		$msg .= 'Taille :'.$taille.''."\r\n";
		$msg .= 'Prix :'.$prix.''."\r\n";
		$msg .= 'Couleurs :'."\r\n";
		$msg .= '$couleurs';
        $msg .= 'Remarque/personnalisation :'.$remarque.''."\r\n";
        
        /* En-tête de l'email */
        $headers = 'From: '.$email.''."\r\n\r\n";
    }
	else
    {
      $nom				= trim($_POST['nom']);
      $adresse	     	= trim($_POST['adresse']);
      $code_postal		= trim($_POST['code_postal']);
      $ville			= trim($_POST['ville']);
      $num_tel			= trim($_POST['num_tel']);
	  $email			= trim($_POST['email']);
      $objet			= trim($_POST['objet']);
	  $nombre			= trim($_POST['nombre']);
      $taille			= trim($_POST['taille']);
	  $prix				= trim($_POST['prix']);
      $couleurs			= trim($_POST['couleurs']);
      $remarque			= trim($_POST['remarque']);
    }
	
	/* Expression régulière permettant de vérifier si le 
    * format d'une adresse e-mail est correct */
    $regex_mail = '/^[-+.\w]{1,64}@[-.\w]{1,64}\.[-.\w]{2,6}$/i';
    
    /* Expression régulière permettant de vérifier qu'aucun 
    * en-tête n'est inséré dans nos champs */
    $regex_head = '/[\n\r]/';
	
        /* Envoi de l'email */
        if(mail($to, $msg, $headers))
        {
            $echo = 'Merci. Votre commande a bien été prise en compte.';
            
            /* On créé un cookie de courte durée (ici 120 secondes) pour éviter de 
            * renvoyer un mail en rafraichissant la page
           * setcookie("sent", "1", time() + 120); */
            
            /* On détruit la variable $_POST */
            unset($_POST);
        }
        else
        {
            $echo = 'Erreur. Message non envoyé.';
        }

}
?>


Si ça peut vous aider, voici mon site qui est déjà en ligne : http://www.objets-decobois.com
Allez dans l'onglet "Commande" dans le premier menu de gauche et comme je le disais avant, en cliquant sur "Envoyer" : page blanche :s

Voilà, je vous remercie d'avance pour votre aide,
End-y
Bonsoir,

la denière condition n'est peut-être pas complète :


if(mail($to, $msg, $headers))


essaies avec ceci :


if(mail($to, $msg, $headers)==true)
humm, juste une question simple, dans ton document traitement.php, tu as quoi comme autre ligne de code? pas un seul bout de html? Smiley eek
Ton code est vraiment très compliqué pour rien, tu fais plein d'actions redondantes et d'erreurs :

- Tu vérifies 2 fois si tes variables sont vides
- Tu fais un extract() (au mauvais endroit) de $_POST et après tu retraites toutes les variables $_POST une par une.
- Tu vérifies si tu as des injections sur des champs qui ne peuvent pas en contenir en plus tu fais des trim() sur tes champs ce qui qui empêche la plupart des injections (en plus tu le fais 2 fois, au début et à la fin du script).
- Le stipslashes tu es sûr d'en avoir besoin ?
- Le coup du cookie pour empêcher une double soumission c'est vraiment bourrin, un simple jeton sauvé en session suffit.
- Les regex pour valider une adresse email ça ne sert à rien, PHP le fait en natif (fonction filter_var()).
- Les messages d'erreurs du genre : "En-têtes interdites dans les champs du formulaire.". Tu penses vraiment qu'un utilisateur peut comprendre ça ?
- Il manque le paramètre sujet à la fonction mail().
- Tu t'embrouilles dans tes concaténations de chaînes et le résultat est faux (variable $msg).

Bref (j'ai pas remplacé le code du cookie par un jeton parce que j'ai pas le code de ton formulaire) :


<?php

function sanitize($value, $stripslashes) {
	if ($stripslashes) { $value = stripslashes($value); }
	return trim(strip_tags($value));
}

if (!empty($_POST))
{
	/* Extrait le tableau post en nettoyant les valeurs */
	$stripslashes = get_magic_quotes_gpc();
	
	foreach ($_POST as $key => $value) {
		$$key = sanitize($value, $stripslashes);
	}

	/* On vérifie que tous les champs obligatoires sont remplis */
	if (
    	empty($nom) || empty($adresse) || empty($code_postal) || empty($ville) || 
    	empty($num_tel) || empty($email) || empty($objet) || empty($nombre) || 
    	empty($taille) || empty($prix))
	{
		$echo = 'Veuillez remplir les champs indiqués d\'un *.';
	}

	/* On vérifie que le format de l'e-mail est correct */
	elseif (filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
	{
		$echo = 'Adresse e-mail non valide.';
	}

	/* Si aucun problème et aucun cookie créé, on construit le message et on envoie l'email */
	elseif (!isset($_COOKIE['sent']))
	{
		 /* Destinataire */
		$to = 'seewald.andy@gmail.com';
		
		/* Construction du message */
		$msg  = 'Nouvelle commande !'."\r\n\r\n";
		$msg .= 'Nom :'.$nom."\r\n";
		$msg .= 'Adresse :'.$adresse."\r\n".$code_postal."\r\n".$ville."\r\n";
		$msg .= 'Numéro :'.$num_tel."\r\n";
		$msg .= 'E-mail :'.$email."\r\n\r\n";
		$msg .= 'Objet :'.$objet."\r\n";
		$msg .= 'Qté :'.$nombre."\r\n";
		$msg .= 'Taille :'.$taille."\r\n";
		$msg .= 'Prix :'.$prix."\r\n";
		$msg .= 'Couleurs :'."\r\n";
		$msg .= $couleurs ."\r\n";
		$msg .= 'Remarque/personnalisation :'.$remarque."\r\n";
		
		/* En-tête de l'email */
		$headers = 'From: '.$email."\r\n";

		/* Envoi de l'email */
		if(mail($to, 'Nouvelle commande', $msg, $headers))
		{
			$echo = 'Merci. Votre commande a bien été prise en compte.';
		
			/* On créé un cookie de courte durée (ici 120 secondes)
			 * pour éviter de renvoyer un mail en rafraichissant la page
			 */
			setcookie("sent", "1", time() + 120);
		}
		else
		{
		  $echo = 'Erreur. Message non envoyé.';
		}
	}
}
echo $echo;
?>

Modifié par jb_gfx (14 Sep 2011 - 16:01)
Oh merci ; vous êtes géniaux !! ça marche ! Smiley biggrin

@jb_gfx : Merci beaucoup pour tes rectifications ! Smiley biggrin

@FloydinBremen : non je n'ai pas de code html Smiley confused mais je pense devoir en faire car le nouveau code de jb_gfx en demande un.. Smiley langue

Mais justement, je voulais encore vous demander si vous saviez comment (je suis vraiment désolé Smiley confus ) faire en sorte qu'une petite fenêtre transparente apparaisse et dise : "Merci, bien envoyé" ou "tous les champs doivent être remplis" etc.. (je crois que c'est du javascript Smiley rolleyes Smiley confus ) puis qu'elle disparaisse et que si le mail est envoyé, les internautes soient redirigés sur ma page d'accueil.

Merci bcp Smiley biggrin

PS : voici mon script HTML (pour le jeton) et d'ailleurs c'est quoi un jeton ?? ^^'

<div id="corps">
			<div class="formulaire">
			<h2>Commande</h2>
			<h4>Bienvenue dans l'espace <em>commande</em> de ce site web. Remplissez ce formulaire et envoyez le moi, 
			je vous contacterai ensuite par téléphone ou par e-mail afin de confirmer votre commande, avant de définir une date à laquelle nous nous rencontrerons
			chez moi.</h4>
		<form name="commande" method="post" action="traitement.php">
			<fieldset>
					<legend>Vos coordonnées</legend>
				<label for="nom">Votre nom</label> * <input type="text" name="nom" id="nom" size="30" /><br /><br />
				<label for="adresse">Votre adresse</label> * <input type="text" name="adresse" id="adresse" size="50"/><br /><br />
				<label for="code_posal">Code postal</label> * <input type="text" name="code_postal" id="code_postal" size="4" maxlength="5" />
				<label for="ville">Ville</label> * <input type="text" name="ville" id="ville" size="30" /><br /><br />
				<label for="num_tel">Téléphone</label> * <input type="text" name="num_tel" id="num_tel" size="9" maxlength="10" />
				<label for="email">E-mail</label> * <input type="text" name="email" id="email" size="35" /><br />
				</fieldset><fieldset>
				
					<legend>Votre commande</legend>
				<label for="objet">Objet </label> * <input type="text" name="objet" id="objet" size="40" />
				<label for="nombre">Qté </label> * <input type="text" name="nombre" id="nombre" size="8" maxlength="2"/><br /><br />
				<label for="taille">Taille (cm)</label> * <input type="text" name="taille" id="taille" size="8" maxlength="3" />
				<label for="prix">Prix (EUR)</label> * <input type="text" name="prix" id="prix" size="8" maxlength="3" /><br /><br />
				<label for="couleurs">Couleurs </label> * <br /><input type="text" name="partie1" id="partie1" size="20" value="	partie de l'objet" onclick="if (value=='	partie de l\'objet'){value=''}; this.focus();"/> : 
						<input type="text" name="couleur1" id="couleur1" size="30" value="	couleur de cette partie" onclick="if (value=='	couleur de cette partie'){value=''}; this.focus();"/><br />
						<input type="text" name="partie2" id="partie2" size="20" /> : 
						<input type="text" name="couleur2" id="couleur2" size="30" /><br />
						<input type="text" name="partie3" id="partie3" size="20" /> : 
						<input type="text" name="couleur3" id="couleur3" size="30" /><br />
						<input type="text" name="partie4" id="partie4" size="20" /> : 
						<input type="text" name="couleur4" id="couleur4" size="30" /><br /><br />
				<label for="remarque">Avez-vous des remarques ou une personnalisation à apporter ?</label><br /><textarea name="remarque" id="remarque" rows="5" cols="50"></textarea><br />
			</fieldset>
				<p><em>Les champs indiqués d'un * sont obligatoires.</em><br /></p>
				<h5><input type="submit" value="Envoyer" /><input type="reset" value="Effacer"/></h5>
		</form>
			</div>
	   </div>
re,

pour les jetons :

un article

humm :

a écrit :
non je n'ai pas de code html je pense devoir en faire car le nouveau code de jb_gfx en demande un.


le PHP et le HTML vivent très bien en couple, ils se mélangent à merveille (si j'ose dire Smiley lol ) Smiley ravi
Tu devrais approfondir tes connaissances en PHP, les copier/coller de scripts pris sur le web ne vont pas suffire.

pour le JavaScript, tu fais référence aux évenements. y a des bons tutos pour commencer. toutefois JavaScript et PHP en même temps, pour apprendre, c'est un peu beaucoup. la p'tite fenêtre dont tu parles c'est alert(), mais bon déclenchée trop souvent, cela agace les visiteurs.

Une notion t'as complètement échappé. ton formulaire dans ton document commande.html contient l'action "traitement.php". cela signifie que lorsque l'utilisateur soumet le formulaire, il est sensé se retrouver sur la page traitement PHP. Si cette page ne contient aucun élément html, l'utilisateur se retrouve sur une page blanche. Smiley cligne

le chemin est long mais cela vaut la peine, courage.
Merci pour tes conseils..

Pour les jetons, je n'ai pas compris où mettre quel code.. ^^'

Où dois-je placer celui-ci ? : $_SESSION['le-super-jeton'] = md5(uniqid(rand(), true));

Et celui-ci : <?php
if( !empty($_SESSION['le-super-jeton']) && $_SESSION['le-super-jeton']==$_GET['jet'] ){
// Ici le jeton est validé
}else{
// Ici c'est une tentative de CSRF
}
?>


Ou bien dois-je plutôt utiliser les "gros" jetons ? A ce moment là, je ne sais pas non plus où les placer Smiley decu ^^'

Je verrais pour le tuto.. et bien sûr, sur tes bons conseils, j'ajouterai du HTML sur ma page PHP ! Smiley cligne

Merci pr tout !! Smiley lol
l'article était pour expliquer ce qu'est un jeton.

bon, là :


$_SESSION['le-super-jeton'] = md5(uniqid(rand(), true));


c'est dans ton document commande.html, qui doit par conséquent devenir commande.php.

et là, c'est une fois que le formulaire á été soumis :


<?php
 if( !empty($_SESSION['le-super-jeton']) && $_SESSION['le-super-jeton']==$_GET['jet'] ){
 // Ici le jeton est validé
 }else{
 // Ici c'est une tentative de CSRF
 }
 ?>


recherche sur Google tu peux avoir d'autres articles bien faits.
Te prends pas trop la tête non plus la dessus, bosse le à côté.

Ton cookie fonctionne bien pour ce que tu veux faire. Quand je disais que c'est bourrin c'est que c'est un peu sortir le bazooka pour tuer une mouche, mais bon ça fonctionne. Pour un petit site c'est pas non plus super péjoratif (en terme de maintenance du code et de performance).