Formulaire php mail et stockage sql ?

Fermé
exocet91 Messages postés 5 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 8 janvier 2010 - 7 janv. 2010 à 14:08
spastore Messages postés 17 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 13 mars 2011 - 8 janv. 2010 à 12:22
Bonjour,

j'ai un formulaire php sur lequel je veux traiter l'envoi d'un message et ensuite le stockage dans ma base sql et ce, dans la même page. Mon problème est que je ne suis pas du tout calé, j'apprends, j'essaie de comprendre...je vous joins le code. Ce que je veux faire
1. c'est SI données non vide ALORS envoyer le mail (ça marche si je ne mets pas mon code de connexion Sql!) et SI envoie du mail OK, ALORS stocker les données et confirmer le mail...
2. Je me demande ce que fais ce code, car je n'ai pas l'écho du $message, et si je le supprime, ben ça marche plus !
if(isset($_POST["message"])=="ok")
$message.="Votre mail a bien été envoyé, ainsi que votre adresse IP : ".$_SERVER['REMOTE_ADDR']."\r\n" ;

Voici le code:

<form " method="post" >
<fieldset >
<legend>Formulaire de contact, champs * obligatoires !</legend> <br />
<table >
<tr><td width="150"> Nom : </td><td> <input name="nom" type ="text"/> * </td></tr>
<tr><td> Prénom : </td><td> <input name="prenom" type ="text"/> * </td></tr>
<tr><td> Téléphone :</td><td><input name="tel" type ="text"/> * </td></tr>
<tr><td> Votre adresse mail :</td><td> <input name="email" type ="text"/> * </td></tr>
<tr><td> VILLE :</td><td><input name="ville" type ="text"/> * </td></tr>
<tr><td> Code Postal :</td><td><input name="CP" type ="text"/> * </td></tr>
<tr><td height="150"> Votre message: </td><td><textarea cols=55 rows=10 name="demande" type="text"> </textarea> * </td></tr>
<tr><td> <input type="text" name="premiernombre" value=" <?php echo rand(0,100); ?>" size="2" readonly="readonly" />
<input type="text" name="secondnombre" value=" <?php echo rand(100, 200);?>" size="2"readonly="readonly" />
<input type="text" name="troisiemenombre" value=" <?php echo rand(0, 200);?>" size="2" readonly="readonly" /></td>
<td> Question anti-robots : (pour eviter les spams des robots)</td></tr>
<tr><td> <input type="text" name="question" size="6" /></td><br />
<td> Recopiez les nombres contenus dans les 1er et 3e champs (ci-contre) <br />
l\'un a la suite de l\'autre dans le champ en dessous :</td></tr>
<tr><td> <input type="submit" name="Envoyer" value="Envoyer"/></td>
<td><input type="reset" name="annuler" value="Effacer les champs"></td> </tr>
</table>
</fieldset>
</form>
<br /><br />

<?php

