Dans la phase de construction d'un site web, il peut être utile de véhiculer des informations d'une page à une autre.
Pourquoi ?
Imaginons le catalogue (catalogue.php) d'une boutique ecommerce avec plusieurs produits :
L'affichage ci-dessus est généré grâce à une requête SQL qui rappatrie toutes les données de la base.
La plupart du temps, nous pouvons cliquer sur ces produits et arriver sur la fiche produit contenant davantages d'informations détaillées.
Maintenant imaginons la fiche produit détaillée (ficheProduit.php) :
Êtes vous d'accord sur le fait que s'il y a 1500 produits, il n'y aura pas 1500 fichiers du type ficheProduit1.php, ficheProduit2.php, ficheProduit3.php, ficheProduit4.php, ficheProduit5.php, etc.
Bien entendu cela serait ingérable et le contraire de dynamique !
Par conséquent, nous aurons qu'un seul fichier se nommant ficheProduit.php et pouvant présenter potentiellement tous les produits. C'est ce qu'on appelle un template (un modèle de page pouvant présenter différents contenus)
Mais s'il n'y a qu'un seul fichier, comment saura t'il quel produit il doit présenter ?
Et bien nous n'allons pas arriver sur la page ficheProduit.php les mains vides, nous irons sur la page ficheProduit.php?idProduit=1 ou par exemple ficheProduit.php?idProduit=3 (pour le tshirt rouge).
Pour rappel, l'idProduit représente le numéro du produit dans la base de données
Ce système est le même pour tous les sites web ! Essayez donc de vous balader dans un site web ecommerce et vous verrez bien des informations passées dans l'url (si vous y faites attention).
Voici un exemple avec le site web de ZARA :
Ces informations n'apparaitront peut être pas aussi nettement que ?idProduit=1
car souvent les sites font de l'url rewriting (réécriture d'url).
L'affichage va donc être généré grâce à une requête SQL qui rappatriera 1 produit en particulier de la base (1 ligne de résultat).
Pour afficher le bon produit dans la fiche produit, vous l'aurez compris, il nous faudra passer et récupérer le bon numéro de produit dans l'url.
Pour passer un numéro de produit c'est très simple puisque nous n'avons besoin que du HTML :
Produit 1Le format a respecter est cle=valeur.
echo $_GET['idProduit'];C'est tout simple, il suffit de mettre le nom de la clé (définie auparavant dans le html).
1
<?php if(!empty($_GET['idProduit'])) { echo $_GET['idProduit']; }
Cliquez ici !Nous pouvons passer toutes les informations qui nous intéresse dans l'url à condition d'éviter les espaces, les accents, et de respecter le format
cle=valeur
.<?php if(!empty($_GET)) { echo "produit $_GET[produit]Pas de quotes dans les crochets d'un tableau array si l'instruction echo englobe le tout entre guillemets
"; echo "couleur $_GET[couleur]
"; echo "prix $_GET[prix]
"; echo implode ($_GET, " - "); echo ''; print_r($_GET); echo ''; }
Array ( [produit] => tshirt [couleur] => bleu [prix] => 30 )
clé | valeur |
produit | tshirt |
couleur | bleu |
prix | 30 |
Utiliser les formulaires avec PHP permet d’échanger des données avec l’internaute. C'est-à-dire, lui envoyer des données, mais aussi en recevoir de sa part.
Autant dire qu'un site web sans formulaire n'existe pas !
Les formulaires revienent très régulièrement sur les sites web, par exemple pour un formulaire de contact, un formulaire d'inscription en tant que membre, un formulaire de recherche, un formulaire de recrutement, un formulaire de satisfaction, un formulaire de commande, etc..
Comment récupérer les informations d'un formulaire ?
Nous savons qu'avec les langages Html et Css il est possible de concevoir un formulaire.
Voici donc un simple formulaire demandant une adresse (avec ville et code postal).
<form> </form>
.<label>
permet de créer une étiquette, son attribut for
et est relié à l'attribut id
de la balise <input>
(lorsqu'on clique sur le texte, le curseur se place dans la case de saisie).Label for et id
n'est donc pas d'une importance capitale pour faire fonctionner notre formulaire mais je vous recommande de toujours le prévoir car cela fait partie des normes accessiweb (pour les mal-voyants). Facilitons leur la navigation !placeholder
est également facultatif, il permet d'afficher une indication supplémentaire avec un texte opaque présaisi qui s'effacera lorsque l'internaute commencera à saisir au clavier des informations dans la case <input>
.name
est capital puisque sans lui nous ne pourrions pas récupérer les données même avec PHP.name
est indispensable !!!
Un attribut name
doit être écrit par élément de formulaire (1 name = 1 saisie récupérée). name
ne doit pas comporter d'espace, ni d'accent et de préférence ne pas contenir de majuscule (senssible à la casse).name
"cp" pour le champ code postalsubmit
est présent afin que l'on puisse valider le formulaire.<?php echo 'ville : ' . $_POST['ville'] . '
'; echo 'cp : ' . $_POST['cp'] . '
'; echo 'adresse : ' . $_POST['adresse'] . '
'; ?>
echo
peut être traduit par "affiche moi".echo $_POST['ville']
peut être traduit par "affiche moi la ville postée".<?php if(!empty($_POST)) { echo 'Recuperation des données saisies :
'; echo 'ville : ' . $_POST['ville'] . '
'; echo 'cp : ' . $_POST['cp'] . '
'; echo 'adresse : ' . $_POST['adresse'] . '
'; } ?>
print_r
:<?php if(!empty($_POST)) { echo 'Recuperation des données saisies :
'; echo 'ville : ' . $_POST['ville'] . '
'; echo 'cp : ' . $_POST['cp'] . '
'; echo 'adresse : ' . $_POST['adresse'] . '
'; echo ''; print_r($_POST); echo ''; } ?>
clé | valeur |
---|---|
ville | Paris (saisie de l'internaute) |
cp | 75015 (saisie de l'internaute) |
adresse | 30 rue de la convention (saisie de l'internaute) |
Si nous voulions ajouter la structure d'une page web (avec les entêtes, doctype, etc.), nous ferions comme ceci :
<?php $message = ''; if(!empty($_POST)) { $message .= 'Recuperation des données saisies :</body> </html>
'; $message .= 'ville : ' . $_POST['ville'] . '
'; $message .= 'cp : ' . $_POST['cp'] . '
'; $message .= 'adresse : ' . $_POST['adresse'] . '
'; } ?> <!Doctype html> <html> <head>Ma Page <meta charset="utf-8"> </head> <body><?php echo $message; ?>
echo
car sinon les informations s'afficheraient au dessus du doctype, leurs positionnements seraient assez contraignant et le code ne passerait pas la validation w3c.$message
qui va retenir l'affichage (les messages seront affectés à la variable).$message
ne sera pas affichée immédiatement mais un peu plus bas, à l'endroit de notre choix, dans les balises body /body afin de respecter la structure de la page web.
Après avoir récupéré et affiché les saisies d'un formulaire que fait-on ?
Nous pourrions, plus tard, envoyer ces données dans une base de données (c'est comme cela que fonctionnent les pages d'inscription d'un site web).
Nous pourrions également afficher un message de confirmation à l'internaute pour dire que sa validation a été enregistrée.
<!Doctype html> <html> <head></body> </html> Le fichier HTMLMa Page <meta charset="utf-8"> </head> <body>
<?php if(!empty($_POST)) { echo 'Recuperation des données saisies :
'; echo 'pseudo : ' . $_POST['pseudo'] . '
'; echo 'email : ' . $_POST['email'] . '
'; } ?>
Votre dossier est composé de 2 fichiers :
------ formulaire2.html
------ formulaire3.php
Nous allons faire en sorte de sauvegarder les données saisies (postées par les internautes) dans un fichier texte qui sera généré à la volée.
Pour cela, utilisons les fonctions prédéfinie de PHP : fopen, fwrite, fclose.
Reprenons le code Html suivant :
<!Doctype html> <html> <head></body> </html>Ma Page <meta charset="utf-8"> </head> <body>
<?php if(!empty($_POST)) { echo 'Recuperation des données saisies :
'; echo 'pseudo : ' . $_POST['pseudo'] . '
'; echo 'email : ' . $_POST['email'] . '
'; $f = fopen("sauvegarde.txt","a"); fwrite($f, $_POST['pseudo'] . " - "); fwrite($f, $_POST['email'] . "\n"); $f = fclose($f); } ?>
fopen()
permet d'ouvrir un fichier, ils attend 2 arguments, son nom et le mode d'ouverture.$f
représente le fichier ouvert.fwrite()
permet d'écrire dans le fichier représenté par $f
.fclose()
, n'est pas indispensable pour faire fonctionner l'exemple, cette fonction prédéfinie permet de fermer le fichier et ainsi libérer la ressource.
Suite à l'exemple précédent, le fichier liste.txt a été créé (généré) et contient des informations (pseudo et email) suite à la validation de notre formulaire.
Nous pouvons effectuer l'opération inverse, c'est à dire, se connecter au fichier en php et lire les informations contenues dedans à l'intérieur :
$nomFichier = "liste.txt"; $fichier = file($nomFichier); // la fonction file() fait tout le travail, elle retourne chaque ligne d'un fichier à des indices différents d'un tableau array. print ""; print_r($fichier); print ""; // Affichage du tableau Array dans sa structure. foreach($fichier as $ligne) // Parcours du tableau Array pour un affichage plus conventionnel. { echo $ligne."
"; } echo ''; echo implode($fichier, "
"); // Affichage du tableau Array avec un passage à la ligne.
$nomFichier
représente le nom du fichier à explorer (il faut que le fichier existe et soit dans le même dossier de préférence).file
est une fonction PHP prédéfinie permettant d'ouvrir un fichier et de retourner son contenu sous forme de tableau ARRAY (chaque ligne représentera une nouvelle clé du tableau array). Nous lui transmettons la variable $nomFichier
afin que le bon fichier soit ouvert.print_r
permet d'afficher le contenu et d'observer la structure du tableau Arrayforeach
permet de boucler et d'afficher toutes les informations du tableau Arrayimplode
permet également d'afficher toutes les informations du tableau ArrayArray ( [0] => le pseudo posté [1] => l'email posté )
le pseudo posté - l'email posté
le pseudo posté - l'email posté
Pour envoyer un email en PHP, il existe la fonction mail()
très pratique.
La fonction mail prend 4 arguments (pas plus, pas moins) dans un ordre précis :
<?php mail("monadressedereception@gmail.com", "Le sujet", "Le message", "adresseemailexpediteur@gmail.com");
Nous avons vu précédemment que la fonction mail()
permettait d'envoyer un email.
Plutôt qu'avoir des valeurs fixes, nous pouvons gérer cela avec un formulaire d'envoi d'email ou un formulaire de contact (très répandu sur la plupart des sites).
Prenons ce formulaire HTML :
<?php if(!empty($_POST)) { // affichage des saisies pour être sur de les obtenir avant de les exploiter. echo "destinataire : $_POST[destinataire]
"; echo "sujet : $_POST[sujet]
"; echo "message : $_POST[message]
"; echo "expediteur : $_POST[expediteur]
"; // entête email $headers = 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n"; $headers .= 'Reply-To: ' . $_POST['expediteur'] . "\n"; $headers .= 'From: "' . ucfirst(substr($_POST['expediteur'], 0, strpos($_POST['expediteur'], '@'))) . '"<'.$_POST['expediteur'].'>' . "\n"; $headers .= 'Delivered-to: ' . $_POST['destinataire'] . "\n"; mail($_POST['destinataire'], $_POST['sujet'], $_POST['message'], $headers); } ?>
$headers
une partie est en place pour définir les entêtes du mail :Bonjour!
En théorie, pour envoyer un email de qualité (et mettre toutes les chances de votre côté pour que celui-ci ne soit pas catégorisé en spam chez vos internautes), vous devrez communiquer avec un serveur SMTP en lui fournissant certaines informations.
Voici un tableau récapitulatif :
Entête | Description |
---|---|
Subject | Le sujet/objet du message. |
From | Adresse email de l'auteur du message. |
Sender | Adresse email de l'expéditeur (souvent la même que From, sauf si l'envoyeur est différent de celui qui a écrit le message). |
Reply-To | Adresse email de réponse au message (pratique pour communiquer avec un site web lors d'envoi de mail automatique). |
To | Listing des adresse(s) email(s) des destinataire(s) direct du message (un même email peut être envoyé à plusieurs personnes). |
Cc Carbon copy |
Listing des adresse(s) email(s) des destinataire(s) en copie du message. |
Bcc Blind carbon copy |
Listing des adresse(s) email(s) des destinataire(s) en copie invisible du message. |
Message-ID | Code unique d'identification du message. |
In-Reply-To | Représente l'id du message (pratique pour grouper des échanges d'emails et en faire des conversations) |
References | Représente l'id de la conversation (lors d'échanges emails). |
Comments | Commentaires éventuels en lien avec le message. |
X-Mailer | Messagerie ou Logiciel émetteur du message. |
Keywords | Mots-clés devrivant le message. |
Date | Date et heure d'expédition. |
MIME-Version | Version MIME du mail (seule la version 1.0 existe). |
Priority | Niveau de priorité du mail. |
Content-Type | Type de message (par exemple : html ou texte). |
Content-transfer-encoding | Encodage du message. |
Content-Description | Description du message. |
Si vous souhaitez être la seule personne à recevoir des emails, il suffit de retirer la case destinataire du formulaire HTML et adapter légérement le code PHP en conséquence :
Ajoutons le code PHP :
<?php if(!empty($_POST)) { // affichage des saisies pour être sur de les obtenir avant de les exploiter. echo "sujet : $_POST[sujet]
"; echo "message : $_POST[message]
"; echo "expediteur : $_POST[expediteur]
"; // entête email $headers = 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n"; $headers .= 'Reply-To: ' . $_POST['expediteur'] . "\n"; $headers .= 'From: "' . ucfirst(substr($_POST['expediteur'], 0, strpos($_POST['expediteur'], '@'))) . '"<'.$_POST['expediteur'].'>' . "\n"; $headers .= 'Delivered-to: monadresse@gmail.com' . "\n"; mail("monadresse@gmail.com", $_POST['sujet'], $_POST['message'], $headers); } ?>
Si vous souhaitez ajouter récolter d'autres informations sur l'internaute, il suffit d'ajouter d'autres champs de formulaire HTML et de prévoir le code de récupération en PHP :
Prenons ce code :
<?php if(!empty($_POST)) { // affichage des saisies pour être sur de les obtenir avant de les exploiter. echo "expediteur : $_POST[expediteur]
"; echo "nom : $_POST[nom]
"; echo "prenom : $_POST[prenom]
"; echo "societe : $_POST[societe]
"; echo "sujet : $_POST[sujet]
"; echo "message : $_POST[message]
"; // entête email $headers = 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n"; $headers .= 'Reply-To: ' . $_POST['expediteur'] . "\n"; $headers .= 'From: "' . ucfirst(substr($_POST['expediteur'], 0, strpos($_POST['expediteur'], '@'))) . '"<'.$_POST['expediteur'].'>' . "\n"; $headers .= 'Delivered-to: monadresse@gmail.com' . "\n"; $message = "Nom : " . $_POST['nom'] . "\nPrénom : " . $_POST['prenom'] . "\nSociété : " . $_POST['societe'] . "\nMessage : " . $_POST['message']; mail("monadresse@gmail.com", $_POST['sujet'], $message, $headers); } ?>
PHP
1. Intro Php 2. Instruction D'affichage 3. Les Variables Et Constantes 4. Syntaxe Et Concatenation 5. Conditions Et Operateurs 6. Fonctions Predefinies 7. Fonction Utilisateur 8. Les Boucles 9. Inclusion De Fichiers 10. Tableaux Array 11. Classes Et Objets 12. Les Superglobales 13. Lien Get Et Formulaire Post 14. Les Cookies 15. Les Sessions 16. Requete Sql Avec Pdo Et Mysqli 17. Projet Espace De Dialogue 18. Approche De La Securite 19. Realisation D'un Site Web Complet 20. Evaluation