Accueil
Forums
Turoriaux
Inscription
Connexion
Fil RSS
Bienvenue invité !
Dimanche 21 Mars 2010
Vous êtes ici: Crea-paradise.com > Tutoriaux > Conception web > PHP > Formulaire contact avec administration

Formulaire contact avec administration



Informations sur le tutorial
Image du tutorial Auteur : Francky03 Commentaires : 17
Note : Note: 5/5 Vu : 61140
Date : 23/06/2007 à 11h46 Actions : Commenter et noter ce tutorial
Dernière modification : 17/07/2007 à 14h08
Développement web - Web 2.0 - Infographie - SEO - Ergonomie - Linux


Bonjour.

Ce tutorial est donc un formulaire de contact avec administration.
Durant tout le tutorial, je mettrai des commentaires sur les codes et des explications en-dessous .

Bonne chance à tous .

-----

Nous voilà à la table MySQL .

Donc, voici une table très simple:

Code MYSQL:
CREATE TABLE `contact` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `pseudo` VARCHAR(255) NOT NULL,
  `message` TEXT NOT NULL,
  `email` VARCHAR(255) NOT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;


Ainsi, lorsqu'on traduit, cela donne:

Création de la table "contact" avec comme champ:
- Id de type int qui a pour valeur 11, et qui est en auto-increment.
- Pseudo de type varchar, qui a pour valeur 255.
- Message de type text.
- Email de type varcher, qui a pour valeur 255.

Voilà, rien de bien compliqué, une table des plus banales qui existent !

-----

Nous voilà enfin au code PHP .

Pour commencer, on va faire la page contact.php qui contiendra le formulaire et le traitement du formulaire.

Traitement du formulaire.

Code PHP:
//On définit les variables avec un maximum de sécurité.

$message = nl2br(htmlspecialchars(trim($_POST['message'])));
$pseudo = htmlspecialchars(trim($_POST['pseudo']));
$email = htmlspecialchars(trim($_POST['email']));

if (!empty($_POST['message']) && ($_POST['email']))
{
//Connexion à la base de données.
mysql_connect('host', 'username', 'password');
mysql_select_db('bdd_name');

//On fait la requête SQL
mysql_query("INSERT INTO contact VALUES ('', '".$pseudo."', '".$message."', '".$email."')") or die (mysql_error ());

echo "Vous avez bien envoyé votre message.";
}


Pour commencer, on traite les données et on les envoie dans la base de données.

Reprenons ce code, petit bout par petit bout :

Code PHP:
//Connexion à la base de données.
mysql_connect('host', 'username', 'password');
mysql_select_db('bdd_name');


On se connecte tout d'abord à la base de données.

Code PHP:
//On définit les variables avec un maximum de sécurité
$message = nl2br(htmlspecialchars(trim($_POST['message'])));
$pseudo = htmlspecialchars(trim($_POST['pseudo']));
$email = htmlspecialchars(trim($_POST['email']));


On définit plusieurs variables utiles.

Code PHP:
//On fait la requête SQL
mysql_query("INSERT INTO contact VALUES ('', '".$pseudo."', '".$message."', '".$email."')") or die (mysql_error ());


Enfin, on exécute la requête SQL.

Passons maintenant au formulaire.

Code (x)HTLM:
<p><em>Vous êtes obligés de mettre votre e-mail avec votre message. Car si vous ne le mettez pas, et que vous avez posé une question, nous ne pourrons pas y répondre.</em></p>

<form action="contact.php" method="post">
<p>
Pseudo: <input class="case" type="text" name="pseudo" /><br/><br/>
Email: <input class="case" type="text" name="email" /><br/><br/>
Message: <br/>
<textarea class="textarea" name="message"></textarea><br/><br/>

<input class="bouton" type="submit" value="Valider" />
</p>
</form>


Je vais pas discuter trois heures sur ce formulaire, je pense que tout le monde le comprend .


Maintenant il faut faire la page admin.php

Code PHP:
<h2>Message de la rubrique contact</h2>

<?php

//Connexion à la base de données.
mysql_connect('host', 'username', 'password');
mysql_select_db('bdd_name');