// On vérifie si les champs sont vides
if(empty($_POST))
{
if(isset($_POST["message"])=="ok")
$message.="Mail bien été envoyé, ainsi que votre adresse IP" .$_SERVER['REMOTE_ADDR']."\r\n" ;
}
else
{
$temp=array_map('trim', $_POST) ;
$post=array_map('htmlspecialchars', $temp) ;
$erreur='' ;

if(empty($post["nom"]))
$erreur.="Vous n'avez pas rempli le champ \"Votre Nom\".<br/>" ;
if(empty($post["email"]))
$erreur.="Vous n'avez pas rempli le champ \"Votre adresse e-mail\".<br/>" ;
if(!empty($post["email"]) && !preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#', $post["email"]))
$erreur.="L'adresse e-mail que vous avez rentré est incorrecte.<br/>" ;
if(empty($post["demande"]))
$erreur.="Vous n'avez pas rempli le champ \" Quel est votre message ? \".<br/>" ;
if($post["question"]!=$post["premiernombre"].$post["troisiemenombre"])
$erreur.="La réponse a la question anti-robots ne correspond pas a la réponse attendue !</a>" ;

if(empty($erreur))
{
if(mail('toto@voila.fr', stripslashes($post["demande"]), stripslashes("EXOCET : From M/Mmme ".$post["nom"].
":".$post["email"]." , Adresse IP : ".$_SERVER['REMOTE_ADDR']."\n
".$post["demande"]), "From: ".$post["email"]."\r\n
"."Reply-To: ".$post["email"]))

echo 'Votre mail a bien été envoyé !' ;
}
else
echo $erreur ;
}
?>
---------------------------- je ne sais pas comment intégrer le code qui suit pour stocker les données en même temps que l'envoi du mail, ou juste après envoi du mail ?? ---------
CODE :

<?php

// On commence par récupérer les champs (où dois mettre cette partie de code ? )
if(isset($_POST['nom'])) $nom=$_POST['nom']; else $nom="";
if(isset($_POST['prenom'])) $prenom=$_POST['prenom']; else $prenom="";
if(isset($_POST['email'])) $email=$_POST['email']; else $email="";
if(isset($_POST['tel'])) $tel=$_POST['tel']; else $tel="";
if(isset($_POST['ville'])) $ville=$_POST['ville']; else $ville="";
if(isset($_POST['CP'])) $CP=$_POST['CP']; else $CP="";
if(isset($_POST['demande'])) $demande=$_POST['demande']; else $demande="";

// Aucun champ n est vide on peut enregistrer dans la table (on a vérifier si les champs sont vides, c'est ok, donc j'aimerais envoyer mail et stocker les données en Sql SI condition champs "non vides=ok)

$db = mysql_connect('localhost', 'root', 'titi'); // connexion a la base
mysql_select_db('contacts',$db); // sélection de la base



$sql = "INSERT INTO contacts(id, nom, prenom, tel, email, CP, ville, demande) VALUES('','$nom','$prenom','$tel','$email',
'$CP','$ville','$demande')";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());

mysql_close(); // on ferme la connexion
?>


Par avance un grand merci à ceux qui prendrons un peu de leur temps pour m'expliquer "comment ça marche" lol, ...je tourne en rond pourtant je pense que je suis pas loin du but.
Ah oui, je ne veux pas que mon code ce connecte à la base sans que les champs soient remplis, car j'ai fait un code qui quand j'ouvre ou rafraichi la page me rentre systématiquement des données vides.

ENCORE MILLE merci et bonne année à tous
A voir également:

2 réponses

spastore Messages postés 17 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 13 mars 2011 30
7 janv. 2010 à 16:35
Voici la structure globale de ce que vous devez faire :

if (isset($_POST)) // Si on vient de valider le formulaire (sinon on fait rien)
if (!empty($_POST["nom"]) && !empty($_POST["prenom"]) ...) // si les champs sont bien remplis
{
$destinataire = "...";
$sujet = "...";
$message = "...";
$mail_ok = mail($destinataire, $sujet, $message); // on envoie le mail et on récupère le résultat
if ($mail_ok) // si le mail est bien parti
{
// ici on stocke dans la base de données :
// (préparation des données, mysql_connect, mysql_select_db, mysql_query)
// et on affiche confirmation à l'internaute
}
else
{
// ici, un message d'erreur car le mail n'est pas bien parti...
// en général les mails partent bien, sinon vérifiez le SMTP dans php.ini.
}
}

2. if(isset($_POST["message"])=="ok") est équivalent à if (isset($_POST["message"])), et cela permet de savoir si le formulaire vient d'être validé (par opposition à quand l'internaute arrive pour la première fois sur la page). Ca n'a rien à faire ici.

$message.="Votre mail a bien été envoyé, ainsi que votre adresse IP : ".$_SERVER['REMOTE_ADDR']."\r\n" ; : Ce message n'est pas affiché donc il ne sert à rien.

En analysant votre code, je vois que ces deux lignes (censées être exécutée la première fois qu'on arrive sur la page, c'est à dire lorsqu'on n'a pas encore validé le formulaire) ne servent à rien, et je vois beaucoup d'autres erreurs :

1. Vous devez faire : remplacez tout ce bloc :
if(empty($_POST))
{
if(isset($_POST["message"])=="ok")
$message.="Mail bien été envoyé, ainsi que votre adresse IP" .$_SERVER['REMOTE_ADDR']."\r\n" ;
}
else
{

Par :
if (isset($_POST))
{

2. Vous devez : remplacer tous les $post par $_POST (en respectant la casse)
0
exocet91 Messages postés 5 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 8 janvier 2010
7 janv. 2010 à 18:02
re-moi,

ben ça coince !!

Parse error: parse error in C:\wamp\www\multiservices_bricolage\traitement2.php on line 12 _ je dois avoir un problème de syntaxe mais lequel ??

----------------------------------------- code refait comme suit !! -----------------------
// Si on vient de valider le formulaire (sinon on fait rien)
if (isset($_POST)) {echo 'vous avez validé le formulaire';}

// On vérifie si les champs sont vides
$temp=array_map('trim', $_POST) ;
$_POST=array_map('htmlspecialchars', $temp) ;
$erreur='' ;

if(!empty($_POST["nom"])
$erreur.="Vous n'avez pas rempli le champ \"Votre Nom\".<br/>"; (c'est la ligne 12)
if(!empty($_POST["email"])
$erreur.="Vous n'avez pas rempli le champ \"Votre adresse e-mail\".<br/>" ;
if(!empty($_POST["email"]) && !preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#', $_POST["email"])
$erreur.="L'adresse e-mail que vous avez rentré est incorrecte.<br/>" ;
if(!empty($_POST["demande"])
$erreur.="Vous n'avez pas rempli le champ \" Quel est votre message ? \".<br/>" ;
if($_POST["question"]!=$_POST["premiernombre"].$_POST["troisiemenombre"])
$erreur.="La réponse a la question anti-robots ne correspond pas a la réponse attendue !</a>" ;

if(!empty($erreur))
{
if(mail('toto@yahoo.fr', stripslashes($_POST["demande"]), stripslashes("exocet : From M/Mmme ".$_POST["nom"].
":".$_POST["email"]." , Adresse IP : ".$_SERVER['REMOTE_ADDR']."\n
".$_POST["demande"]), "From: ".$_POST["email"]."\r\n
"."Reply-To: ".$_POST["email"]))

{ $db = mysql_connect('localhost', 'root', 'titi'); // connexion a la base
mysql_select_db('contacts',$db); // sélection de la base

$sql = "INSERT INTO contacts(id, nom, prenom, tel, email, CP, ville, demande) VALUES('','$nom','$prenom','$tel','$email',
'$CP','$ville','$demande')";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());

mysql_close(); // on ferme la connexion
}
echo 'envoi et données enregistrées, OK'

else { echo ' ça c pas bien passé :( ' }

}

?>

merci pour votre aide
à bientôt
0
exocet91 Messages postés 5 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 8 janvier 2010 > exocet91 Messages postés 5 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 8 janvier 2010
7 janv. 2010 à 18:40
ok,
il manquait une )
if(!empty($_POST["nom"]))

maintenant suis bloqué à la ligne 40:

else echo ' ça c pas bien] passé ' ( il doit pas être en bonne place !!)

Y'a t il quelq'un qui pourrait me recoller mes bouts de code comme il faut s'il vous plait, ça me permettrait de voir comment ça fonctionne, je dois rater des choses ...

merci
bonne soirée
0
spastore Messages postés 17 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 13 mars 2011 30 > exocet91 Messages postés 5 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 8 janvier 2010
7 janv. 2010 à 18:55
Pour l'erreur à la ligne 40, remplacez :

}
echo 'envoi et données enregistrées, OK'
else { echo ' ça c pas bien passé :( ' }


par :

echo 'envoi et données enregistrées, OK';
}
else { echo ' ça c pas bien passé :( ' }


Notez bien les deux erreurs :
- le ; manquant
- le } mal placé (le premier echo fait partie du "if", il doit donc être avant l'accolade)
0
exocet91 Messages postés 5 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 8 janvier 2010 > spastore Messages postés 17 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 13 mars 2011
8 janv. 2010 à 02:53
bon ben, je vais aller me coucher, j'en peux plus de tester ... Quelqu'un peut il mettre l'ordre qu'il faut dans les conditions s'il vous plait. Je vous joins le code complet -- il ENVOIE un mail et en // me STOCKE les variable rentrées en base ... LE PROBLEME, c'est qu'il me passe tte les conditions de cases et le captcha (complètement inopérants !!! ) --- il m'affiche bien ce qu'il a fait " envoi et données enregistrées, OK " mais s'il me passe les contraintes ça va pas !!!

voici le code:

<div id="formulaire" class="form">


<form " method="post" >
<fieldset >
<legend>Formulaire de contact, les champs * obligatoires !</legend> <br />
<table >
<tr><td width="150"> Nom : </td><td> <input name="nom" type ="text"/> * </td></tr>
<tr><td> Prénom : </td><td> <input name="prenom" type ="text"/> * </td></tr>
<tr><td> Téléphone : </td><td> <input name="tel" type ="text"/> * </td></tr>
<tr><td> Votre adresse mail : </td><td> <input name="email" type ="text"/> * </td></tr>
<tr><td> VILLE : </td><td> <input name="ville" type ="text"/> * </td></tr>
<tr><td> Code Postal : </td><td> <input name="CP" type ="text"/> * </td></tr>
<tr><td height="150"> Votre message: </td><td><textarea cols=55 rows=10 name="demande" type="text"> </textarea> * </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <input type="text" name="premiernombre" value=" <?php echo rand(0,100); ?>" size="2" readonly="readonly" />
<input type="text" name="secondnombre" value=" <?php echo rand(100, 200);?>" size="2"readonly="readonly" />
<input type="text" name="troisiemenombre" value=" <?php echo rand(0, 200);?>" size="2" readonly="readonly" /></td>
<td> Question anti-robots : (pour eviter les spams des robots)</td></tr>
<tr><td> <input type="text" name="question" size="6" /></td><br />
<td> Recopiez les nombres contenus dans les 1er et 3e champs (ci-contre) <br />
l\'un a la suite de l\'autre dans le champ en dessous :</td></tr>
<tr><td> <input type="submit" name="envoyer" value="Envoyer"/></td><td><input type="reset" name="annuler" value="Effacer les champs"></td> </tr>
</table>
</fieldset>
</form>
<br /><br />

<?php

if(!empty($_POST))
{

$temp=array_map('trim', $_POST) ;
$post=array_map('htmlspecialchars', $temp) ;
$erreur='' ;
// Si on vient de valider le formulaire (sinon on fait rien)
if(!empty($_POST["nom"]))
$erreur.="Vous n'avez pas rempli le champ \"Votre Nom\".<br/>";
if(!empty($_POST["email"]))
$erreur.="Vous n'avez pas rempli le champ \"Votre adresse e-mail\".<br/>" ;
if(!empty($_POST["email"]) && !preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#', $_POST["email"]))
$erreur.="L'adresse e-mail que vous avez rentré est incorrecte.<br/>" ;
if(!empty($_POST["demande"]))
$erreur.="Vous n'avez pas rempli le champ \" Quel est votre message ? \".<br/>" ;
if($_POST["question"]!=$_POST["premiernombre"].$_POST["troisiemenombre"])
$erreur.="La réponse a la question anti-robots ne correspond pas a la réponse attendue !</a>" ;
}
if(!empty($erreur))
{

// On récupère les variables (sinon il va stocker des cases vides)
$nom=$_POST['nom'];
$prenom=$_POST['prenom'];
$email=$_POST['email'];
$tel=$_POST['tel'];
$ville=$_POST['ville'];
$CP=$_POST['CP'];
$demande=$_POST['demande'];


if(mail('toto@yahoo.fr', stripslashes($_POST["demande"]), stripslashes("ultimatefrisbee : From M/Mmme ".$_POST["nom"].
":".$_POST["email"]." , Adresse IP : ".$_SERVER['REMOTE_ADDR']."\n
".$_POST["demande"]), "From: ".$_POST["email"]."\r\n
"."Reply-To: ".$_POST["email"]))
// ALORS -> connexion a la base
{ $db = mysql_connect('localhost', 'root', 'galere');
// sélection de la base
mysql_select_db('durdur',$db);
// insertion des variables $nom, $prenom... dans la base
$sql = "INSERT INTO contacts(id, nom, prenom, tel, email, CP, ville, demande) VALUES('','$nom','$prenom','$tel','$email',
'$CP','$ville','$demande')";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());

mysql_close(); // on ferme la connexion

echo 'envoi et données enregistrées, OK';
}
else echo 'ATTENTION PROBLEME';
}

?>
</div>

Comment organiser et avec quelles instructions passer chacune des conditions l'une après l'autre, avant qu'il n'aille me stocker et envoyer un mail vide ???

merci pour votre concours
à demain
0
spastore Messages postés 17 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 13 mars 2011 30 > exocet91 Messages postés 5 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 8 janvier 2010
8 janv. 2010 à 12:22
Bonjour, il me semble que le test suivant est à l'envers :
if(!empty($erreur))

En effet, on doit envoyer le courrier s'il n'y a pas d'erreur, donc si la variable $erreur est vide. Je le remplacerai donc par :
if (empty($erreur))

Ceci explique pourquoi le courrier part lorsqu'il y a une erreur. A l'inverse, il aurai du vous afficher une erreur lorsque tout allait bien (puisque le test est à l'envers).

Je m'étais trompé quand je vous avais dit de remplacer les $post par $_POST : je n'avais pas vu la ligne $post = array_map(...);

Ceci dit le htmlspecialchars ne sert à rien ici. Normalement on l'utilise uniquement au moment d'afficher dans le navigateur. Vous, vous l'appliquez à quelque chose qui va être envoyé par courrier électronique et inséré dans la base, ce qui va perturber l'affichage de certains caractères (par exemple, htmlspecialchars transforme < en & l t ;).
0
exocet91 Messages postés 5 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 8 janvier 2010
7 janv. 2010 à 16:57
Bonjour,
ok, un grand merci pour ces explications que je vais tenter de mettre en application, et si ça marche je poste le code complet, pour ceux qui auraient le même souci de débutant que moi ;)). J'ai commencé par créer une page traitement.php pour la traiter en action="traitement.php".
mille merci pour votre aide précieuse
James
0