800 likes | 1.03k Views
Le langage PHP 5. Sommaire. Qu’est-ce que PHP ? Les structures de base Traitements de base Traitements de chaînes Utilisation des tableaux Fonctions usuelles Formulaires et superglobales Environnement web et superglobales Les cookies et Les sessions Gestion des objets
E N D
Sommaire • Qu’est-ce que PHP ? • Les structures de base • Traitements de base • Traitements de chaînes • Utilisation des tableaux • Fonctions usuelles • Formulaires et superglobales • Environnement web et superglobales • Les cookies et Les sessions • Gestion des objets • Gestion de fichiers • Gestion des flux et Flux de sortie PHP • Envoyer et recevoir des e-mails • Travailler avec une base de données
Sommaire • Erreurs et exceptions • XML : concepts et SimpleXML • XML avancé • Les services web • Les templates • Les systèmes de cache • Gestion des images • Expressions régulières • Sécurité • Outils de développement PHP • Les CMS • Les frameworks
Environnement web et superglobales Variables superglobales • Nous avons vu la dernière séance sur les formulaires, quatre superglobales ($_REQUEST, $_GET[], $_POST[] et $_FILES[]). • Il existe deux autres tableaux superglobaux dont nous n’avons pas parlé : $_SERVER[] et $_ENV[]. Ces variables recueillent des informations sur le contexte de l’exécution : • $_SERVER[] contient tout ce qui concerne la réception de la requête (informations sur le serveur, sur la connexion, paramètres, etc.) ; • $_ENV[] contient les variables d’environnement du système dans lequel tourne PHP. <?php foreach($_SERVER as $key => $value) { echo "\$_SERVER['$key'] = $value <br />" ; } foreach($_ENV as $key => $value) { echo "\$_ENV['$key'] = $value <br />" ; } ?>
Environnement web et superglobales Variables superglobales
Environnement web et superglobales Authentification HTTP • Si vous vous servez de PHP en tant que module Apache (et non en CGI), vous pouvez utiliser les systèmes d’authentification HTTP.
Environnement web et superglobales Authentification HTTP : Défauts et avantages • Utiliser les authentifications HTTP a un avantage majeur : le protocole à utiliser est standardisé. La plupart des applicatifs qui sont amenés à utiliser le protocole HTTP permettent de définir un mot de passe par ce biais. Si vous aviez un système personnel reposant sur des cookies ou des sessions, il vous faudrait modifier toutes vos applications pour qu’elles sachent utiliser votre système. Vous avez un avantage de compatibilité et de pérennité de la solution. • Le défaut tient au modèle des connexions HTTP. Comme il n’y a pas de persistance des connexions ou d’informations de contexte (relier une requête aux précédentes requêtes de l’utilisateur), le navigateur renvoie le mot de passe à chaque demande de page. Il vous faudra le vérifier à chaque page, sans pouvoir retenir si l’utilisateur a déjà été authentifié ou pas.
Environnement web et superglobales Authentification HTTP : Authentification dans l’URI • La syntaxe pour prédéfinir le nom et mot de passe à utiliser par le navigateur sans qu’il nous les demande est :http://cyruss:barfoo@www.phpteam.net/test.php
Environnement web et superglobales Authentification HTTP : Gestion avec PHP • La gestion des authentifications HTTP avec PHP se fait directement via la fonction header(), permettant d’envoyer des en-têtes HTTP. Les informations venant du navigateur sont, elles, stockées dans le tableau superglobale $_SERVER[] : • $_SERVER['PHP_AUTH_USER'] représente le nom d’utilisateur. • $_SERVER['PHP_AUTH_PW'] représente le mot de passe. • Il suffit alors de vérifier si ces deux informations sont présentes et valides. Si ce n’est pas le cas, on envoie les en-têtes HTTP de demande d’authentification.
Environnement web et superglobales Authentification HTTP : Gestion avec PHP <?php functionverifieMotDePasse($login, $pass){ // Vérifie que le couple login/pass est correct return 1; } if ( !isset( $_SERVER['PHP_AUTH_USER'] ) || !isset( $_SERVER['PHP_AUTH_PW'] ) || !verifieMotDePasse($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) ) { // Soit les informations ne sont pas présentes ou erronées. On demande des informations au navigateur $titre = 'Authentification'; header('WWW-Authenticate: Basic realm="'.$titre.'"'); header('Unauthorized', TRUE, 401); // Texte à envoyer si l’utilisateur refuse de s’authentifier echo "vous n’avez pas accès à cette page" ; // On arrête l’exécution exit() ; } // L’authentification a réussi et on peut mettre le reste de la page comme habituellement echo 'Authentification réussie<br>' ; echo 'Bonjour ', $_SERVER['PHP_AUTH_USER'] ; ?>
Environnement web et superglobales Authentification HTTP : Gestion avec PHP
Environnement web et superglobales Authentification HTTP : Durée de l’authentification et déconnexion • Par défaut, la plupart des navigateurs réutilisent les nom et mot de passe fonctionnels sur toutes les pages d’un même domaine tant qu’on ne ferme pas complètement toutes les fenêtres de navigation. Ce comportement est géré par le navigateur et nous ne pouvons pas intervenir avec PHP. • Si toutefois vous souhaitez fournir un moyen à l’utilisateur de perdre ses droits d’accès, il vous suffit de renvoyer les en-têtes d’authentification au navigateur. Sur la plupart des logiciels (mais pas forcément tous), le mot de passe sera alors effacé et l’utilisateur devra le ressaisir. functiondeconnecteHTTP() { $titre = 'Authentification'; header('WWW-Authenticate: Basic realm="'.$titre.'"'); header('Unauthorized', TRUE, 401); exit ; }
Environnement web et superglobales Authentification HTTP : Authentification par le serveur web • Si Vous souhaiter passer par les systèmes de contrôle d’accès classiques de votre serveur web (par exemple la directive Requirevalid-user d’Apache) plutôt que gérer les authentifications avec PHP. Dans ce cas, si PHP tourne en mode CGI ou que la directive de configurationsafe_mode soit activée dans votre php.ini, la variable $_SERVER['PHP_AUTH_PW'] ne contiendra pas le mot de passe donné par le visiteur. PHP le masque afin qu’un administrateur puisse gérer les mots de passe lui-même sans que le développeur en ait connaissance.Dans ce cas, si l’authentification est réussie, vous pouvez toutefois lire le nom de l’utilisateur via la variable $_SERVER['REMOTE_USER'].
Environnement web et superglobales Paramètres de la connexion : Adresse IP et port du client • Dans le cas d’une connexion HTTP, PHP remplit automatiquement dans $_SERVER[] les adresses IP et ports utilisés. Ces informations sont dans $_SERVER['REMOTE_ADDR'] et $_SERVER['REMOTE_PORT']. <?php echo 'Adresse du serveur :', $_SERVER['REMOTE_ADDR'],'<br>'; echo 'Port utilisé par le serveur :', $_SERVER['REMOTE_PORT']; ?> • Les deux usages principaux de cette information sont : • les fichiers de logs, pour pouvoir identifier un utilisateur malveillant; • la redirection sur un miroir géographiquement proche du client.
Environnement web et superglobales Paramètres de la connexion : Présence de proxy • Si le client passe par une passerelle ou un proxy, c’est l’adresse et le port utilisés par le proxy qui seront visibles et uniquement ceux-ci. • Certains proxies informent cependant votre serveur sur l’adresse IP réelle du client. Vous pouvez alors la lire, quand elle est fournie, dans $_SERVER['X_FORWARDED_FOR']. Cette adresse réelle sera le plus souvent une adresse privée (par exemple 192.168.0.1) qui ne vous permettra pas de joindre directement la personne et qui ne sera pas unique.
Environnement web et superglobales Paramètres de la connexion : Sécurité de l’identification par adresse IP • Il est important de noter que ces valeurs sont toutes des valeurs fournies par le client. Il est techniquement facile pour quelqu’un d’affirmer être un proxy qui redirige une autre adresse, même si ce n’est pas vrai. Il est aussi techniquement possible de se faire passer pour quelqu’un d’autre. On ne doit donc jamais authentifier quelqu’un uniquement par son adresse IP. • De même, rien ne garantit l’unicité d’une adresse IP récupérée ainsi. Certains fournisseurs d’accès Internet réutilisent très rapidement les adresses une fois qu’un client se déconnecte. Il est techniquement possible de voir deux clients différents avec la même IP se connecter sur votre site à moins de cinq minutes d’intervalles. Il est encore plus fréquent de voir deux clients différents simultanément avec la même adresse. Généralement deux personnes d’une même société, école ou bibliothèque qui passent par un proxy (qui ne transmettra pas forcément l’IP réelle) peuvent avoir la même adresse IP.
Environnement web et superglobales Paramètres de la connexion : Nom d’hôte • Selon la configuration du serveur, il est aussi possible que vous ayez le nom associé à l’adresse -IP du client dans $_SERVER['REMOTE_HOST']. Dans le cas contraire, il est de toute façon possible de le connaître en utilisant la fonction gethostbyaddr() et l’adresse IP. <?php $ip = $_SERVER['REMOTE_ADDR'] ; if (isset($_SERVER['REMOTE_HOST'])) { $host = $_SERVER['REMOTE_HOST'] ; } else { $host = gethostbyaddr($ip) ; } echo "Adresse de connexion : $ip <br>" ; echo "Hôte : $host" ; ?>
Environnement web et superglobales Paramètres de la connexion : Adresse IP et port du serveur • Contrairement à l’adresse du navigateur client, l’adresse IP du serveur est une information fiable et non falsifiable. L’adresse IP est accessible dans $_SERVER['SERVER_ADDR'] et le port (probablement 80 pour une connexion HTTP ou 443 pour une connexion sécurisée HTTPS) dans $_SERVER['SERVER_PORT']. • Dans le cas où votre serveur aurait plusieurs adresses disponibles, c’est celle utilisée par le navigateur pour vous joindre qui serait renvoyée.
Environnement web et superglobales Description de la requête HTTP : Paramètres de la requête • La superglobale $_SERVER['REQUEST_METHOD'] permet de connaître la méthode invoquée pour accéder à la page. Généralement, la méthode utilisée sera la méthode GET. Si une page réceptionne un formulaire, il sera alors indiqué soit GET, soit POST selon la valeur de l’attribut method de la balise <form>. • Le nom de l’hôte virtuel utilisé est donné par $_SERVER['SERVER_NAME']. Le nom du serveur utilisé par le navigateur (celui qui apparaît dans sa barre d’adresse) est, lui, donné par $_SERVER['HTTP_HOST']. • Le protocole utilisé pour accéder au serveur est disponible dans la variable $_SERVER['SERVER_PROTOCOL']. Le plus souvent, cette valeur est HTTP/1.1.
Environnement web et superglobales Description de la requête HTTP : L’adresse demandée (URL) • L’adresse de la page demandée est disponible dans la variable $_SERVER['REQUEST_URI']. Elle contiendra tout ce qui est après le nom de domaine (répertoire, page, extension et paramètres). • Il est possible d’envoyer des paramètres à une page via l’URL (adresse de la page). Dans ce cas, ils sont visibles après un point d’interrogation. C’est notamment la technique utilisée dans les formulaires qui utilisent la méthode GET. Une autre méthode est de remplir directement les informations après le nom du script, c’est une méthode souvent utilisée pour avoir des adresses virtuelles.
Environnement web et superglobales Description de la requête HTTP : L’adresse demandée (URL) • Les paramètres envoyés dans une chaîne de GET (ce qui est après le point d’interrogation suivant le nom de la page dans l’adresse) sont automatiquement décodés dans la superglobale $_GET[]. Si toutefois vous souhaitez récupérer manuellement ces paramètres pour les interpréter ou les réutiliser, vous pouvez y accéder via $_SERVER['QUERY_STRING']. • Par exemple, une adresse http://php.net/manual-lookup.php?pattern=string&lang=fr renverra ?pattern=string&lang=fr comme chaîne de paramètres.
Environnement web et superglobales Description de la requête HTTP : L’adresse demandée (URL) • Les différents paramètres sont du type nom=valeur, séparés par le « et commercial » (caractère &). Les caractères autres que les caractères alphanumériques peuvent être codés avec une syntaxe %xx où xx est le code hexadécimal du caractère. • La fonction rawurlencode() permet de convertir les caractères spéciaux d’une chaîne vers cette syntaxe, la fonction rawurldecode() fait l’opération inverse. Les fonctions urlencode() et urldecode() sont similaires mais codent l’espace en le remplaçant par le signe plus (+). C’est cette dernière syntaxe qui est normalement à utiliser dans le contexte Web.
Environnement web et superglobales Description de la requête HTTP : L’adresse demandée (URL) • une fonction pour décoder les chaînes de paramètres pourrait être : $results = array() ; $query = $_SERVER['QUERY_STRING'] ; $params = explode('&', $query) ; foreach($params as $param) { $param = explode('=', $param) ; $key = urldecode($param[0]) ; $value = urldecode(@$param[1]) ; $results[$key] = $value ; } • PHP met à disposition la fonction parse_str(), qui fait ces opérations automatiquement // URL : http://php.net/manual-lookup.php?pattern=string&lang=fr $query = $_SERVER['QUERY_STRING'] ; $result = array() ; parse_str($query, $result) ; echo $result['pattern'] ; // affiche: string echo $result['lang'] ; // affiche: fr
Environnement web et superglobales Description de la requête HTTP : L’adresse demandée (URL) • Selon votre configuration, il vous sera peut-être possible d’avoir des adresses du type script.php/chemin/page?parametres voire script/chemin/page?parametres (pas d’extension .php dans l’adresse). Un tel système permet d’avoir une architecture virtuelle, et de dissocier l’emplacement et le nom des scripts sur le serveur des adresses utilisées. • Quand une telle méthode est utilisée, vous pourrez retrouver la partie virtuelle (ici /chemin/page?parametres) dans la variable superglobale $_SERVER['PATH_INFO'].
Environnement web et superglobales Description de la requête HTTP : Informations fournies par le client • Les navigateurs envoient avec les en-têtes de la requête plusieurs informations. Ces informations sont dites « non fiables » car rien ne garantit que le client qui a fait la requête ne mente pas. Pourtant, elles permettent souvent de récolter quelques statistiques ou de servir un contenu plus adapté au navigateur. • Le plus souvent, le navigateur envoie avec sa demande l’adresse de la dernière page où il est allé. Cette information est enregistrée par PHP dans $_SERVER['HTTP_REFERER']. Connaître cette valeur peut être très intéressant à des fins statistiques, pour savoir qui vous référence, ou par quels mots-clés on trouve votre site sur les moteurs de recherche.
Environnement web et superglobales Description de la requête HTTP : Informations fournies par le client • Depuis HTTP 1.1, les clients web envoient diverses informations sur les contenus qu’ils savent gérer où qu’ils préfèrent recevoir. La réception des en-têtes concernés permet au serveur de choisir le bon contenu à renvoyer. Parmi ces en-têtes, on trouve : • Une négociation de format (valeur présente dans la variable $_SERVER['HTTP_ACCEPT']). Elle permet de déclarer les différents formats acceptés et de faire sélectionner automatiquement le plus adapté par le serveur. • Une négociation de langue (grâce à la valeur présente dans $_SERVER['HTTP_ACCEPT_LANGUAGE']). Cette donnée permet de choisir la langue à utiliser sur la page et de pouvoir distribuer une page dans la langue du visiteur. • Une négociation de jeux de caractères (via la variable $_SERVER['HTTP_ACCEPT_CHARSET']). Le format de la chaîne reçue, comme les suivantes, est similaire à la précédente. • Une négociation de compression (via la valeur $_SERVER['HTTP_ACCEPT_ENCODING']). Cette information permet de savoir si le navigateur accepte les envois de pages compressées ou non.
Environnement web et superglobales Description de la requête HTTP : Informations fournies par le client • Les navigateurs envoient presque tous leurs nom et numéro de version dans la requête. La chaîne envoyée par le navigateur est disponible dans $_SERVER['USER_AGENT']. • Ces informations sont très utiles à des fins statistiques. De telles valeurs peuvent aussi servir à reconnaître les aspirateurs web et limiter l’impact qu’aurait leur passage. • Certains webmasters les utilisent aussi pour servir des versions de la page différentes selon le navigateur. Cette procédure est toutefois largement déconseillée, car elle est généralement très imparfaite : le nombre de navigateurs différents rend impossible une détection exhaustive et beaucoup de navigateurs mentent sur cette information. De plus, cette optique oblige à maintenir une grande partie des pages en plusieurs exemplaires. Si vous n’avez pas d’importantes ressources à consacrer uniquement à cette tâche et à la maintenance d’un tel système, ce procédé est à éviter.
Environnement web et superglobales Environnement système • Les variables d’environnement du système sont accessibles à travers la superglobale $_ENV[]. Les valeurs accessibles dépendent entièrement de votre système. De plus, sur un système en safe_mode, les variables d’environnement accessibles en lecture et en écriture sont habituellement restreintes à un jeu très limité. • D’autres variables sont toutefois accessibles par d’autres moyens. Ainsi, vous pouvez connaître la variable d’environnement PATH (qui définit les chemins de recherche lors d’une exécution) avec $_SERVER['PATH']. • De même, vous avez accès aux informations sur le processus ou l’utilisateur courant via les fonctions POSIX : posix_getuid() et posix_getgid() donnent respectivement l’identifiant de l’utilisateur et celui du groupe en cours, posix_uname() donne le nom du système d’exploitation.
Environnement web et superglobales Environnement système • La variable $_SERVER['SCRIPT_NAME'] donne l’adresse du script relative à la racine du serveur web. La variable $_SERVER['PATH_TRANSLATED'] donne la même information, mais avec une adresse absolue sur le système de fichiers. • Il existe de plus des mots-clés pour accès rapide. Ainsi __FILE__ définit le chemin complet sur le système de fichiers, __LINE__ la ligne en cours d’exécution, __CLASS__, __FUNCTION__ et __METHOD__ les éventuels noms de classe, de fonction et de méthode dans lesquelles se trouve la ligne en cours d’exécution. Ces mots-clés ont une syntaxe de constante mais n’en sont pas puisque la valeur change au cours de l’exécution.
Environnement web et superglobales Ligne de commande • La superglobale $_SERVER['argv'] trouvera principalement son utilité dans le cadre de l’utilisation de PHP en tant que langage en ligne de commande. Il s’agit d’un tableau des arguments passés au script. Et la superglobale $_SERVER['argc'] indique le nombre de paramètres. php script.php nom=rasmusprenom= lerdorf <?php print_r($_SERVER[argv]); ?> /* Renverra : Array ( [0] => script.php [1] => nom=rasmus [2] => prenom=lerdorf ) */
Les cookies • Les cookies sont des fichiers texte courts stockés par le navigateur sur l’ordinateur de l’utilisateur, à la demande du serveur web. Pour faire une analogie, le cookie ressemble à une carte d’identité : l’administration vous donne une carte avec des informations vous concernant et vous demande de la représenter régulièrement. Grâce à cette carte, elle peut vous identifier chaque fois qu’il est nécessaire et connaître quelques informations sur vous, votre âge par exemple. Le cookie est l’équivalent de ce principe pour les pages web : le serveur vous envoie une valeur (le cookie) avec la page et vous demande de la renvoyer dans vos prochains échanges. Grâce à cette valeur, le serveur peut retenir des informations vous concernant. Cette demande se fait dans les en-têtes HTTP, avant l’envoi de la page web.
Les cookies Forme du cookie sur votre ordinateur • Dans le cas d’un cookie sans durée d’expiration, les informations sont stockées dans la mémoire vive de l’ordinateur. En revanche, si vous lui donnez une durée de vie, ce qui est généralement le cas, un fichier est créé sur le disque dur du client contenant ses propres informations. • Microsoft Internet Explorer stocke les cookies dans un dossier temporaire Internet (C:\Documents and Settings\votre_login\Local Settings\Temporary Internet Files sous Microsoft Windows 2000 et suivants). Il s’agit de simples fichiers texte que vous pouvez lire avec le Bloc-notes. setcookie('PHP', 5, mktime ( 12, 34, 00, 04, 01, 2030), '/php5' ) ; PHP 5 www.example.com/php5 1024 449747968 31538642 3962392528 29605282
Les cookies Lecture et écriture d’un cookie • PHP permet de gérer entièrement l’envoi et la réception des cookies via la fonction setcookie(nom, valeur). • Cette facilité d’utilisation ne doit pas vous faire perdre de vue que les cookies se gèrent dans les en-têtes envoyés avant la page web. Le serveur web envoie l’ensemble des en-têtes dès qu’il reçoit du texte à afficher de la part du script. En conséquence, cette fonction ne doit être utilisée qu’en haut de vos pages, avant tout contenu HTML. <?php // Attention : aucuntexte HTML ne doitêtreenvoyéavant le cookie. setcookie('langage', 'PHP version 5') ; ?> <html> <head><title>titre</title></head> <body> <p>Un cookie a étéenvoyé</p> <p>Son nom est : langage</p> <p>Son contenuest : PHP version 5</p> </body> </html>
Les cookies Lecture et écriture d’un cookie • La prochaine fois que le navigateur chargera une page sur votre site, il renverra le cookie dont le nom est langage. Encore une fois, tout est déjà fait dans PHP et vous pouvez accéder à tous les cookies envoyés, grâce au tableau $_COOKIE[]. Il s’agit d’une des variables superglobales. <html><head><title>titre</title></head><body> <?php // On vérifiesi le cookie a étéreçu if ( isset($_COOKIE['langage']) ) { // C’est le cas, le cookie existe echo '<p>Un cookie a été envoyé</p>' ; echo '<p>Son nom est : langage</p>' ; echo '<p>Son contenu est : ' ; // On lit la valeur du cookie et on l’affiche echo $_COOKIE['langage'] ; echo '</p>' ; } else { // Le cookie n’a pas été reçu echo '<p>Aucun cookie du nom de langage n\’a été reçu</p>' ; } ?> </body></html>
Les cookies Lecture et écriture d’un cookie • Pour effacer un cookie, il suffit d’envoyer un cookie du même nom mais sans valeur, comme dans : setcookie ('nom_du_cookie'). <?php // Si le cookie compteur de visite existe, if ( isset( $_COOKIE['visites'] ) ) { // on demande au navigateur d’effacer son cookie setcookie('visites') ; // et on en efface la valeur en local pour éviter // de l’utiliser par erreur dans la suite de notre script unset($_COOKIE['visites']) ; } ?>
Les cookies Lecture et écriture d’un cookie • Pour modifier un cookie, il vous suffit de refaire appel à la fonction setcookie() avec le nom du cookie à modifier et sa nouvelle valeur. Il remplacera le précédent de même nom. Comme pour la suppression, pensez bien à dissocier le cookie présent sur le navigateur (que vous souhaitez mettre à jour) et la valeur présente dans $_COOKIE[] (qui est celle que le navigateur vous a envoyée).
Les cookies Lecture et écriture d’un cookie • Voici un exemple vous permettant de voir la modification d’un cookie. À chaque passage sur la page, la valeur du cookie s’incrémente : <?php $message = array() ; if (! isset($_COOKIE['visites']) ) { $message[] = '$_COOKIE[\'visites\'] est vide' ; $message[] = 'le cookie n\'a pas été reçu par le serveur' ; $message[] = 'on envoie le cookie avec la valeur 1' ; setcookie('visites', 1 ) ; } else { $message[] = '$_COOKIE[\'visites\'] n\'est pas vide' ; $message[] = 'la valeur reçue est ' . $_COOKIE['visites'] ; $message[] = 'on envoie un nouveau cookie avec la valeur ' . ( $_COOKIE['visites'] +1 ) ; setcookie('visites', $_COOKIE['visites'] +1 ) ; $message[] = 'le navigateur va modifier le cookie pour lui donner la nouvelle valeur ' . ( $_COOKIE['visites'] +1 ) ; } $message[] = 'vous pouvez recharger la page pour voir l'évolution'; echojoin('<br>', $message) ; ?>
Les cookies Validité et date d’expiration • La durée de vie par défaut d’un cookie se limite à une session de navigateur. Cela signifie que quand vous fermez tous vos navigateurs et que vous retournez sur la page, le cookie est perdu. • Pour notre compteur, par exemple, il est plus adapté d’avoir un cookie permanent. La permanence n’est pas réellement possible, mais nous pouvons toujours demander au navigateur une date d’expiration éloignée. Pour définir une date d’expiration du cookie, on spécifie la date sous forme de timestamp en troisième paramètre à la fonction setcookie(). Dans notre exemple concernant un compteur de visites, nous allons utiliser la fonction mktime().
Les cookies Validité et date d’expiration <?php // On vérifie si le cookie est présent if ( !isset( $_COOKIE['visites'])) { // Il n’est encore jamais passé sur la page, donc il n’a pas de cookie $visites = 1 ; $message = 'Vous venez pour la première fois' ; }else{ // Il est déjà venu, on incrémente son nombre de visites $visites = $_COOKIE['visites'] + 1 ; $message = 'Vous êtes venu '.$_COOKIE['visites'].' fois' ; } // On met le cookie à jour avec le nouveau nombre de visites setcookie('visites', $visites, mktime(0,0,0,12,31,2037) ) ; ?><html><head><title>titre</title></head> <body> <p> <?phpecho $message ; ?> </p> </body> </html>
Les cookies Tableaux et types complexes • Jusqu’à présent, nous n’avons stocké que des nombres ou des chaînes de caractères dans les cookies. Si vous souhaitez stocker autre chose, par exemple un tableau, il faudra transformer vos données en une chaîne de caractères avant d’envoyer le cookie. De même, une fois votre cookie récupéré à la prochaine page, il sera nécessaire de faire la transformation inverse. Cette transformation, qui s’appelle sérialisation, est gérée par les fonctions PHP serialize()et unserialize(). La première sert à transformer une variable en une chaîne de caractères, la seconde fait l’opération contraire.
Les cookies Tableaux et types complexes <?php // On récupère la liste actuelle if ( isset( $_COOKIE['liste'] ) ) { // Si le cookie existe, on récupère la liste des heures de visite $liste_serialisee = $_COOKIE['liste'] ; // Il faut maintenant décoder le contenu pour obtenir le tableau $liste_tableau = unserialize( $liste_serialisee ) ; }else{ // Si le cookie n’existe pas encore, la liste est un tableau vide $liste_tableau = array() ; } // On ajoute l’heure actuelle $liste_tableau[] = time() ; // On renvoie le cookie avec sa nouvelle valeur, Pour cela, on sérialise le tableau avant $liste_serialisee = serialize( $liste_tableau ) ; setcookie('liste', $liste_serialisee) ; ?><html><head><title>titre</title></head><body> <p> vous êtes venu <?phpecho count( $liste_tableau ) ; ?> fois, voici le détail : </p> <ul><?phpforeach( $liste_tableau as $heure ) { echo '<li>le ',date("d/m/Y H:i:s:", $heure),'</li>‘; } ?> </ul></body></html>
Les cookies Restriction de portée du cookie • Deux paramètres supplémentaires peuvent être renseignés lors de l’envoi d’un cookie. Ils permettent d’en restreindre la portée. • Le premier paramètre indique un chemin d’accès : par exemple '/manual'. Il demandera au navigateur de n’envoyer le cookie que pour les pages de ce répertoire et ses sous-répertoires. Si vous ne spécifiez pas ce paramètre, le cookie sera envoyé pour toutes les pages du domaine. • Le second paramètre indique un nom de domaine, par exemple 'www.php.net'. Il demandera au navigateur d’envoyer le cookie uniquement pour le domaine spécifié. Dans notre exemple, il l’enverra pour http://www.php.net, mais pas pour http://pear.php.net. Si vous souhaitez que le cookie soit accessible pour tous les sous-domaines, il suffit alors d’omettre le sous-domaine (mais laisser le point devant le domaine). Par défaut, le cookie est disponible pour tout le domaine courant.
Les cookies Restriction de portée du cookie • Voici quelques exemples, en considérant que le navigateur a appelé l’adresse http://www.php.net/manual/en/function.setcookie.php : <?php // Valide sur http://*.php.net/* Non renvoyé sur http://www.asp.net/ setcookie('nom','valeur'); // Identique au précédent setcookie('nom','valeur',mktime(0,0,0,12,31,2037) ,'/','.php.net'); // Valide sur http://*.php.net/manual/* Non renvoyé sur http://www.php.net/FAQ.php setcookie('nom','valeur','/manual'); // Valide sur http://www.php.net/* Non renvoyé sur http://pear.php.net/ setcookie('nom','val',mktime(0,0,0,0,0,2037) ,'/','www.php.net'); // Valide sur http://www.php.net/manual/* Non renvoyé sur http://pear.php.net/manual // Non renvoyé sur http://www.php.net/FAQ.php setcookie('n','v',mktime(0,0,0,0,0,2037),'/manual','www.php.net'); ?>
Les cookies Restriction de portée du cookie • Un dernier paramètre est disponible, qui permet d’éviter de diffuser un cookie avec contenu sensible sur une connexion non sécurisée. Si cet argument était à TRUE lors de l’appel à setcookie() et si la connexion n’est pas faite via SSL (Secure Socket Layer), le navigateur ne renvoie pas le cookie.
Les cookies Limitations et sécurité • Limitations dues aux navigateurs : Les spécificationsdéfinissent une limite de 20 cookies par domaine et de 4 Ko par cookie, nom du cookie compris.Les utilisateurs commencent à être sensibles aux intrusions dans la vie privée. En conséquence, les navigateurs intègrent maintenant des mécanismes pour filtrer les cookies. Si vos cookies ont des dates d’expiration trop importantes, sont trop nombreux ou trop volumineux, le navigateur peut très bien décider unilatéralement de ne pas les stocker, ou pas au-delà de la session courante. De plus, de nombreux utilisateurs reconfigurent leur navigateur pour refuser les cookies par défaut.
Les cookies Limitations et sécurité • Les cookies n’ont aucune sécurité : Les cookies ont de nombreux avantages, mais il est important de noter que leur utilisation doit se faire de façon réfléchie. Il faut savoir qu’un cookie, ne contient aucune sécurité contre la modification : l’utilisateur peut créer, modifier et supprimer ses cookies très simplement. Et il est vivement déconseillé de mettre une quelconque information confidentielle dans un cookie.Les cookies sont à réserver pour des utilisations statistiques ou d’aide à l’utilisateur : le visiteur n’aura aucun intérêt à truquer son identifiant s’il ne sert que pour des statistiques (et s’il le fait, l’influence sera faible voire nulle). Un cookie qui ne fait qu’aider à préremplir un formulaire ne pose pas de problème non plus puisque cette information n’est à destination que de l’utilisateur (s’il la modifie, lui seul sera concerné).
Les cookies Cas d’application : Outil de personnalisation d’affichage • Pour fidéliser les visiteurs sur votre site, vous proposez régulièrement des brèves d’actualité sur une partie de la page d’accueil. Le rendu de votre page est satisfaisant, mais les nouvelles actualités ne sont pas mises en avant quand elles apparaissent déjà. Vous souhaiteriez donc que votre visiteur sache en un coup d’œil quelles sont les nouvelles actualités depuis sa dernière visite. • Le site actuel utilise une fonction getActus() qui retourne un tableau de message d’actualité. Chaque message d’actualité est lui-même un tableau de la forme suivante : $message = array( 'date' => date, sous le format utilisé par time() , 'titre' => titre de la brève , 'url' => adresse de la page web avec le contenu ) ;
Les cookies Cas d’application : Outil de personnalisation d’affichage • Trois types de brèves vont être individualisés : • les brèves qui sont affichées pour la première fois sur le poste du visiteur, • les brèves dont les titres ont déjà été affichés, mais qui n’ont jamais été ouvertes par le visiteur, • les brèves déjà lues. • Les nouvelles actualités auront un fond légèrement jaune de façon à mieux les faire ressortir, celles déjà lues auront un fond gris clair, de façon à les rendre moins attractives pour l’œil, les autres auront le fond blanc classique du reste de la page.
Les cookies Cas d’application : Outil de personnalisation d’affichage • La gestion des nouveaux messages est la partie la plus simple. Il s’agit simplement de mettre un cookie à la date du jour pour chaque affichage. Il suffit par la suite de relire ce cookie. Si la date d’un message est plus récente que celle contenue dans le cookie, il s’agit d’un nouveau message. Sinon le message est un ancien message. • Voici une implémentation possible : $messages = getActus() ; foreach( $messages as &$actu ) { if ( $_COOKIE['derniere_visite'] > $actu['date'] ) { $actu['nouveau'] = FALSE ; } else { $actu['nouveau'] = TRUE ; } } $deux_mois = time() + 3600*24 *60 ; setcookie('derniere_visite', time(), $deux_mois) ;