$reponse = mysql_query("SELECT pseudo,message,email FROM contact ORDER BY id DESC LIMIT 0, 5") or die (mysql_error ());


// On fait une boucle pour lister tout ce que contient la table :

while ($donnees = mysql_fetch_assoc($reponse) )
{

?>

<p>
<u>Pseudo:</u> <?php echo $donnees['pseudo'] ;?> <br/> <u>E-mail:</u> <?php echo $donnees['email'] ;?> <br/> <u>Message:</u> <?php echo $donnees['message'] ;?>
</p><br />

<?php } ?>


Les détails du code s:

Code PHP:
//Connexion à la base de données.
mysql_connect('host', 'username', 'password');
mysql_select_db('bdd_name');


On se connecte à la base de données.

Code PHP:
$reponse = mysql_query("SELECT * FROM pseudo,message,email ORDER BY id DESC LIMIT 0, 5") or die (mysql_error ());


// On fait une boucle pour lister tout ce que contient la table :

while ($donnees = mysql_fetch_assoc($reponse) )
{

?>

<p>
<u>Pseudo:</u> <?php echo $donnees['pseudo'] ;?> <br/> <u>E-mail:</u> <?php echo $donnees['email'] ;?> <br/> <u>Message:</u> <?php echo $donnees['message'] ;?>
</p><br />
<?php } ?>


On fait une boucle pour lister les données.

-----

Et oui, je vous ai prévu un petit bonus.
En prime comme quoi vous avez été gentils et que vous êtes vennus voir mon tutorial je vous ai fait une surprise.
Je vais améliorer l'administration en ajoutant un module pour répondre aux messages directement sur le site.

Pour commencer, rajouter ça dans le PHP dans la page admin.php juste après la requète SQL:

Code PHP:
if(($_POST['message'] == true) && ($_POST['destinataire'] == true))
{
$destinataire = ''.$_POST['destinataire'].'';
$objet = "Réponse au message que vous avez laissé sur <Nom_Du_Site>";
$messageAdmin = ''.nl2br(htmlspecialchars(trim($_POST['message']))).'';
$from = 'From: <Votre_Email>';
mail($destinataire,$objet,$messageAdmin,$from);

echo'Votre message adressé à '.$destinataire.' a été correctement envoyé.';
}


Donc on traite le formulaire que l'on a envoyé plutôt et on envoit un e-mail à la personne concernée.

Et maintenant, dans le mysql_fetch_assoc on met ça à la place:

Code PHP:
<p>
<u>Pseudo:</u> <?php echo $donnees['pseudo'] ;?> <br/> <u>E-mail:</u> <?php echo $donnees['email'] ;?> <br/> <u>Message:</u> <?php echo $donnees['message'] ;?><br />
<br />
<b>Répondre à ce message:</b>
<form action="admin.php" method="post">
<u>Message:</u><br />
<textarea class="textarea" name="message"></textarea><br/>
<u>Destinataire:</u><br />
<input type="text" name="destinataire" value="<?php echo $donnees['email'] ;?>" />
<input class="bouton" type="submit" value="Valider" />
</form><br />
-----------------------------------------------<br />
</p>


Et voilà.

-----

Bon voilà, au lieu de lister que les 5 derniers messages on va mettre une pagination.

Donc voilà le code complet de la page admin2.php:

Code PHP:
<h2>Message de la rubrique contact</h2>

<?php

if(($_POST['message'] == true) && ($_POST['destinataire'] == true))
{
$destinataire = ''.$_POST['destinataire'].'';
$objet = "Réponse au message que vous avez laissé sur <Nom_Du_Site>";
$messageAdmin = ''.nl2br(htmlspecialchars(trim($_POST['message']))).'';
$from = 'From: <Votre_Email>';
mail($destinataire,$objet,$messageAdmin,$from);

echo'Votre message adressé à '.$destinataire.' a été correctement envoyé.';
}

//Connexion à la base de données.
mysql_connect('host', 'root', 'password');
mysql_select_db('bdd_name');

// On met dans une variable le nombre de messages qu'on veut par page
$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir :o)

// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM contact');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];

// On calcule le nombre de pages à créer
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);

// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i  )
{
    echo '<a href="admin.php?page=' . $i . '">' . $i . '</a> ';
}

if (isset($_GET['page']))
{
    $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (?page=4)
}
else // La variable n'existe pas, c'est la première fois qu'on charge la page
{
    $page = 1; // On se met sur la page 1 (par défaut)
}

// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;

$reponse = mysql_query('SELECT pseudo,message,email FROM contact ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);

// On fait une boucle pour lister tout ce que contient la table :

while ($donnees = mysql_fetch_assoc($reponse) )
{

?>

<p>
<u>Pseudo:</u> <?php echo $donnees['pseudo'] ;?> <br/> <u>E-mail:</u> <?php echo $donnees['email'] ;?> <br/> <u>Message:</u> <?php echo $donnees['message'] ;?><br />
<br />
<b>Répondre à ce message:</b>
<form action="admin.php" method="post">
<u>Message:</u><br />
<textarea class="textarea" name="message"></textarea><br/>
<u>Destinataire:</u><br />
<input type="text" name="destinataire" value="<?php echo $donnees['email'] ;?>" />
<input class="bouton" type="submit" value="Valider" />
</form><br />
-----------------------------------------------<br />
</p>
<?php }

mysql_close();

?>


Le code par petits bouts:

Code PHP:
if(($_POST['message'] == true) && ($_POST['destinataire'] == true))
{
$destinataire = ''.$_POST['destinataire'].'';
$objet = "Réponse au message que vous avez laissé sur <Nom_Du_Site>";
$messageAdmin = ''.nl2br(htmlspecialchars(trim($_POST['message']))).'';
$from = 'From: <Votre_Email>';
mail($destinataire,$objet,$messageAdmin,$from);

echo'Votre message adressé à '.$destinataire.' a été correctement envoyé.';
}


Ca c'est l'envois de l'e-mail.

Code PHP:
//Connexion à la base de données.
mysql_connect('host', 'root', 'password');
mysql_select_db('bdd_name');


La connexion à la BDD

Code PHP:
// On met dans une variable le nombre de messages qu'on veut par page
$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir :o)

// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM contact');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];

// On calcule le nombre de pages à créer
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);

// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i  )
{
    echo '<a href="admin.php?page=' . $i . '">' . $i . '</a> ';
}

if (isset($_GET['page']))
{
    $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?page=4)
}
else // La variable n'existe pas, c'est la première fois qu'on charge la page
{
    $page = 1; // On se met sur la page 1 (par défaut)
}

// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;

