Les inclusions
Il y a une chose essentielle en PHP, c’est l’inclusion de fichiers.
Imaginons que vous ayez un site qui comporte toujours le même menu ou encore la même partie haute, en HTML vous étiez obligés de copier coller le même code sur toutes les pages de votre site, avec pour inconvénient principal des mises à jour rendues plus difficiles car vous deviez modifier toutes les pages faisant appel à votre menu en cas d’actualisation de celui-ci.
Le code permettant d’inclure un fichier dans un autre est très simple en PHP.
On utilise la structure du langage « include
« .
Elle peut ne pas prendre de parenthèses.
Cette structure va vous permettre d’inclure un fichier PHP à interpréter dans un autre fichier PHP, ou un fichier statique dans un fichier PHP.
Voici un exemple permettant d’inclure la page « haut.php » dans le fichier courant :
<?php
include 'haut.php';
?>
Les mails
Pour commencer, il existe deux formats d’emails, les emails au format texte et les emails au format html.
La différence est que les emails au format html peuvent contenir des images, des tableaux, des liens et plusieurs autres possibilités offertes par le html.
Dans ce script, nous allons utiliser la fonction mail()
de php.
Dans un email, il y a les en-têtes, qui contiennes des informations sur la personne qui envoie, l’encodage de l’email, l’adresse email à qui il faut répondre…
Envoyer un mail au format texte
Commençons d’abord par les emails textes, voici un exemple de code permettant de le faire :
<?php
$sujet = 'Sujet de l\'email';
$message = 'Bonjour,
Ceci est un message texte envoyé grâce à php.
merci :)';
$destinataire = 'destinataire@domaine.com';
$headers = 'From: "expediteur moi"<moi@domaine.com>\\n';
$headers .= 'Reply-To: moi@domaine.com\\n';
$headers .= 'Content-Type: text/plain; charset=\"utf-8\"';
if (mail($destinataire,$sujet,$message,$headers)){
echo 'L\'email a bien été envoyé.';
}
else {
echo 'Une erreur s\'est produite lors de l\'envoi de l\'email.';
}
?>
Envoyer un mail au format HTML
Maintenant nous allons envoyer un email, mais au format html, voici un exemple de code :
<?php
$sujet = 'Sujet de l\'email';
$message = 'Bonjour,<br />
<strong>Ceci est un message HTML envoyé grâce à php.</strong><br />
merci :)';
$destinataire = 'destinataire@domaine.com';
$headers = 'From: \"expediteur moi\"<moi@domaine.com>\\n';
$headers .= 'Reply-To: moi@domaine.com\\n';
$headers .= 'Content-Type: text/html; charset=\"utf-8\"';
if (mail($destinataire,$sujet,$message,$headers)){
echo 'L\'email a bien été envoyé.';
}
else {
echo 'Une erreur s\'est produite lors de l\'envoi de l\'email.';
}
?>
Remarque :
L’envoi de mail ne fonctionne pas dans un environnement de développement local type WAMP ou MAMP.
Les dates
C’est la fonction date()
qui permet d’obtenir l’heure locale du serveur. L’heure locale est fonction de la situation géographique du serveur lui-même.
<?php
$date = date("d-m-Y");
$heure = date("H:i");
echo "Nous sommes le " . $date . " et il est " . $heure . ".";
?>
Les cookies
Un cookie est un fichier texte, crée par le serveur sur le poste client.
En rajoutant l’en-tête set-cookie
, le serveur indique au client qu’il souhaite y stocker un cookie. Le client peut décider, ou non, de s’exécuter et de créer le cookie demandé.
S’il l’accepte, le navigateur client va joindre le cookie à l’en-tête de toutes ses requêtes vers le même domaine, le client rajoute donc l’en-tête HTTP Cookie et le serveur recevant cet en-tête va le transmettre à PHP.
Un cookie est limité en taille, 4Ko maximum; et en nombre, mais celui-ci est généralement très grand. On comprendra que pour stocker une quantité importante d’informations, le cookie n’est pas la solution. Il sert dans une grande majorité des cas à identifier un utilisateur, on va voir cela.
PHP peut décider d’envoyer un cookie (si on le lui demande), par la fonction setCookie(name, value, expire)
.
Si on ne spécifie pas de date d’expiration, le cookie sera stocké dans
la mémoire vive du client (en général), et détruit dès la fermeture du
navigateur (et non de l’onglet).
Exemple :
<?php
setCookie('domaine.fr','cours PHP',time()+24*3600);
?>
Lorsque PHP récupère les cookies en début de traitement, il les place dans un tableau accessible via la variable $_COOKIE
.
Exemple :
<?php
if (isset($_COOKIE['domaine.fr'])){
echo htmlentities($_COOKIE['domaine.fr'],ENT_QUOTES);
}
?>
Les sessions
La session est un mécanisme qui permet à PHP de garder « en mémoire » un nombre illimité de valeurs entre plusieurs requêtes d’un même utilisateur.
Maintenant qu’on a vu qu’on pouvait garder la trace d’un utilisateur, les sessions viennent palier à un problème des cookies : leur faible capacité de stockage. En effet, les données de session sont un fichier stocké (à l’inverse du cookie) non pas sur le disque du visiteur mais sur le serveur.
Aussi, il est impossible d’avoir accès aux variables de session via JavaScript par exemple.
La durée d’une session est définie par l’hébergeur mais on peut la modifier si on a accès à certains paramètres de la configuration de PHP.
La session est unique, un identifiant est donc généré aléatoirement pour chaque utilisateur. Et c’est cet identifiant qui représente l’état actuel de la session de travail. C’est sur lui que repose toute la sécurité du compte de l’utilisateur, de manière générale. Il ne s’agit que d’un petit morceau de texte, unique à chaque visiteur, généré aléatoirement et long, en général, de 32 caractères.
Exemple :
<?php
session_start ();
$_SESSION['login'] = $_POST['login'];
$_SESSION['password'] = $_POST['password'];
?>
Pour récupérer les valeurs de la session :
<?php
session_start ();
if (isset($_SESSION['login']) && isset($_SESSION['password'])) {
echo 'Votre login est '.$_SESSION['login'].' et votre mot de passe est '.$_SESSION['password'].'.';
}
?>
Pour détruire une session :
<?php
session_start ();
session_unset (); // On détruit les variables de notre session
session_destroy (); // On détruit notre session
?>
Les redirections
Il existe des applications web pour lesquelles on souhaite rediriger le visiteur en fonction de paramètres. C’est le cas par exemple pour un script d’identification. Si l’internaute fournit les bons identifiants alors il est redirigé automatiquement vers son espace personnel, sinon il est renvoyé vers le formulaire d’authentification.
Lorsque l’on souhaite créer une redirection avec PHP, on utilise une fonction permettant d’envoyer des entêtes de type Location (adresse). Pour cela, PHP dispose de la fonction header()
qui se charge d’envoyer les entêtes passés en paramètre.
Règle importante : l’appel de cette fonction doit se faire avant tout envoi au navigateur (instruction echo
, print
, espace blanc, balise html…) sous peine de générer une erreur de type Headers already sent by…. Cette erreur signifie que la page a déjà été envoyée au navigateur avant de vouloir envoyer des entêtes HTTP. La logique de développement demande le contraire !
<?php
header('Location: http://www.votresite.com/nouvelle_page.php');
exit();
?>
Note : l’instruction exit() qui succède la fonction header() permet de couper l’exécution du script car la redirection aura lieu immédiatement et le reste du code n’a pas d’intérêt à être interprété.
Les formulaires
Dans une page HTML, l’interactivité entre l’internaute et le serveur se fera par l’intermédiaire des formulaires. En effet, à partir de données saisies et validées dans une page HTML, le serveur va pouvoir traiter les données et renvoyer au client la confirmation de la bonne réception de ses valeurs ou le résultat de calculs par exemple.
Méthodes, action et enctypes
La procédure de soumission d’un formulaire est contrôlée par 2 attributs de la balise <form>
: method
et action
.
L’attribut method
détermine la manière dont les données sont transmises au serveur. Il peut prendre les valeurs GET
et POST
.
POST
demande à l’explorateur d’empaqueter toutes les données et de les transmettre au serveur. Les données ne sont pas visibles par l’internaute au moment de l’envoiGET
, quant à lui, envoie les données en tant que partie intégrale de l’URL pour la page cible. De ce fait, les données sont visibles dans l’URL de la page cible.
Différences entre les 2 méthodes
La différence entre les 2 méthodes intervient dans l’affichage de l’URL de la page de résultat.
- URL visible de la page resultat.php avec la méthode
POST
:
http://www.monsite.com/resultat.php - URL visible de la page resultat.php avec la méthode
GET
http://www.monsite.com/resultat.php?nom=Dupont&email=dupont@gmail.com&action=Envoyer
On constate que dans ce cas, les noms des contrôles et leurs valeurs sont affichés, y compris celles des contrôles cachés.
Action
L’attribut action
spécifie la page cible pour les
données soumises. Cet attribut n’est pas obligatoire. Dans ce cas, la
page en cours est re-exécutée.
Exemple
<form method="post" action="http://www.monsite.fr/test.php">
<label for="nom">Nom :</label>
<input type="text" name="nom" id="nom" /><br />
<label for="email">Email :</label>
<input type="email" name="email" id="email" /><br />
<input type="submit" name="action" value="Envoyer" />
</form>
Types de contenu de formulaire
L’attribut enctype
de l’élément FORM
spécifie le type de contenu utilisé pour coder l’ensemble de données de formulaire à soumettre au serveur.
L’attribut enctype
permet de spécifier l’encodage pour un envoi de type POST. En particulier la valeur enctype="multipart/form-data"
permet l’envoi de fichiers au serveur, en utilisant un champ de type fichier (<input type="file">
). Sans l’utilisation de cet encodage, un champ fichier n’envoie que le nom du fichier au serveur, sans son contenu.
enctype = « application/x-www-form-urlencoded »
Il s’agit du type de contenu par défaut. Les formulaires soumis avec ce type de contenu doivent être codés comme suit :
Les noms et valeurs de contrôle sont échappés. Les caractères d’espace sont remplacés par `+ ‘, puis les caractères non alphanumériques sont remplacés par ‘%HH
‘, un signe de pourcentage et deux chiffres hexadécimaux représentant le code ASCII du caractère. Les sauts de ligne sont représentés par des paires « CR LF » (c’est-à-dire, « %0D%A »).
Les noms / valeurs de contrôle sont répertoriés dans l’ordre dans lequel ils apparaissent dans le document. Le nom est séparé de la valeur par ‘=
‘ et les paires nom / valeur sont séparées les unes des autres par ‘&
‘.
enctype = « multipart / form-data »
Le type de contenu « application / x-www-form-urlencoded » est inefficace pour l’envoi de grandes quantités de données binaires ou de texte contenant des caractères non ASCII. Le type de contenu « multipart/form-data
» doit être utilisé pour soumettre des formulaires contenant des fichiers, des données non ASCII et des données binaires.
Un message « multipart/form-data
» contient une série de parties, chacune représentant un contrôle réussi. Les pièces sont envoyées à l’agent de traitement dans le même ordre que les contrôles correspondants apparaissent dans le flux de documents.
Récupération des données
Les noms des champs du formulaire sont utilisés en tant que clés dans le tableau associé, donc vous devez vous assurer que vous n’avez jamais deux entrées de votre formulaire HTML portant le même nom. Si cela arrive, vous risquez d’avoir quelques problèmes.
<?php
// si le formulaire utilise la methode post :
$nom = $_POST['nom'];
$email = $_POST['email'];
// si le formulaire utilise la methode get :
$nom = $_GET['nom'];
$email = $_GET['email'];
?>
Vérification des champs côté serveur
Exemple :
<?php
$error = false;
$nom = $_POST['nom'];
$email = $_POST['email'];
if (strlen($nom) < 1) {
$error = true;
}
else if (strlen($email) < 1) {
$error = true;
}
if ($error == false) {
// traitement du formulaire
echo 'Votre demande a bien été prise en compte';
}
else {
// formulaire incomplet
echo 'Veuillez compléter les champs nécessaires';
}
?>
Ou, encore plus complet :
<?php
function encode($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
/*
* On traite les valeurs reçues, ici en POST
*/
foreach($_POST as $key => $value) {
$$key = encode( $_POST[$key] );
}
/*
* On vérifie champ par champ, selon les règles de validation du formulaire
*/
$error = false;
if ( strlen ( $nom ) < 1 ) {
$error = true;
}
if ( strlen ( $email ) < 1 ) {
$error = true;
}
elseif (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$error = true;
}
/*
* Si le formulaire n'est pas complet
* l'internaute est redirigé vers le formulaire
*/
if ( $error ) {
header('Location: page_formulaire.php');
exit;
}
/*
* Sinon
* L'ensemble des champs a été correctement rempli
* On positionne ici les différents traitements du formulaire
*/
echo 'Votre demande a bien été prise en compte';
?>
Exercice
Écrire un formulaire qui demande :
- Civilité : liste de boutons radio qui propose les options Mlle, Mme et M.
- Nom : zone de texte
- Age : zone de texte
L’envoi du formulaire provoquera :
- La récupération des données saisies par l’utilisateur.
- L’enregistrement des données saisies par l’internaute dans une variable de session.
- Le contrôle de surface de tous les champs. Si par exemple le client laisse le nom vide on affichera le message « Nom laissé vide » en rouge en haut du formulaire. On souhaite également afficher les messages d’erreur (« Nom laissé vide »…) un par un s’il y’en a plusieurs.
- Si tous les champs sont valides, alors on affiche une page qui saluera l’utilisateur avec cette phrase : « Bienvenue M. …………., vous avez ….. ans. », ou « Bienvenue Mlle. …………., vous avez ….. ans. », ou « Bienvenue Mme. …………., vous avez ….. ans. » (avec les bonnes valeurs, bien entendu).
Vous devez donc :
- Créer le formulaire en HTML
- Créer la page de traitement en PHP, qui va récupérer les données saisies, effectuer les contrôles et selon les cas rediriger vers le formulaire avec les messages d’erreurs, ou afficher le message de bienvenue.
Vous devrez utiliser une session PHP pour réafficher les données saisies par l’utilisateur dans le formulaire en cas d’erreur.
Manipulations de fichiers
Avec PHP, la création ou la lecture de fichiers est simplifiée.
Il existe une multitude de fonctions dédiées à l’utilisation des fichiers. La communication entre le script PHP et le fichier est repérée par une variable, indiquant l’état du fichier et que l’on peut passer en paramètre aux fonctions spécialisées pour le manipuler.
La fonction de base est la fonction fopen()
.
C’est elle qui permet d’ouvrir un fichier, que ce soit pour le lire, le créer, ou y écrire.
Voilà sa syntaxe : fopen(nomdufichier, mode);
Plusieurs modes sont possibles :
- r : ouverture en lecture seulement
- w : ouverture en écriture seulement (la fonction crée le fichier s’il n’existe pas)
- a : ouverture en écriture seulement avec ajout du contenu à la fin du fichier (la fonction crée le fichier s’il n’existe pas)
- r+ : ouverture en lecture et écriture
- w+ : ouverture en lecture et écriture (la fonction crée le fichier s’il n’existe pas)
- a+ :ouverture en lecture et écriture avec ajout du contenu à la fin du fichier (la fonction crée le fichier s’il n’existe pas)
<?php
// Exemple : ouverture d'un fichier en lecture seule
$fichier = fopen('liste_visiteurs.txt', 'r');
?>
Une fois que le fichier a été ouvert avec le mode désiré, il est possible de lire son contenu ou d’y écrire des informations grâce aux fonctions:
fputs()
: permettant d’écrire une chaîne de caractères dans le fichierfgets()
: permettant de récupérer une ligne du fichier
Étant donné que la fonction fgets()
récupére à chaque appel une nouvelle ligne du fichier, il est essentiel, pour récupérer l’intégralité du contenu d’un fichier de l’insérer dans une boucle while
. Ainsi, on utilise la fonction feof()
, fonction testant si la fin du fichier n’a pas été atteinte, en tant que test de la boucle while()
.
De cette façon, tant que la fin du fichier n’a pas été atteinte, on lit la ligne suivante du fichier…
<?php
if (!$fp = fopen("fichier.txt","r")) {
echo "Echec de l\'ouverture du fichier";
exit;
}
else {
while(!feof($fp)) {
$Ligne = fgets($fp,255); // On récupère une ligne
echo $Ligne; // On affiche la ligne
$Fichier .= $Ligne; // On stocke l\'ensemble des lignes dans une variable
}
fclose($fp); // On ferme le fichier
}
?>