$reponse = mysql_query('SELECT pseudo,message,email FROM contact ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);


Le système de pagination.

Code PHP:
// On fait une boucle pour lister tout ce que contient la table :

while ($donnees = mysql_fetch_assoc($reponse) )
{

?>

<p>
<u>Pseudo:</u> <?php echo $donnees['pseudo'] ;?> <br/> <u>E-mail:</u> <?php echo $donnees['email'] ;?> <br/> <u>Message:</u> <?php echo $donnees['message'] ;?><br />
<br />
<b>Répondre à ce message:</b>
<form action="admin.php" method="post">
<u>Message:</u><br />
<textarea class="textarea" name="message"></textarea><br/>
<u>Destinataire:</u><br />
<input type="text" name="destinataire" value="<?php echo $donnees['email'] ;?>" />
<input class="bouton" type="submit" value="Valider" />
</form><br />
-----------------------------------------------<br />
</p>
<?php }


Le listage des données.

Code PHP:


On ferme la session MySQL et on ferme la balise PHP.

Et voilà .

Moi mon choix est vite fait entre le système de pagination et le listage des 5 derniers messages !

Je choisis le système de pagination !

Bon bas ce deuxième bonus est terminé j'espère qu'il vous sera très utile.

-----

Et voilà, ce tutorial est enfin fini .

Améliorer ce script

Pour améliorer ce tuto vous pouvez:
- Intégrer un design avec de class et des id.
- Ajouter des options sur le formulaire.
- Envoyer un e-mail à l'administrateur lorsqu'un message est envoyé.
- Autres...

J'éspère que ce tuto vous a plu .

Démonstration du script:

Page contact.php

Cliquez ici

Page admin.php

Cliquez ici

Et la page admin2.php avec le deuxième bonus dessus:

Cliquez ici


17 commentaires



> Posté le : 26/06/2007 à 16h31 | Note : Note: 5/5
Aucun avatar


Groupe : Membres


Bravo!!
> Posté le : 26/06/2007 à 17h59 | Note : Note: 5/5
Avatar de lbeetls01


Groupe : Membres


Y a juste un petit problème avec les lignes. Tu as juste oublié un nl2br() avant l'envoi des messages
Sinon super ! Bravo

Crea-paradise - Créateurs de rêves

Pas d'aide par MP, les forums sont là pour ça .
> Posté le : 27/06/2007 à 17h35 | Note : Aucune
Avatar de Francky03


Groupe : Membres


Merci.

Pour le nl2br, peux-tu le rajouter Elbi s'il te plait ?
Merci .

Bonjour à tous.

Voilà mon site: http://astuces.redby.fr
J'y répertorie des astuces que je trouve sur internet que j'utilise et qui me semblent bonnes.

Merci, bye.
> Posté le : 28/06/2007 à 00h08 | Note : Note: 5/5
Avatar de myGot


Groupe : Membres


Très sympa, bravo. 


Mes Tutoriaux : Effet Néon | Effet 3D
TREVISAN brice

> Posté le : 15/07/2007 à 01h14 | Note : Aucune
Avatar de Riesu


Groupe : Membres


Super c'est ce que je cherchais !
Merci beaucoup 
> Posté le : 17/07/2007 à 14h08 | Note : Aucune
Avatar de lbeetls01


Groupe : Membres


Citation: Francky03
Merci.

Pour le nl2br, peux-tu le rajouter Elbi s'il te plait ?
Merci .


Voilà
Mais il faudrais maintenant que tu modifie ta démo avec les nouveaux codes

Crea-paradise - Créateurs de rêves

Pas d'aide par MP, les forums sont là pour ça .
> Posté le : 23/07/2007 à 01h01 | Note : Aucune
Avatar de VirusX


Groupe : Membres


Bravo super tuto j'aime beaucoup 
> Posté le : 23/07/2007 à 01h02 | Note : Note: 5/5
Avatar de VirusX


Groupe : Membres


oups j'allais oublié la note
> Posté le : 08/08/2007 à 14h58 | Note : Note: 4/5
Aucun avatar


Groupe : Membres


Bonjour,

cela fait quelques jours que j'ai décidé d'apprendre PHP et par la même occasion SQL, et je me suis dit qu'un formulaire de contact serait une bonne façon d'apprendre. Disons que la théorie me répulse au plus haut point, je préfère bien plus la pratique que je comprends.

Revenons-en à nos moutons. J'ai donc testé ton formulaire de contact, je me suis en partie basé dessus pour faire le mien, et quand vient l'étape de la pagination, un évènement étrange se produit : ma page "admin.php" contient "Page : 1111111111111111111111111111111". La liste de "1" se poursuit indéfiniment.

J'ai donc repris à zéro, en copiant/collant bêtement le contenu de ton tutoriel, la meilleure façon donc de voir si j'ai foiré quelque part, le même effet se produit.

Y aurait-il une erreur quelque part sur ce tuto ? Mon hébergeur emploie PHP5 et MySQL donc à ce niveau ça me semble correct.

Bref, si quelqu'un pouvait m'aider, ça serait bien sympa. J'aime pas rester sur une erreur et ça pourrait m'aider à comprendre pour éviter de reproduire la bourde à l'avenir.

Merci d'avance.
> Posté le : 08/08/2007 à 15h44 | Note : Note: 5/5
Aucun avatar


Groupe : Membres


C'est re-moi !

En cherchant ailleurs, on a fini par m'expliquer la cause du problème. L'instruction for provoque une boucle infinie (ça j'avais compris), provoquée par l'absence de "++". Donc, ton code doit être modifié de cette façon :
Code PHP:

// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++  )
{
    echo '<a href="admin.php?page=' . $i . '">' . $i . '</a> ';
}


Très chouette tuto, du coup.
Et je peux enfin reprendre le dev de ma propre version.