web viewphp est un langage de programmation professionnel qui permet de créer des sites et...

296
Formation PHP/MySQL 3 jours FR Jérôme Selosse Formation PHP/MySQL 3 jours FR 1

Upload: doanhanh

Post on 03-Feb-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Formation PHP/MySQL 3 jours FR

1

Page 2: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Formation PHP/MySQL 3 jours FR

PHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation. Malgré tout, PHP a su conserver ce qui l'a rendu si populaire et si répandu : un langage souple, facilement abordable et adapté aux développeurs les moins expérimentés.

Pour aborder cette formation, il suffit de posséder les notions de base du HTML et des feuilles de style CSS, afin de pouvoir générer le code à afficher par le navigateur. L'apprentissage de PHP se fait de façon progressive, en dévoilant les notions fondamentales du langage.

Il n'est pas question ici de faire le tour complet des possibilités de PHP, ni d'entrer dans des considérations complexes de programmation. Le but de cette formation est de vous faire comprendre les principes de fonctionnement de PHP pour que vous soyez capable de programmer des pages attrayantes répondant aux attentes de vos visiteurs.

Vous allez découvrir comment utiliser les ressources d'un serveur pour récupérer des informations à afficher, puis comment utiliser ce serveur pour traiter, stocker et enregistrer des actions de l'utilisateur afin de lui fournir des informations adaptées à ses demandes.

2

Page 3: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Vue d'ensemble de la formation :IntroductionLes bases de PHPInteragir avec l'utilisateurCréer un site webPHP et les bases de données

3

Page 4: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Table des matièresIntroductionPrésentation de PHP- Présentation générale de PHP- Historique de PHP- Installation de PHP : Easy PHP- Outils de développement  - utilisation du bloc-notes- Présentation et installation de Notepad++- Présentation de l'interface NetBean- Présentation et installation de FileZillaLes bases de PHP- Rappels sur l'utilisation de PHP- Insertion de code PHP dans un document- Les variables- Les types- Déclaration et utilisation des tableaux- Précisions sur l'affichage des chaînes de caractères- Les constantesLes opérateurs- L'opérateur de concaténation- Les opérateurs arithmétiques- Les opérateurs d'affectation- Les opérateurs de comparaison et les conditions- Comparaison des nombres décimaux- Les opérateurs logiques ou booléensBoucles et conditions- Les structures conditionnelles- Les boucles- Les fonctions et la portée des variables- Présentation de la documentation officielle sur php.netInteragir avec l'utilisateur- Récupérer et utiliser des paramètres GET- Récupération des données d'un formulaire- utiliser les cookies pour stocker des informations- Considérations sur la sécurité- utiliser les fonctions des tableaux pour filtrer une donnée- utiliser les fonctions des chaînes de caractères pour filtrer une donnée

4

Page 5: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

- utiliser les fonctions de filtres pour valider une donnée- utiliser les expressions régulières pour valider une donnéeLes sessions en PHP- Présentation des sessions- Mécanisme de propagation des identifiants de session- Autres informations utiles sur les sessions- stocker et récupérer des variables de session- Gérer un tableau dans une variable de session- Récupérer un fichier transmis par un champ de formulaire de type "file"- Vérification du fichier reçu- Récupérer des informations sur le serveur avec $_sERVER

PHP et les bases de données- Pourquoi utiliser des bases de données- Bases de données, sQL et MysQL- Présentation de phpMyAdmin et WorkBench- Créer une base avec phpMyAdmin et WorkBench- Créer des tables avec phpMyAdmin et WorkBench- Créer des tables avec un script PHP- stocker ses identifiants de base de données- Modifier la structure d'une table- Insérer et supprimer des entrées dans une table- Ajouter des données dans la base avec PHP- Protéger les données à envoyer à MysQL- Récupérer des données de la base- Trier les résultats d'une requête- Compter le nombre d'entrées dans une table- Vérifier des conditions dans la base de données - Effectuer des requêtes sur plusieurs tables d'une base de données- Conclusion

5

Page 6: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

La programmation en PHP - introductionQu'est-ce que PHP ?

Avant toute chose, il faut que vous sachiez ce que veut dire XHTML avant de commencer à lire toute la section concernant PHP. En effet, le XHTML (nouvelle version du langage HTML) est la base de construction des sites web (tous les sites web, utilisant PHP ou non, doivent envoyer du code HTML aux internautes qui le consultent). En effet, le navigateur que vous utilisez pour consulter les sites web ne sait transcrire en document visible que du code (X)HTML.

Je vous encourage donc à aller consulter la section XHTML. Si vous ne connaissez pas ce langage, apprendre le PHP ne vous servira pas à grand-chose. Bien que PHP ne se limite pas qu'à l'affichage de code HTML (il peut aussi générer des images ou agir sans renvoyer de code à l'internaute) il est aujourd'hui inconcevable de parler de PHP sans savoir comment les sites web dits "statiques" sont conçus. Un site web statique est un site qui ne peut avoir son contenu modifié en temps réel sans intervention du webmaster (le webmaster étant le "gérant" du site). Le PHP va vous permettre de créer ce qu'on appelle des sites "dynamiques". Par opposition au HTML, le PHP qui est interprété par le serveur permet d'effectuer beaucoup plus de choses (affichage de l'heure du serveur en temps réel pour donner un exemple très simple).Depuis tout à l'heure je vous parle de serveur. Qu'est-ce qu'un serveur ? pour faire simple, lorsque vous consultez un site internet, ce site est stocké sur une machine qui vous l'envoie. Cette machine est appelée serveur. C'est elle qui contient le site et qui va permettre, si PHP est installé, d'analyser le code PHP pour le transcrire en code HTML. Voici un schéma explicatif simple (à gauche, l'internaute qui consulte le site, à droite le serveur qui stocke le site) :

Maintenant que vous avez compris les bases de ce qu'on appelle l'architecture client/serveur, parlons un peu de PHP. De nombreux sites l'utilisent pour pouvoir créer tout ce qui permet de créer de l'interactivité avec le visiteur, comme par exemple des forums, chats, livres d'or, compteurs de visiteurs, etc ...

Différences entre X(HTML) et PHP

Nous avons vu que XHTML ne permet de créer que des pages statiques. PHP peut se mettre dans du code XHTML pour rendre celui-ci dynamique ! Voyons le code d'une page XHTML basique permettant d'afficher "Bonjour" et la même page en PHP (la page en PHP devra porter l'extension .php pour que le serveur puisse savoir que cette page devra être analysée par PHP avant d'être envoyée, sinon vous aurez le code source PHP qui s'affichera au visiteur, ce qui pourrait être fâcheux, surtout si vous placez des mots de passe !

6

Page 7: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voici le code basique de notre page en XHTML :

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"><head><title>Ici le titre de votre page</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><link rel="stylesheet" href="style.css" media="screen" type="text/css" /></head><body>Bonjour !</body></html>

Nous allons maintenant transformer cette page en PHP, nous utiliserons pour afficher le texte la fonction (qui n'en est pas réellement une, mais je ne vais pas vous compliquer la tâche) echo(). Cette fonction permet d'afficher du texte, nous verrons comment l'utiliser en détail plus loin dans la section PHP.

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"><head><title>Ici le titre de votre page</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><link rel="stylesheet" href="style.css" media="screen" type="text/css" /></head><body><?php echo 'Bonjour !'; ?></body></html>

On constate que le code PHP se place dans le code HTML (pensez à donner à votre page une extension .php). A première vue, on ne voit pas énormément de différences, et on pourrait se demander de l'utilité d'un tel code. Pour l'instant, l'utilité d'un tel code est nulle. Pourquoi ? car utiliser PHP pour générer du contenu statique (ici, votre page affichera tout le temps Bonjour !) est inutile car cela engendre une perte de performances (le serveur doit d'abord traiter la page en PHP avant de l'envoyer, contrairement à une page (X)HTML). Mais patience ! PHP ne se limite pas à l'affichage de texte (et heureusement), d'abord on commence par les bases et on approfondira ensuite :)

Nous venons de voir un exemple de code PHP intégré dans du code XHTML, mais le PHP peut très bien être à part dans un fichier, sans code XHTML autour. Ne jamais oublier que le PHP permet de générer du texte (ou des images) qui seront envoyés au navigateur. Le code XHTML généré par PHP via la fonction echo() n'est rien d'autre que du texte.

Si nous prenons par exemple ceci :

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"><head><title>Ici le titre de votre page</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><link rel="stylesheet" href="style.css" media="screen" type="text/css" /></head><body>

7

Page 8: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<p>Bonjour !</p></body></html>

On peut générer la même chose en PHP (il y a plusieurs façons de le faire, on peut aussi très bien mettre tout le contenu XHTML dans la fonction echo()) :

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"><head><title>Ici le titre de votre page</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><link rel="stylesheet" href="style.css" media="screen" type="text/css" /></head><body><?php echo '<p>Bonjour !</p>'; ?></body></html>

Le visiteur verra absolument la même page XHTML ! Pourquoi utiliser PHP alors ? Parce que grâce à lui, vous pourrez mettre des instructions beaucoup plus complexes que le serveur exécutera (comme par exemple lire un fichier et en afficher le contenu, ou encore afficher le nombre de visiteurs d'une page, etc ...). Vous pourrez également personnaliser des pages en fonction des visiteurs par exemple (comme je le fais sur ce site en affichant Bonjour visiteur si vous n'êtes pas connecté au site et en le remplaçant par votre pseudo si vous êtes connecté). Tout ceci est impossible en (X)HTML !

8

Page 9: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Installer EasyPhpPour utiliser PHP sur votre PC en local, il vous faut l'installer. Afin de simplifier l'opération, il existe un package regroupant Apache (le serveur web), PHP, et Mysql (SGBD très simple d'utilisation). Ce package se nomme EasyPHP. Voici comment l'installer :

Installation de EasyPhp sous Windows :

Commencez par télécharger EasyPHP ici : http://www.easyphp.orgOuvrez ensuite le fichier. Vous arrivez à cet écran (toutes les captures ont été faites avec la version 1.6 d'easyPHP) :

Cliquez sur oui. L'écran de bienvenue suivant s'affiche :

Cliquez sur suivant. Les termes de la licence s'affichent. Cliquez sur Oui pour accepter la licence. On vous propose ensuite de choisir le répertoire d'installation. Il s'agit par défaut de c:\program files\easyphp

9

Page 10: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Choisissez votre répertoire et cliquez sur suivant. Indiquez ensuite le répertoire qui sera visible dans le menu démarrer. Cliquez sur suivant. Un récapitulatif des opérations qui vont se dérouler s'affiche. Cliquez sur installer. L'installation se déroule. L'écran suivant apparaît ensuite :

Cochez "lancer Easyphp.exe" et cliquez sur terminer. Vous apercevez ensuite dans le systray (en bas à droite de la barre des tâches) une icône en forme de E. Faites un clic droit dessus. Vous apercevez le menu suivant :

10

Page 11: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Cliquez sur web local. La page contenue dans le répertoire d'installation d'easyphp suivi du sous répertoire www (c:\program files\easyphp\www par défaut) s'affiche. C'est dans ce répertoire que vous devrez placer vos fichiers php pour qu'ils soient interprétés par le serveur. Je vous conseille de placer des sous dossiers dans le répertoire www car la création de plusieurs sites deviendrait un calvaire sans une organisation efficace des données.

Si le lien "Web local" n'est pas accessible, cliquez sur "Démarrer". Cela redémarrera le serveur apache, php et mysql.EasyPHP est désormais installé.

11

Page 12: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

WAMP [Tutoriel] - Environnement de travail en PHP

Environnement de travail

Nous avons vu brièvement dans la première partie que PHP s'exécutait côté serveur. Or, vous avez sûrement envie de pouvoir coder en PHP sur votre ordinateur et de voir instantanément les résultats des modifications que vous pourrez apporter à vos scripts PHP !Petit rappel, architecture client/serveur :

Rassurez-vous, vous n'aurez pas besoin d'investir dans un serveur distant pour ça. Je vais vous montrer comment installer WAMPserver. WAMPserver est un logiciel qui contient un package de différentes choses :

Apache : il s'agit du serveur web. C'est lui qui renvoie les pages (X)HTML, les fichiers, etc...

PHP : il communique avec apache et permet de traiter les pages PHP. Il renvoie les pages PHP traitées à apache qui les renvoie au client.

MySQL : il s'agit d'un système de gestion de base de données. Nous parlerons plus loin de ce qu'est une base de données.

PHPMyAdmin : Vous allez pouvoir grâce à PHPMyAdmin disposer d'une interface de gestion de vos bases de données bien plus ergonomique que la console.

Toutes ces choses seront installées automatiquement lorsque vous installerez WAMP (Windows Apache MySQL PHP). 

Installer WAMP

Installer WAMP est très facile, il suffit de se laisser guider en cliquant sur Next lorsqu'on vous le demande. Commencez par télécharger WAMP sur le site officiel à l'adresse suivante : www.wampserver.com. Exécutez ensuite l'archive que vous venez de télécharger. Une fenêtre de ce style apparaît :

12

Page 13: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Cliquez sur Next, on vous demande ensuite d'accepter le contrat de licence. Acceptez-le puis cliquez encore sur Next.

Choisissez ensuite un répertoire dans lequel vous installerez WAMP puis cliquez sur Next. L'installation s'effectue ensuite, vous pouvez fermer la fenêtre puis démarrer WAMP.

13

Page 14: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Si tout va bien, vous devriez voir apparaître un petit symbole en bas à droite de votre barre des tâches, un symbole blanc (ici, il est tout à gauche) :

Si ce symbole a un fond blanc comme ici, c'est parfait. Si le fond est jaune ou rouge, cela signifie que les services ne se sont pas installés correctement, ou qu'ils n'ont pu démarrer. Dans le doute, relancez WAMP après l'avoir quitté proprement (clic droit, exit).

Une fois WAMP installé, vous allez pouvoir consulter sa page d'accueil par défaut (réalisée en PHP). Pour ce faire, démarrez votre navigateur web, puis tapez dans la barre d'adresses ceci : http://localhost. Une page se charge :

14

Page 15: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Cette page contient la liste des dossiers situés dans le répertoire www de WAMP. Par défaut, il vous faudra placer vos dossiers et fichiers PHP dans ce dossier (ou dans un sous dossier), pour qu'ils puissent être analysés par PHP. Pour tester le bon fonctionnement de tout ça, créez une page nommée "test.php" dans le dossier "www". Mettez-y le contenu suivant : <?php echo '<p>Bonjour !</p>'; ?>

Enregistrez la page et rendez-vous à l'adresse suivante : http://localhost/test.php. Vous devriez voir "Bonjour !" d'affiché. Si c'est le cas, tout est bien installé, sinon vérifiez que vous ne vous êtes pas trompé de répertoire et que WAMP est bien lancé (fond blanc).

15

Page 16: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Il existe encore d’autres possibilités pour infos:

https://www.apachefriends.org/fr/index.html

https://www.mamp.info/en/

16

Page 17: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les bases de PHP - débuter en PHPLes bases de PHP

Après avoir vu comment installer un serveur qui va vous permettre d'interpréter PHP sur votre ordinateur, nous allons maintenant voir avec quels outils on peut coder en PHP, et comment on dit à telle page "il y a du code PHP dedans, interprète-le".Ce qu'il faut savoir avant tout, c'est que les fichiers PHP ne sont que des fichiers textes. Ils ne sont donc pas compilés (en binaire). Lorsque vous demandez une page, PHP lit le code et l'interprète au fur et à mesure. On parle de code interprété. Comme ce sont des fichiers textes, vous allez pouvoir utiliser n'importe quel éditeur de texte pour coder en PHP. Personnellement j'utilise le NotePad++ intégré à Windows, mais il existe des centaines d'éditeurs de ce genre.

A vous d'utiliser celui qui vous convient le mieux :)

17

Page 18: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les tags (ou balises) PHP

Lorsque vous enregistrez votre fichier texte avec l'extension .php, vous pouvez avoir plusieurs codes dedans : du (X)HTML, du javascript, du CSS ... mais aussi du PHP. Comment l'analyseur syntaxique de PHP fait-il la différence ? il sait en fait que le code est délimité par des balises appelées tags. Ces tags sont un peu spéciaux, ils se présentent sous cette forme :

<?php //code PHP ici //encore du code ci nécessaire, sur plusieurs lignes ?>

Le code PHP est donc situé entre les tags <?php et ?>. Avant de vous parler du reste, je fais le point sur l'autre syntaxe existante et que vous rencontrerez parfois si vous téléchargez certaines sources mal codées. Il s'agit des tags <? et ?>. N'utilisez pas ces tags qui pourront ne pas être compatibles avec toutes les configurations de serveurs existantes. Pour faire simple, PHP dispose d'un réglage appelé short_open_tags, celui-ci peut prendre deux valeurs (On ou Off). Si il est sur On, cette syntaxe sera acceptée et comprise par l'analyseur de code, dans le cas contraire vos scripts ne pourront être interprétés, tandis que si vous utilisez tout le temps <?php et ?>, quelle que soit la valeur de cette option, vos scripts fonctionneront parfaitement.

Quand utiliser PHP ?

Vous allez sûrement en apprenant PHP vouloir convertir tout votre site en PHP et donc remplacer le code (X)HTML par des echo() en rafale. Ce n'est pas une bonne solution, on ne doit pas utiliser PHP pour générer du contenu statique. Si votre page n'est pas destinée à changer dans le temps dynamiquement, laissez-la en HTML. Vous gagnerez en performances et soulagerez votre serveur. Vous pourrez également lorsque vous aurez beaucoup de fichiers dans votre répertoire savoir quels sont ceux qui sont statiques des autres.

Afficher du texte

Opération de base en PHP, l'affichage du texte peut se faire de différentes façons. Nous allons voir la façon la plus simple et la plus rapide (au niveau du temps de traitement serveur) d'afficher du texte. Il s'agit de la "fonction" echo() (il s'agit d'une structure du langage en réalité et non d'une fonction, en effet il n'est pas obligatoire de l'utiliser avec des parenthèses).

18

Page 19: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voici l'exemple d'affichage de texte utilisant echo :

<?php     echo 'bonjour !'; //affiche le texte "bonjour !" ?>

Tout ça c'est bien beau mais si vous souhaitez afficher une apostrophe comment fait-on ? Et bien il suffit d'ajouter le caractère \ (antislash) devant l'apostrophe à ajouter. Un petit exemple vaut mieux qu'un long discours :

<?php     echo 'l\'apostrophe au milieu d\'une chaîne'; ?>

Vous auriez pu écrire également ça comme ceci (avec des guillemets doubles) :

<?php     echo "l'apostrophe au milieu d'une chaîne"; ?>

Le premier exemple étant plus rapide à traiter par PHP (on reparlera de la rapidité d'exécution dans la section traitant de l'optimisation de PHP). Chaque instruction se termine par un point virgule en PHP, ne l'oubliez pas car vous obtiendrez des erreurs parfois insolubles si votre code devient long.

19

Page 20: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques : Hello World

<html lang="en"><head>

<title>Hello World</title></head><body>

<?php// single-line comments are like this# or like this (less common)/* double-line comments are written like this, so that you can keep typing

and typing*/?><?php echo "Hello World!"; ?><br /><?php echo "Hello" . " World!"; ?><br /><?php echo 2 + 3; ?>

</body></html>

20

Page 21: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les commentaires :

Les commentaires sont très utiles pour donner des informations utiles sur ce que va faire une portion de code. Ils ne seront pas affichés ni analysés par PHP. Vous pouvez mettre ce que vous voulez dedans (même du code PHP, (X)HTML, etc...). Il existe deux sortes de commentaires que nous allons voir maintenant.

Les commentaires sur une ligne : ils permettent de commenter sur une seule ligne, on les place généralement à droite ou au dessus de (ou des) ligne(s) concernée(s) : 

<?php     echo 'bonjour !'; //affiche le texte "bonjour !" ?> 

Comme vous le constatez, le commentaire qui ne sera pas analysé se situe après les //. Ceci marque le début du commentaire.

Les commentaires sur plusieurs lignes : ils peuvent occuper une ou plusieurs lignes et sont délimités par les tags /* et */. Voici comment on les utilise :

<?php     /*       Nous allons maintenant afficher du texte       On peut commenter sur plusieurs lignes       et mettre du code <?php echo 'test'; ?>       dans les commentaires     */     echo 'l\'apostrophe au milieu d\'une chaîne'; ?>

21

Page 22: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP : les variablesDéfinition et présentation

Afficher du texte c'est bien beau, mais si il y a une chose essentielle dans tout langage de programmation qui se respecte, ce sont bien les variables. Qu'est-ce qu'une variable ? déjà rien qu'au nom, on peut penser qu'il s'agit quelque chose qui va changer ! Et c'est bien de ça qu'il s'agit !Une variable est une zone mémoire qui va contenir des données, ces données pourront changer au fil du temps. Vous devez sûrement vous demander à quoi cela va bien nous servir dans nos applications PHP, mais j'y viens !Imaginions que vous souhaitiez afficher le prénom du visiteur, prénom que ce même visiteur aura renseigné dans un formulaire. Vous ne connaissez pas le prénom de ce visiteur tant qu'il ne l'a pas renseigné, donc vous ne pouvez pas l'afficher directement via ceci par exemple :

<?php     echo 'prénom'; ?>

Pour pouvoir afficher le prénom du visiteur, il faut que celui-ci le renseigne. On verra plus bas sur cette page comment récupérer des données provenant de formulaires. Ici, on va supposer que le prénom est "Anthony". Ce prénom sera stocké dans une variable, et c'est la valeur de cette variable que nous allons afficher ensuite (j'espère que vous suivez toujours) ! Le code basique devient le suivant :

<?php      $prenom = 'Anthony'; 

     echo $prenom; //affiche "Anthony" ?>

Les guillemets (simples ou doubles) dans le echo sont ici inutiles quand vous affichez une variable. Elles peuvent même avoir un effet non voulu. En effet, tout ce qui se trouve entre guillemets simples (apostrophes) n'est pas remplacé par PHP (au contraire des guillemets doubles). Nous verrons plus loin comment utiliser ces propriétés.

<?php      $prenom = 'Anthony'; 

     echo '$prenom'; //affiche "$prenom"      echo '$prenom vaut :'.$prenom; //affiche "$prenom vaut : Anthony" ?>

Une variable est constituée d'un nom de variable et d'une valeur. Pour l'exemple que j'ai utilisé ci-dessus, le nom de la variable est "prenom" et la valeur est "Anthony". Une variable commence toujours par le signe dollar $ suivi d'une lettre ou d'un underscore _ (touche 8 du pavé alphanumérique)

Types de variables

22

Page 23: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Le langage PHP n'est pas un langage très typé, c'est à dire qu'une variable peut être alternativement un nombre, une chaîne de caractères ou que sais-je encore ! Voici les principaux types de données en PHP (cela ne changera presque rien pour vous au niveau de la syntaxe, mais il est bon de les savoir. Notez que les noms de variables pris en exemple ainsi que leurs valeurs sont purement arbitraires) :

Chaîne de caractères : la valeur est délimitée par des guillemets (simples ou doubles, on privilégiera les simples pour une question de rapidité) : <?php      $prenom = 'Anthony'; ?>

Un nombre : on enlève les guillemets cette fois, cela permet de dire à PHP qu'il s'agit d'un nombre (qu'il soit entier ou flottant) :

<?php      $nombre = 7;      $nombre = 3.02; ?>

Un booléen : les variables booléennes peuvent prendre deux valeurs : la valeur TRUE (vrai) et la valeur FALSE (faux). Elles peuvent être utiles pour savoir par exemple si une option est activée :

<?php      $afficher_options = FALSE; //on n'affichera pas les options      $utiliser_cache   = TRUE;  //on utilisera un cache ?>

Le type objet : nous n'allons pas en parler pour l'instant, sachez qu'il s'agit d'un type spécial que l'on utilise uniquement avec des classes. Tout ceci ne vous parle pas encore, c'est normal.

23

Page 24: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques : Les variables

<html lang="en">

<head>

<title>Variables</title>

</head>

<body>

<?php

$var1 = 10;

echo $var1;

echo "<br />";

$var1 = 100;

echo $var1;

echo "<br />";

$var2 = "Hello world";

echo $var2;

?>

</body>

</html>

24

Page 25: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les chaînes de caractères

<html lang="en">

<head>

<title>Strings</title>

</head>

<body>

<?php

echo "Hello World<br />";

echo 'Hello World<br />';

$greeting = "Hello";

$target = "World";

$phrase = $greeting . " " . $target;

echo $phrase;

?>

<br />

<?php

echo "$phrase Again<br />";

echo '$phrase Again<br />';

echo "{$phrase}Again<br />";

?>

</body>

</html>

25

Page 26: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les fonctions chaînes de caractères

<html lang="en">

<head>

<title>String Functions</title>

</head>

<body>

<?php

$first = "The quick brown fox";

$second = " jumped over the lazy dog.";

$third = $first;

$third .= $second;

echo $third;

?>

<br />

Lowercase: <?php echo strtolower($third); ?><br />

Uppercase: <?php echo strtoupper($third); ?><br />

Uppercase first: <?php echo ucfirst($third); ?><br />

Uppercase words: <?php echo ucwords($third); ?><br />

<br />

Length: <?php echo strlen($third); ?><br />

Trim: <?php echo "A" . trim(" B C D ") . "E"; ?><br />

Find: <?php echo strstr($third, "brown"); ?><br />

Replace by string: <?php echo str_replace("quick", "super-fast", $third); ?><br />

<br />

26

Page 27: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Repeat: <?php echo str_repeat($third, 2); ?><br />

Make substring: <?php echo substr($third, 5, 10); ?><br />

Find position: <?php echo strpos($third, "brown"); ?><br />

Find character: <?php echo strchr($third, "z"); ?><br />

</body>

</html>

Les integers

<html lang="en">

<head>

<title>Integers</title>

</head>

<body>

<?php

$var1 = 3;

$var2 = 4;

?>

Basic Math: <?php echo ((1 + 2 + $var1) * $var2) / 2 - 5; ?><br />

<br />

Absolute value: <?php echo abs(0 - 300); ?><br />

Exponential: <?php echo pow(2,8); ?><br />

Square root: <?php echo sqrt(100); ?><br />

Modulo: <?php echo fmod(20,7); ?><br />

Random: <?php echo rand(); ?><br />

Random (min,max): <?php echo rand(1,10); ?><br />

27

Page 28: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<br />

+= : <?php $var2 += 4; echo $var2; ?><br />

-= : <?php $var2 -= 4; echo $var2; ?><br />

*= : <?php $var2 *= 3; echo $var2; ?><br />

/= : <?php $var2 /= 4; echo $var2; ?><br />

<br />

Increment: <?php $var2++; echo $var2; ?><br />

Decrement: <?php $var2--; echo $var2; ?><br />

<br />

<?php

// PHP will convert a string to an integer

// but it is sloppy programming

echo 1 + "2 houses";

?>

</body>

</html>

Les nombres flotants

<html lang="en">

<head>

<title>Floating Point Numbers</title>

</head>

<body>

<?php echo $float = 3.14; ?><br />

<?php echo $float + 7; ?><br />

<?php echo 4/3; ?><br />

28

Page 29: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php echo 4/0; ?><br />

<br />

Round: <?php echo round($float, 1); ?><br />

Ceiling: <?php echo ceil($float); ?><br />

Floor: <?php echo floor($float); ?><br />

<br />

<?php $integer = 3; ?>

<?php echo "Is {$integer} integer? " . is_int($integer); ?><br />

<?php echo "Is {$float} integer? " . is_int($float); ?><br />

<br />

<?php echo "Is {$integer} float? " . is_float($integer); ?><br />

<?php echo "Is {$float} float? " . is_float($float); ?><br />

<br />

<?php echo "Is {$integer} numeric? " . is_numeric($integer); ?><br />

<?php echo "Is {$float} numeric? " . is_numeric($float); ?><br />

<br />

</body>

</html>

29

Page 30: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les booléens

<html lang="en">

<head>

<title>Booleans</title>

</head>

<body>

<?php

$result1 = true;

$result2 = false;

?>

Result1: <?php echo $result1; ?><br />

Result2: <?php echo $result2; ?><br />

result2 is boolean? <?php echo is_bool($result2); ?>

<br />

<?php

$number = 3.14;

if( is_float($number) ) {

echo "It is a float.";

}

?>

</body>

</html>

30

Page 31: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les opérateurs de calcul

PHP sait heureusement faire des calculs. Les symboles utilisés (appelés opérateurs) pour effectuer des calculs sont les suivants :

Opérateur Signification

+ Addition

- Soustration

* Multiplication

/ Division

% Division entière (modulo)

Voici quelques exemples simples d'utilisation des opérateurs (il en existe d'autres que nous verrons plus loin au fur et à mesure des exemples) :

<?php      $entier   = 7;      $flottant = 2.5;      $somme    = 4 + 5; //$somme vaut 9      $multiplic= 2*5;   //$multiplic vaut 10      $division = 9/3;   //$division vaut 3      $modulo   = 10 % 3 //$modulo vaut 1 

     $multi_variables = $entier * $flottant; //7 * 2.5 = 17.5 donc $multi_variables vaut 17.5 ?>

31

Page 32: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques :

<html lang="en">

<head>

<title>Comparison and Logical Operators</title>

</head>

<body>

<?php

$a = 4;

$b = 3;

$c = 1;

$d = 20;

if (($a >= $b) || ($c >= $d)) {

echo "a is larger than b OR ";

echo "c is larger than d";

}

?>

<br />

<?php

$e = 100;

if (!isset($e)) {

$e = 200;

}

echo $e;

?>

<br />

<?php

// don't reject 0 or 0.0

$quantity = "";

32

Page 33: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

if (empty($quantity) && !is_numeric($quantity)) {

echo "You must enter a quantity.";

}

?>

</body>

</html>

33

Page 34: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les variables de formulaires et d'adresses web :

Ne vous est-il jamais arrivé de tomber sur des pages ayant des url à rallonge de ce style ? : page.php?param1=valeur&param2=autre_valeur (et ainsi de suite)PHP va vous permettre de récupérer le nom et la valeur des paramètres qui seront dans votre url si il y en a. Ceci est très pratique par exemple pour transmettre des variables et valeurs de page en page (exceptionnellement, car nous verrons qu'il existe un moyen plus efficace pour faire ceci plus loin dans notre approfondissement du PHP).

Avant d'utiliser ce principe sur vos pages, il faut faire par contre attention à la transmission de variables. En effet, si vous faites des traitements sur ces variables (ou si vous utilisez leur valeur) il faut bien faire attention à certaines choses, notamment les suivantes :

Si vous souhaitez afficher la valeur de la variable, il faut que si quelqu'un tape du code HTML dans la barre d'adresses, qu'il soit affiché et non considéré comme du code car n'importe qui peut mettre n'importe quoi (du javascript affichant une message box jusqu'à la récupération de cookies confidentiels sur le PC client).

Si vous allez utiliser la valeur dans une requête de base de données (si vous ne savez pas ce qu'est une base de données pas de souci, on verra tout ça après), il faut protéger la requête en utilisant des fonctions de protection comme mysql_real_escape_string() pour une base de données MySQL.

Imaginions que vous souhaitiez maintenant proposer un service d'affichage de prénom à des webmasters. Ils appelleront une page de votre site avec des paramètres dans l'adresse, et votre page renverra le prénom qui est dans l'url.

Prenons un exemple d'url :http://votresite.com/service.php?prenom=valeur&style=1 où valeur correspondra à la valeur du prénom !

Le nom des variables créées en PHP est très simple et commence par $_GET. Ici, en appelant cette page, PHP créera une variable nommée $_GET['prenom'] qui portera la valeur 'valeur' ainsi qu'une variable $_GET['style'] qui portera la valeur '1'.

Attention, ceci ne sera pas équivalent aux définitions de variables suivantes :

<?php      $_GET['prenom'] = 'X'; //un prénom n'importe lequel      $_GET['style']  = 1; //style qui est ici un entier ?>

En effet, vous pourriez bien vous dire que c'est la même chose, et ça l'est presque, il y a juste un tout petit détail dont il faut bien se rappeler : PHP considère les valeurs quelles qu'elles soient comme des chaînes de caractères !

Notre code est donc équivalent à ça :

<?php      $_GET['prenom'] = 'X'; //un prénom n'importe lequel      $_GET['style']  = '1'; //style qui est ici une chaîne de caractères ?>

34

Page 35: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Maintenant, si vous souhaitez faire des opérations sur ces variables, il faut tout d'abord vérifier qu'elles existent, sinon vous aurez une erreur, en effet si vous souhaitez par exemple afficher la valeur d'une variable qui n'existe pas, avec un PHP bien configuré vous obtiendrez une erreur de undefined variable. On utilise pour savoir si une variable existe, la fonction isset(). Si vous ne savez pas ce qu'est une fonction ce n'est pas bien grave, sachez juste que cette fonction renvoie un booléen VRAI si la variable existe, et FAUX sinon. Si nous souhaitons afficher le prénom, on regarde d'abord qu'il existe, on effectue ensuite un htmlentities() pour transformer un éventuel code html en sa valeur affichable (on empêche donc les failles de sécurité de ce style).

Notre code devient celui-ci :

<?php      if(isset($_GET['prenom'])) //On vérifie que la variable $_GET['prenom'] existe      {             echo htmlentities($_GET['prenom']); //On affiche le prénom tout en l'ayant protégé des failles d'injection de code HTML      } ?>

Les variables $_GET font partie de ce qu'on appelle des variables superglobales. Cela ne vous dit rien pour l'instant, mais sachez qu'il s'agit de variables accessibles depuis n'importe où (on verra plus loin que les variables ne peuvent pas être utilisées partout, et bien les superglobales peuvent l'être, en gros voici une des différences majeures qui les séparent des autres). Bon c'est bien beau vous allez me dire les variables $_GET, mais ça ne fait pas forcément ce que vous voudriez. Si vous souhaitez récupérer l'âge d'un visiteur qu'il aura rentré dans une zone de texte via la méthode post d'un formulaire, il va falloir utiliser cette fois-ci les variables nommées $_POST. Le principe est exactement le même que pour les variables $_GET. Prenons l'exemple d'un formulaire en XHTML contenant un champ texte nommé "age". Le visiteur remplira son âge et on l'affichera à l'écran.

Le code en XHTML est le suivant :

<form method="post" action="traitement.php"><p><input type="text" name="age" /></p><p><input type="submit" value="Envoyer" /></p></form>

Le code en PHP est très simple et peut se résumer à ça :

<?php      if(isset($_POST['age']) AND ctype_digit($_POST['age']) AND $_POST['age'] > 0)      {           echo htmlentities($_POST['age']);      } ?>

N'ayez pas peur en voyant tout ce code. En fait, la première fonction isset(), vous savez à quoi elle sert :p je vous l'ai expliqué tout à l'heure. Concernant la fonction ctype_digit(), elle permet de vérifier que la variable est bien composée de chiffres et uniquement de chiffres (que la chaîne soit un entier donc). On pourrait dire "bah oui mais pourquoi ne pas utiliser la fonction is_int() qui permet de vérifier si un nombre est un entier" ? tout simplement car comme je vous l'ai expliqué plus haut, les variables de type $_GET et $_POST sont considérées comme des chaînes de

35

Page 36: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

caractères par PHP et non des nombres. Pour finir, on vérifie que l'âge soit un nombre positif. Si toutes ces conditions sont réunies, on affiche l'âge.

La concaténation :

La quoi ? n'ayez pas peur en voyant ce terme barbare. La concaténation est l'opération qui permet de "coller" deux valeurs de variables pour n'en former qu'une par exemple. En PHP, l'opérateur de concaténation est le point (.)Pour cette partie, des exemples valent à mon avis mieux que de longs discours. Voyons comment afficher plusieurs variables à la suite ou encore compléter la valeur d'une variable déjà définie.

<?php      $nom    = 'Dupont';      $prenom = 'Pierre'; 

     echo $nom.$prenom; //va afficher "DupontPierre"      echo $nom.' '.$prenom; //va afficher "Dupont Pierre" 

     echo '$nom.$prenom'; //va afficher "$nom.$prenom"      echo '$nom$prenom'; //va afficher $nom$prenom 

     $nom .= $prenom; //est équivalent à $nom = $nom . $prenom 

     echo $nom; //affichera "DupontPierre" 

     $nom  = 'Dupont'; 

     $nom .= ' '.$prenom; 

     echo $nom; //affichera "Dupont Pierre" ?>

Je pense qu'on a fait le tour niveau exemples là :p

36

Page 37: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les fonctionsDéfinition et présentation

Une fonction est un bloc de code PHP destiné généralement à être réutilisé plusieurs fois. Plutôt que d'écrire X fois le morceau de code, on le met dans une fonction, et c'est cette fonction que l'on appellera dès qu'on l'aura décidé. On pourra utiliser les fonctions pour par exemple afficher un texte bien défini (ce que nous allons voir plus bas) ou encore effectuer des calculs répétitifs en fonction de paramètres d'entrée (comme par exemple calculer une conversion en degrés C° => degrés fahrenheit, vous fournissez la valeur des degrés Celcius et la fonction vous retourne l'autre valeur. Dans ce cas, le paramètre sera la température d'entrée en degrés C°).

Voici la syntaxe de base pour dire à PHP "ceci est une fonction, il faut la traiter comme telle" :

<?php      function mafonction()      { 

     } ?>

On constate que le premier mot est le mot function, il est obligatoire et signifie que le bloc traité par PHP sera une fonction. Une fonction comporte toujours des parenthèses.Il existe deux grands types de fonctions : les fonctions qui retournent une valeur, et celles qui n'en retournent pas (on appelle ces fonctions des procédures).

Exemple de procédure affichant "bonjour tout le monde !" :

<?php      function hello_world()      {           echo 'bonjour tout le monde !';      } ?>

Pour afficher Bonjour tout le monde ! n'importe où dans votre code, vous n'aurez plus qu'à taper ceci :

<?php      hello_world(); //appelle la fonction "hello_world" qui va afficher "Bonjour tout le monde !" ?>

37

Page 38: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les paramètres

Nous venons de voir l'exemple d'une procédure qui ne contenait aucun paramètre. Les paramètres sont des variables que l'on place entre les deux parenthèses. Ces paramètres servirons de données sur lesquelles effectuer la fonction. Généralement, les paramètres impliquent que l'on va retourner quelque chose (on aura donc de très grandes chances d'avoir des fonctions et non des procédures). Nous verrons plus loin que le passage par référence des paramètres (ne vous inquiétez pas si vous ne comprenez pas encore ce que je dis, vous le comprendrez en bas de cette page) permet de s'affranchir généralement du retour d'une valeur.

Exemple d'une fonction calculant le produit de deux nombres et retournant le résultat :

<?php      function produit($nombre1, $nombre2)      {            return $nombre1 * $nombre2;      } ?>

Ici la fonction retournera le produit des deux nombres. Remarquez qu'on utilise le mot clé return pour renvoyer une valeur. Vous pouvez également utiliser le mot clé return pour stopper l'exécution de la fonction (en retournant une valeur). Tout ce qui se trouve après return ne sera pas exécuté.

Si vous souhaitez afficher le produit de 10 et 2 par exemple, vous pouvez faire ceci :

<?php      echo produit(10, 2); ?>

Nous pouvons assigner des valeurs par défaut aux paramètres. Pourquoi assigner des valeurs par défaut ? c'est simple, assigner une valeur par défaut à un paramètre permet de se passer du passage du paramètre lorsque vous appelez la fonction (attention, ceci n'est pas général). Voici un exemple :

<?php      function produit($nombre1 = 10, $nombre2 = 2)      {            return $nombre1 * $nombre2;      } ?>

Ici, nous assignons comme valeurs par défaut les nombres 10 et 2. Si nous appelons maintenant notre fonction comme ceci :

<?php      echo produit(); ?>

38

Page 39: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Nous obtiendrons le même résultat que plus haut, car les deux paramètres ne sont pas obligatoires ici. Par contre attention, si vous renseignez un paramètre, il sera prioritaire, c'est à dire que si vous appelez la fonction comme ceci :

<?php      echo produit(5, 2); ?>

Ici, on multipliera 5 par 2 et pas 10 par 2. Donner une valeur par défaut aux paramètres convient donc lorsque vous souhaitez ne pas être obligé de rajouter des paramètres lorsque vous dites à PHP "exécute-moi cette fonction". Attention avec l'exemple suivant :

<?php      echo produit(5); ?>

Il n'y a qu'un seul paramètre ! Alors lequel va-t-il remplacer ? Et bien il s'agit du premier paramètre. En effet, lorsque vous ne renseignez pas tous les paramètres, PHP va remplacer les paramètres dans l'ordre.

Passage de paramètres par référence

Le passage de paramètres par référence n'est pas compliqué en soit. Voyons un exemple simple et expliquons ensuite son fonctionnement :

<?php      function ajouter_cinq($nombre)      {            $nombre += 5; //équivalent de $nombre = $nombre + 5            return $nombre;      } 

     $mon_entier = 15;      echo ajouter_cinq($mon_entier); //affichera 20 

     echo $mon_entier; //affichera 15 ?>

Ici on effectue ce qu'on appelle un passage de paramètres par recopie. Ne vous prenez pas trop la tête avec ces termes, il s'agit d'un peu de culture générale ;) En fait cela veut dire que la variable que l'on va passer dans la fonction (ici $mon_entier) sera recopiée dans une autre variable nommée $nombre (qui prendra donc la même valeur). La fonction utilise ensuite cette variable $nombre pour faire ses traitements, et non la variable $mon_entier. C'est pourquoi lorsqu'on affiche le contenu de la variable $mon_entier après avoir appelé la fonction, on obtient toujours 15.

39

Page 40: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voici maintenant la version avec le passage par référence :

<?php      function ajouter_cinq($nombre)      {            $nombre += 5; //équivalent de $nombre = $nombre + 5            return $nombre;      } 

     $mon_entier = 15;      echo ajouter_cinq(&$mon_entier); //affichera 20 

     echo $mon_entier; //affichera 20 ?>

L'avantage de ce type d'opération est que vous travaillez directement sur la variable d'origine, il n'y a pas de recopie et donc les performances peuvent être meilleures. Vous n'avez d'ailleurs plus forcément besoin de retourner une valeur. Prenons cet exemple qui fait exactement la même chose que le précédent :

<?php      function ajouter_cinq($nombre)      {            $nombre += 5; //équivalent de $nombre = $nombre + 5      } 

     $mon_entier = 15;      ajouter_cinq(&$mon_entier); 

     echo $mon_entier; //affichera 20 ?>

CAS PRATIQUES :

<?php

function hello_world()

{

echo "Bonjour le monde!"; //affiche la fonction

}

hello_world();

?>

40

Page 41: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<br/>

<?php

function produit($nbr1, $nbr2)

{

return $nbr1 * $nbr2;

}

echo produit(10,2);

?>

<br/>

<?php

function produit($nbr1=2, $nbr2=10)

{

return $nbr1 * $nbr2;

}

?>

<?php

echo produit();

?>

41

Page 42: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Fonction Description Code PHP Rés.

addslashes() 

Ajoute des anti-slashes devant les caractères spéciaux

$res = addslashes("L'a");

Echo $res ;L\'a

stripslashes() 

Retire les anti-slashes devant les caractères spéciaux.

$res = stripslashes("L\'a");Echo $res ; L'a

dechex() 

Retourne la valeur hexadécimale d'un nombre (ici 2548).

$res = dechex("2548");Echo $res ; 9f4

ceil()

Retourne le nombre entier supérieur ( utiliser floor() pour le nombre entier inférieur et round() pour le nombre entier le plus proche).

$res = ceil("12.1");Echo $res ; 13

chunk_split()

Permet de scinder une chaîne en plusieurs morceaux.

$res = chunk_split("DGDFEF","2","-");Echo $res ; DG-DF-EF-

htmlentities() Remplace les caractères par leur équivalent HTML (si ils

$res = htmlentities("&");Echo $res ;

&amp;

42

Page 43: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

existent).

strstr()

Recherche le premier caractère 'p' dans la chaîne et affiche le reste de la chaîne y compris le 'p'.

$res = strstr ("[email protected]", "p");Echo $res ;

phpdebutant.org

strlen()Retourne la longueur de la chaîne

$res = strlen("lachainedecaracteres");Echo $res ; 20

strtolower()

Passe tous les caractères en minuscules.

$res = strtolower("LA CHAINE dE caRActERes");Echo $res ;

la chaine de caracteres

strtoupper()

Passe tous les caractères en MAJUSCULES.

$res = strtoupper("LA CHAINE dE caRActERes");Echo $res ;

LA CHAINE DE CARACTERES

str_replace()

Remplace un caractère par un autre dans une chaîne. Tiens compte de la casse.

$res = str_replace("a","o","Lalala");Echo $res ; Lololo

trim()

Efface les espaces blancs (\n, \r, etc)  au début et à la fin d'une chaîne (pas au milieu).

$res = trim("  Salut le monde   ");Echo $res ; Salut le monde

ucfirst() Met la première lettre de chaque chaîne en

$res = ucfirst("salut le monde. ca va ?");Echo $res ;

Salut le monde. ca va ?

43

Page 44: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Majuscule.

ucwords()

Met la première lettre de chaque mot d'une chaîne en Majuscule.

$res = ucwords("salut le monde");Echo $res ; Salut Le Monde

strpos()

Recherche la position du premier caractères trouvé. Retourne le nombre de caractères placés avant lui (ici 4).

$res = strpos("abcdef","e");Echo $res ; 4

ereg()

Recherche si une chaîne de caractère est contenue dans une autre (ex. recherche si "ABCDE" contient "BCD").

if(ereg("BCD","ABCDEF")){echo "oui";} else {echo "non";} oui

44

Page 45: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les conditionsDéfinition et présentation

Les conditions sont les éléments les plus utilisés dans n'importe quel langage. Il est impossible de faire l'impasse dessus. Grâce aux conditions, vous allez pouvoir effectuer des actions telles que "Si le visiteur est un homme, afficher 'Bonjour Monsieur', sinon afficher 'Bonjour Madame'". Vous allez pouvoir effectuer plein de traitements en fonction de données diverses. Une condition n'est ni plus ni moins qu'un bloc de code PHP contenant des instructions à exécuter en fonction de la condition qui elle sera placée entre parenthèses (bien que ce ne soit pas toujours le cas, on verra tout en bas l'opérateur ternaire, en attendant ne soyez pas affolés par le terme, tout deviendra compréhensif plus bas).

Voyons déjà quelques opérateurs nécessaires pour appliquer tout ça aux conditions :

Les opérateurs de base conditionnels

On utilise quelques opérateurs très simples en PHP pour comparer deux variables. Nous ne verrons pas certains opérateurs particuliers qui dépassent le cadre de ce chapitre, mais vous les reverrez dans la partie qui concernera l'optimisation et la rédaction de vos scripts.

Voici les opérateurs de base et leur signification :

Symbole Signification

$a == $b $a est égal à $b

$a < $b $a est inférieur à $b

$a > $b $a est supérieur à $b

$a <= $b $a est inférieur ou égal à $b

$a >= $b $a est supérieur ou égal à $b

$a != $b $a est différent de $b

$a <> $b $a est différent de $b

45

Page 46: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

La structure de base if/else

La structure if / else est la base en PHP. Grâce à elle, vous allez pouvoir effectuer deux choses : une action si la condition est vraie, et une autre action si elle est fausse. On traduit le if par "si" et le else par "sinon". Voyons un exemple :

<?php      $heure = 12; //On définit une heure 

     if($heure < 12) //Si l'heure contenue dans la variable est inférieure à 12      {           echo 'Il n\'est pas encore midi !';      } ?>

Vous constaterez en exécutant ce code qu'en fonction de ce que vous allez attribuer à la variable $heure, le message "Il n'est pas encore midi" s'affichera ou non. Vous pouvez tout à fait effectuer plusieurs actions dans une condition. Vous pouvez également imbriquer des conditions :

<?php      $heure = 12; //On définit une heure 

     if($heure < 12) //Si l'heure contenue dans la variable est inférieure à 12      {           echo 'Il n\'est pas encore midi !'; 

          if($heure == 11)           {                 echo 'Il est bientôt midi !';           }      } ?>

Notez l'utilisation du double égal, si vous mettez un simple signe égal, ça voudra dire "si j'ai attribué 11 à la variable, alors faire l'action", le problème est qu'attribuer une valeur à une variable renvoie toujours (dans notre cas) la valeur VRAI, donc la condition sera toujours exécutée. Pensez-y lorsque vous coderez vos scripts PHP car sinon vous risquez de vous retrouver avec des erreurs insolubles !Bon tout ça c'est bien beau, mais vous aimeriez peut-être passer à plus évolué ! Nous allons donc voir maintenant le if / else en PHP. Else signifie "sinon", nous allons prendre un exemple simple qui consiste à comparer les valeurs de deux variables. Si les deux variables sont égales, nous afficherons "Les valeurs sont égales" dans le cas contraire nous afficherons "Les valeurs ne sont pas égales".

<?php      $nombre1 = 12;      $nombre2 = 13; 

     if($nombre1 == $nombre2) //Si les deux nombres sont égaux      {            echo 'Les valeurs sont égales';      }      else //Sinon 

46

Page 47: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     {            echo 'Les valeurs ne sont pas égales';      } ?>

Nous allons maintenant voir une autre structure de base un peu plus évoluée que le if / else, il s'agit du if / elseif / else.

La structure conditionnelle if / elseif / else

En français, on appelle cette structure le "si, sinon si, sinon". Grâce à ça, vous allez pouvoir exécuter des instructions PHP en fonction de conditions plus poussées. Prenons un exemple simple consistant à dire "Si les deux nombres sont égaux, on affiche 'Les valeurs sont égales' sinon si le nombre 1 est supérieur au nombre 2 on affiche 'Le nombre 1 est supérieur' et si aucune de ces conditions n'est validée, on affiche 'Le nombre 2 est supérieur'".

Voyons ce que ça donne niveau code :

<?php      $nombre1 = 12;      $nombre2 = 13; 

     if($nombre1 == $nombre2) //Si les deux nombres sont égaux      {            echo 'Les valeurs sont égales';      }      elseif($nombre1 > $nombre2) //Les deux nombres ne sont pas égaux mais $nombre1 est supérieur à $nombre2      {            echo 'Le nombre 1 est supérieur';      }      else //Les deux nombres ne sont pas égaux, et $nombre1 n'est pas supérieur à $nombre2      {            echo 'Le nombre 2 est supérieur';      } ?>

Au niveau purement syntaxique, le code que je viens de vous présenter est équivalent à celui-ci :

<?php      $nombre1 = 12;      $nombre2 = 13; 

     if($nombre1 == $nombre2) //Si les deux nombres sont égaux      {            echo 'Les valeurs sont égales';      }      else //Les deux nombres ne sont pas égaux      {           if($nombre1 > $nombre2) //$nombre1 est supérieur à $nombre2           { 

47

Page 48: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

               echo 'Le nombre 1 est supérieur';           }           else //$nombre1 n'est pas supérieur à $nombre2           {                echo 'Le nombre 2 est supérieur';           }      } ?>

Les conditions multiples

Les conditions multiples vont vous permettre de donner plusieurs conditions pour effectuer une ou plusieurs actions. Par exemple, si vous souhaitez que les visiteurs aient plus de 13 ans pour visiter le site et qu'ils soient des hommes, vous pourrez faire une condition de ce style :

<?php      $homme = FALSE; //booléen ayant la valeur FALSE (faux) ici il s'agit donc d'une femme      $age   = 17; 

     if($homme === TRUE AND $age > 13) //Le visiteur est un homme et agé de plus de 13 ans      {            echo 'Vous pouvez visiter le site';      }      else //Le visiteur est une femme ou alors il a moins de 13 ans      {            echo 'Vous ne pouvez pas visiter le site';      } ?>

Notez la présence ici du triple égal. Ce n'est pas une erreur. Je ne vous ai pas présenté cet opérateur auparavant pour ne pas compliquer la tâche. En fait cet opérateur, en plus de comparer les valeurs des variables, compare également leurs types (bien que la notion de type soit très faible en PHP). Cet opérateur permet de valider une condition si les variables ont même valeur et même type. En fait, un booléen peut aussi être représenté par un nombre (0 pour FALSE et 1 pour TRUE). Le problème est que lorsque vous utiliserez des fonctions qui renvoient des booléens ou des nombres, comment distinguer 0 et 1 de FALSE et TRUE ?. C'est là qu'intervient le signe ===, qui vous permettra de savoir si la fonction a renvoyé TRUE ou 1, ce que ne permet pas de faire l'opérateur ==

Il existe de la même manière l'opérateur !== qui regarde si deux variables sont de valeurs ou de types différents.

Voyons maintenant la liste des opérateurs utilisables :Opérateur Signification

AND "et" logique

OR "ou" logique

48

Page 49: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

XOR "ou exclusif" logique

&& "et" logique, avec priorité supérieure

|| "ou" logique, avec priorité supérieure

Voyons un peu les opérateurs && et || ainsi que leurs différences avec les opérateurs AND et OR. Prenons le cas d'une condition qui doit vérifier "Si il s'agit d'un homme ou d'une femme qui a dans ce cas plus de 13 ans, on autorise l'accès au site". On constate que tous les hommes peuvent accéder au site, mais les femmes doivent avoir au moins 13 ans. On peut faire ça de plusieurs façons. La première, purement logique, utilise des parenthèses (en effet, ce qui se trouve entre parenthèses sera traité en premier par PHP, comme en mathématiques) :

<?php      if($homme === TRUE OR ($hommme === FALSE AND $age > 13)) //On veut soit tous les hommes, soit les filles de plus de 13 ans      {            echo 'Vous pouvez visiter le site';      }      else      {            echo 'Vous ne pouvez pas visiter le site';      } ?>

Vous constatez qu'au bout d'un moment, si les conditions sont multiples, le nombre de parenthèses peut être important, nous allons donc utiliser les opérateurs prioritaires && et || pour supprimer les parenthèses. Voici le code obtenu :

<?php      if($homme === TRUE OR $hommme === FALSE && $age > 13) //On veut soit tous les hommes, soit les filles de plus de 13 ans      {            echo 'Vous pouvez visiter le site';      }      else      {            echo 'Vous ne pouvez pas visiter le site';      } ?>

49

Page 50: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Comme le && est prioritaire, PHP effectue d'abord le traitement pour savoir si il s'agit d'une fille ayant plus de treize ans. On pourrait simuler ça par ce code :

<?php      if($homme === TRUE OR $fille_de_plus_de_treize_ans === TRUE) //On veut soit tous les hommes, soit les filles de plus de 13 ans      {            echo 'Vous pouvez visiter le site';      }      else      {            echo 'Vous ne pouvez pas visiter le site';      } ?>

Ensuite PHP utilise le OR classique pour faire une condition entre les deux variables.

50

Page 51: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques :<html lang="en">

<head><title>Logical</title>

</head><body>

<?php$a = 3;$b = 4;

if ($a > $b) {echo "a is larger than b";

} elseif ($a < $b) {echo "a is smaller than b";

} else {echo "a is equal to b";

}

?><br /><?php // Only welcome new users

$new_user = true;if ($new_user) {

echo "<h1>Welcome!</h1>";echo "<p>We are glad you decided to join us.</p>";

}?><br />

<?php // don't divide by zero$numerator = 20;$denominator = 0;$result = 0;if ($denominator > 0) {

$result = $numerator / $denominator;}echo "Result: {$result}";

?>

</body></html>

51

Page 52: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Le switch

Le switch est une instruction particulière. En effet, vous allez pouvoir remplacer des quantités de if/elseif/else par un seul switch. Voyons comment cela fonctionne avec un exemple simple : Imaginions que nous souhaitons afficher un message différent en fonction d'un nombre. Si ce nombre vaut 1, on affichera "le nombre vaut 1", si il vaut 2 "le nombre vaut 2", et si il vaut 7, on affichera "c'est un très bon chiffre".

Ceci est possible via le code suivant :

<?php      $nombre = 7;      if($nombre == 1)      {            echo 'Le nombre vaut 1';      }      elseif($nombre == 2)      {            echo 'Le nombre vaut 2';      }      elseif($nombre == 7)      {            echo 'C\'est un très bon chiffre !';      }      else      {            echo 'Le nombre ne vaut ni 1, ni 2, ni 7';      } ?>

52

Page 53: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Vous constaterez que si vous voulez faire 10 cas possibles, ça va devenir très lourd au niveau de la syntaxe.

<?php      $nombre = 7;      switch($nombre)      {            case 1:                echo 'Le nombre vaut 1';            break;            case 2:                echo 'Le nombre vaut 2';            break;            case 7:                echo 'C\'est un très bon chiffre !';            break;            default:                echo 'Le nombre ne vaut ni 1, ni 2, ni 7';            break;      } ?>

La syntaxe est quand même nettement plus réduite. Maintenant, nous allons voir à quoi correspondent ces "case", "break" et encore "default". Regardez la structure du switch(). A l'intérieur des parenthèses, on met une seule variable pour laquelle on souhaitera comparer sa valeur (ou effectuer des conditions dessus). Chaque instruction case permet ensuite de délimiter une condition, on peut donc voir ça comme ça : si $nombre correspond à 1, alors on exécute le echo 'Le nombre vaut 1';

Le break veut dire qu'il faut que PHP s'arrête, c'est l'équivalent de la fin de condition.

Imaginions que vous ayez le code suivant :

<?php      $nombre = 7;      switch($nombre)      {            case 1:case 2:                echo 'Le nombre vaut 1 ou 2';            break;            case 7:                echo 'C\'est un très bon chiffre !';            break;            default:                echo 'Le nombre ne vaut ni 1, ni 2, ni 7';            break;      } ?>

53

Page 54: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Je pense que vous comprenez le fonctionnement du break à présent, ainsi que de l'utilisation de conditions OU (ici, on affiche un message différent si le nombre vaut soit 1, soit 2). Voyons maintenant comment insérer des conditions plus évoluées dans le switch :

<?php       $nombre = 8;       switch($nombre)       {             case $nombre < 7:                 echo 'Le nombre est inférieur à 7';             break;             case 7:                 echo 'C\'est un très bon chiffre !';             break;            case $nombre > 7:                echo 'le nombre est supérieur à sept';            break;            default:                 echo 'Le nombre ne vaut ni 1, ni 2, ni 7';             break;       } ?>

A noter que vous pouvez tout à fait utiliser des AND, OR, etc ... dans les instructions case du switch !

54

Page 55: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques :

<html lang="en">

<head>

<title>Switch</title>

</head>

<body>

<?php

$a = 2;

switch ($a) {

case 0:

echo "a equals 0<br />";

break;

case 1:

echo "a equals 1<br />";

break;

case 2:

echo "a equals 2<br />";

break;

case 3:

echo "a equals 3<br />";

break;

default:

echo "a is not 0, 1, 2, or 3<br />";

break;

}

?>

55

Page 56: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php

// ChineseZodiac

// whitespace doesn't matter

// colons, semicolons and breaks do

$year = 2013;

switch (($year - 4) % 12) {

case 0: $zodiac = 'Rat'; break;

case 1: $zodiac = 'Ox'; break;

case 2: $zodiac = 'Tiger'; break;

case 3: $zodiac = 'Rabbit'; break;

case 4: $zodiac = 'Dragon'; break;

case 5: $zodiac = 'Snake'; break;

case 6: $zodiac = 'Horse'; break;

case 7: $zodiac = 'Goat'; break;

case 8: $zodiac = 'Monkey'; break;

case 9: $zodiac = 'Rooster'; break;

case 10: $zodiac = 'Dog'; break;

case 11: $zodiac = 'Pig'; break;

}

echo "{$year} is the year of the {$zodiac}.<br />";

?>

<?php // case with multiple values

$user_type = 'customer';

switch ($user_type) {

case 'student':

echo "Welcome!";

56

Page 57: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

break;

case 'press':

case 'customer':

case 'admin':

echo "Hello!";

break;

}

?>

</body>

</html>

57

Page 58: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - les variables prédéfiniesLes variables prédéfinies : ce sont des variables inclues dans PHP qui évitent le recours à des fonctions longues pour obtenir le même résultat. Elles sont très utiles et permettent d'avoir des informations sur le client et le serveur.Voici les variables classées par type :Les variables serveur :On obtient leur valeur comme ceci :$_SERVER['nom_de_la_variable'];

Voici les variables serveur : $_SERVER['PHP_SELF']

Donne l'arborescence de la page courante en partant de la racine de votre site (si PHP fonctionne en ligne de commande la variable n'est pas accessible)

$_SERVER['GATEWAY_INTERFACE']Contient le numéro de révision de l'interface CGI du serveur

$_SERVER['SERVER_NAME']Nom du serveur hôte sur lequel est exécuté le script.

$_SERVER['SERVER_PROTOCOL']Nom et révision du protocole de communication : HTTP/1.0

$_SERVER['REQUEST_METHOD']Méthode de requête utilisée pour accéder à la page : 'GET','HEAD', 'POST' ou 'PUT'

$_SERVER['QUERY_STRING']Donne les arguments placés après le point d'interrogation si ils existent dans l'URL.

$_SERVER['DOCUMENT_ROOT']Racine de votre site.

$_SERVER['HTTP_ACCEPT_ENCODING']Contenu de l'en-tête Accept-Encoding: de la requête courante, si elle existe. Par exemple : 'gzip'.

$_SERVER['HTTP_ACCEPT_LANGUAGE']Langage utilisé par votre navigateur : 'fr'

$_SERVER['HTTP_REFERER']C'est l'adresse de la page par laquelle le client est venu sur votre site. Certains navigateurs permettent de modifier cette valeur, et certains pare-feux la bloquent.

$_SERVER['HTTP_USER_AGENT']Navigateur utilisé par le client.

$_SERVER['REMOTE_ADDR']Adresse ip du client.

$_SERVER['REMOTE_HOST']Résolution DNS inverse qui permet de donner le nom d'hôte de l'IP du client

$_SERVER['REMOTE_PORT']Port utilisé (généralement le 80) pour envoyer et recevoir des données HTTP entre le serveur et le client.

$_SERVER['SCRIPT_FILENAME']Chemin absolu du script courant.

$_SERVER['PATH_TRANSLATED']Chemin qui pointe sur le script courant.

$_SERVER['SCRIPT_NAME']Nom de la page courante.

$_SERVER['REQUEST_URI']URI servant à accéder à la page courante, /mapage.php par exemple.

58

Page 59: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les autres variables prédéfinies : $GLOBALS : ce tableau contient toutes les variables globales définies. $_GET : ce tableau contient toutes les variables provenant de l'URL courante. $_POST : ce tableau contient toutes les variables provenant d'un formulaire en

méthode post. $_SERVER : ce tableau contient toutes les variables fournies par le serveur Web

ou le client. $_COOKIE : ce tableau contient toutes les valeurs et noms des cookies envoyés

par le client. $_FILES : ce tableau contient les variables fournies par le navigateur lors d'un

upload de fichier par le client. $_ENV : ce tableau contient toutes les variables fournies par l'environnement

PHP. $_REQUEST : ce tableau contient toutes les variables fournies par l'intermédiaire

d'un script d'entré (GET,POST,COOKIE... par exemple). $_SESSION : ce tableau contient toutes les variables de session utilisées.

Exemples pratiques :

<?php

getenv("COMPUTERNAME");

print getenv("COMPUTERNAME");

echo "<br/>";

getenv("REMOTE_ADDR");

print getenv("REMOTE_ADDR");

echo "<br/>";

getenv ("PHP_SELF");

print $_SERVER["PHP_SELF"];

echo "<br/>";

getenv ("GATEWAY_INTERFACE");

print $_SERVER["GATEWAY_INTERFACE"];

echo "<br/>";

getenv ("HTTP_USER_AGENT");

print $_SERVER["HTTP_USER_AGENT"];

echo "<br/>";

getenv ("HTTP_ACCEPT_LANGUAGE");

print $_SERVER["HTTP_ACCEPT_LANGUAGE"];

59

Page 60: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

echo "<br/>";

getenv ("REMOTE_PORT");

print $_SERVER["REMOTE_PORT"];

echo "<br/>";

getenv ("SCRIPT_FILENAME");

print $_SERVER["SCRIPT_FILENAME"];

echo "<br/>";

?>

Variables Description Résultat à l'écran (Free.fr)

$_SERVER['DOCUMENT_ROOT']Racine du serveur

/var/www/php.proxad.net

$_SERVER['HTTP_ACCEPT_LANGUAGE']

Langage accepté par le navigateur

fr

$_SERVER['HTTP_HOST']Nom de domaine du serveur

proxyphp3.free.fr

$_SERVER['HTTP_USER_AGENT']Type de navigateur

Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)

$_SERVER['PATH_INFO']Chemin web du script

/d2expert.free.fr/phpdebutant/fichier.php

$_SERVER['PATH_TRANSLATED']Chemin complet du script

/var/www/free.fr/3/d/2/e/x/d2expert/phpdebutant/fichier.php

$_SERVER['REQUEST_URI']Chemin du script

/d2expert.free.fr/phpdebutant/fichier.php

$_SERVER['REMOTE_ADDR']Adresse IP du client

195.132.7.201

$_SERVER['REMOTE_PORT'] Port de la requête

45039

60

Page 61: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

HTTP

$_SERVER['QUERY_STRING']

Liste des paramètres passés au script

var=23&data=ok

$_SERVER['SERVER_ADDR']Adresse IP du serveur

212.27.32.44

$_SERVER['SERVER_ADMIN']

Adresse de l'administrateur du serveur

[email protected]

$_SERVER['SERVER_NAME']Nom local du ser`_veur

php.proxad.net

$_SERVER['SERVER_SIGNATURE']

Type de serveur

?

$_SERVER['REQUEST_METHOD']Méthode d'appel du script

GET

Comment débugger une page php ?

<?php

$number = 99;

$string = "Bug?";

$array = array(1 => "Homepage", 2 => "About Us", 3 => "Services");

var_dump($number);

echo "<br/>";

var_dump($string);

echo "<br/>";

var_dump($array);

echo "<br/>";

61

Page 62: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

gettype($array);

echo "<br/>";

print_r($array);

echo "<br/>";

get_defined_vars();

echo "<br/>";

debug_backtrace();

?>

62

Page 63: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les URL en PHP<html lang="en">

<head>

<title>url_get_header</title>

</head>

<body>

<pre>

<?php

$url = 'http://www.dweb.be';

print_r(get_headers($url));

?>

</pre>

</body>

</html>

Comment passer des infos sur une autre page avec l’url ?

FIRST PAGE

<html lang="en">

<head>

<title>First Page</title>

</head>

<body>

<?php $link_name = "Second Page"; ?>

<?php $id = 5; ?>

<?php $company = "Johnson & Johnson"; ?>

63

Page 64: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<a href="second_page.php?id=<?php echo $id; ?>&company=<?php echo rawurlencode($company); ?>"><?php echo $link_name; ?></a>

<?php

$encoded = implode("/", array_map("rawurlencode", explode("/", $path)));

?>

</body>

</html>

SECONDE PAGE

<html lang="en">

<head>

<title>Second Page</title>

</head>

<body>

<pre>

<?php

print_r($_GET);

?>

</pre>

<?php

$id = $_GET['id'];

echo $id;

?>

<br />

<?php

$company = $_GET['company'];

64

Page 65: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

echo $company;

?>

</body>

</html>

65

Page 66: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les bouclesDéfinition et présentation

Les boucles vont vous permettre d'effectuer un certain nombre de fois les mêmes opérations, par exemple afficher une suite de nombres que l'on incrémentera à chaque tour de boucle. Vous allez pouvoir répéter autant d'instructions que vous souhaitez et vous arrêter lorsque vous l'aurez décidé, selon une condition bien précise par exemple (si vous ne vous rappelez plus de ce qu'est une condition, je vous engage à relire le chapitre les concernant). Voyons maintenant différents types de boucles que nous expliquerons au fur et à mesure. Commençons par la boucle la plus simple, la boucle while.

La boucle while

Cette boucle qui est une des plus utilisées en PHP va vous permettre d'effectuer une ou plusieurs actions tant que la condition que vous placerez à l'intérieur des parenthèses sera vérifiée. Voyons de plus près sa syntaxe :<?php      while(condition)      {            instruction 1;            instruction 2;            ...      } ?>

Voyons maintenant un exemple. Imaginiez que vous souhaitez afficher la valeur d'un nombre tant que celui-ci est inférieur à 7. Dès que le nombre sera supérieur à 7, vous quitterez la boucle. Le nombre sera incrémenté d'une unité à chaque tour de boucle. Voilà ce que ça donne avec une boucle while en pratique :

<?php      $i = 0; //on définit la variable $i qui sera notre nombre que l'on incrémentera. Ici $i va commencer à 0      while($i < 7)      {            echo $i.'<br />'; 

           $i++;      } ?>

On traduit donc la boucle while tant que. Tant que la condition est vérifiée (ici $i < 7), PHP traite les instructions situées dans la boucle. Vous pouvez mettre plusieurs conditions entre parenthèses. Voyons un autre exemple, cette fois-ci nous souhaitons que $i reste inférieur à sept et que $j soit inférieur à 5 :

<?php      $i = 0; //on définit la variable $i qui sera notre nombre que l'on incrémentera. Ici $

66

Page 67: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

i va commencer à 0      $j = 4;      while($i < 7 AND $j < 5)      {            echo $i.'<br />'; 

           $i++;            $j++;      } ?>

Vous allez constater que la variable $i ne s'affiche qu'une seule fois. Pourquoi ? car au prochain tour de boucle, $j vaudra 5, or on n'effectue la boucle que si $i < 7 ET $j < 5. Vous l'avez compris, vous pouvez utiliser ici toutes les conditions que l'on a vues au chapitre précédent.

67

Page 68: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques :

<html lang="en"><head>

<title>Loops: while</title></head><body>

<?php$count = 0;while ($count <= 10) {

if ($count == 5) {echo "FIVE, ";

} else {echo $count . ", ";

}$count++; // increment by 1

}echo "<br />";echo "Count: {$count}";

?>

<br /><br /><?php // On your own exercise

$count = 1;while ($count < 20) {

if($count % 2 == 0) {echo "{$count} is even<br />";

} else {echo "{$count} is odd<br />";

}$count++;

}

?></body>

</html>

68

Page 69: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voyons maintenant une boucle différente, la boucle for.

La boucle for

Cette boucle est très utile lorsque, comme pour notre premier exemple, vous souhaitez incrémenter une variable sur une certaine plage de valeurs connue à l'avance.

Etudions sa syntaxe :

<?php      for(initialisation; condition de continuité ; expression 3)      {            instruction 1;            instruction 2;            ...      } ?>

La première expression (initialisation) est interprétée au premier démarrage de la boucle. Elle ne sera exécutée qu'une seule fois (et non à chaque tour de boucle). On y place généralement l'initialisation des variables. La deuxième condition est appelée condition de continuité, on la place pour dire "si cette condition est respectée, alors la boucle peut continuer". La troisième expression sera elle interprétée à la fin de chaque tour de boucle. On y place généralement l'incrémentation d'une variable, mais vous pouvez y mettre n'importe quoi, faites attention cependant aux boucles infinies. On entend par boucle infinie une boucle qui ne s'arrête jamais. Outre le fait de monopoliser le processeur, votre script ne s'arrêtera pas en fonction de la configuration de PHP.

Voici notre premier exemple qui utilise cette fois-ci une boucle for :

<?php      for($i=0;$i < 7;$i++)      {            echo $i.'<br />';      } ?>

Vous pouvez constater que pour cet exemple précis, le code a été légèrement réduit. Ces deux codes sont pourtant équivalents. Reprenons notre deuxième exemple, cette fois-ci à l'aide d'une boucle for.

Comme vous allez pouvoir le constater, on peut également placer plusieurs conditions :

<?php      $i = 0; //on définit la variable $i qui sera notre nombre que l'on incrémentera. Ici $i va commencer à 0      for($j=4;$i < 7 AND $j < 5;$j++)      {            echo $i.'<br />';            $i++;      } ?>

69

Page 70: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

70

Page 71: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques : Les boucles For

<html lang="en">

<head>

<title>Loops: for</title>

</head>

<body>

<?php // while loop example

$count = 0;

while ($count <= 10) {

echo $count . ", ";

$count++;

}

?>

<br />

<?php

for($count = 0; $count <= 10; $count++) {

echo $count . ", ";

}

?>

<br />

<?php

for ($count = 20; $count > 0; $count--) {

if ($count % 2 == 0) {

echo "{$count} is even.<br />";

71

Page 72: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

} else {

echo "{$count} is odd.<br />";

}

}

?>

</body>

</html>

72

Page 73: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voyons maintenant une dernière boucle, qui n'est pas plus compliquée qu'une boucle while. Il s'agit de la boucle do-while.

La boucle do-while

Rien qu'au nom de la boucle, vous pouvez vous douter qu'elle a des similitudes avec la boucle while. Effectivement, c'est le cas ! Néanmoins, une différence de taille les séparent. Reprenons notre premier exemple avec la boucle while :

<?php      $i = 0; //on définit la variable $i qui sera notre nombre que l'on incrémentera. Ici $i va commencer à 0      while($i < 7)      {            echo $i.'<br />'; 

           $i++;      } ?>

Vous constatez que si on initialise $i à 8, la boucle ne sera jamais exécutée, car dès l'analyse de la condition, 8 < 7 renverra FALSE (et oui, 8 est bien inférieur à 7 !).Vous aimeriez peut-être effectuer au moins une fois une opération, et si une condition est vraie, reboucler autant de fois que vous le souhaitez ? la boucle do-while permet de le faire en PHP. Voici sa syntaxe :<?php      do      {            instruction 1;            instruction 2;            ...      }     while(condition) ?>

Dans ce cas, les instructions seront exécutées au moins une fois, même si la condition de continuité est fausse. Par contre, si la condition de continuité est vraie, PHP rebouclera. Voyons notre exemple du 8 < 7 avec une boucle do-while :

<?php      $i = 8;      $j = 7; 

     do      {           echo 'la boucle a bouclé<br />';      } 

73

Page 74: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     while($i < $j) ?>

Pour illustrer les if, else et elseif, voici un exemple très simple à lire, nous définissons une variable à la valeur ' 512 ' puis nous allons tester si celle-ci est comprise entre 0 et 499 puis entre 500 et 999 et enfin supérieure à 999, ce qui nous donne :

<? $toto = 512;

// on enchaîne les contrôles ci-dessous ---- if($toto>=0 && $toto<500) //1er { echo $toto.' est compris entre 0 et 499'; } elseif($toto>=500 && $toto<1000) //2eme { echo $toto.' est compris entre 500 et 999'; } else //3eme { echo $toto.' est plus grand que 999'; } ?>

1er contrôle : Si (512 est plus grand ou égal à 0 et que 512 est plus petit que 500) { on affiche le 1er message ; }2e contrôle : Si (512 est plus grand ou égal à 500 et que 512 est plus petit que 1000) { on affiche le 2e message ; }3e contrôle : Dans tous les autres cas { on affiche le 3e message ; }

74

Page 75: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les tableauxDéfinition et présentation

Les tableaux vont vous changer la vie ! en fait, il s'agit de variables qui peuvent contenir plusieurs valeurs. On peut donc imaginer leur représentation sous forme d'un tableau. Pour différencier les valeurs, pour savoir comment on va dire à PHP "je veux telle valeur de cette variable" il faut bien distinguer les valeurs par des indices.

Ces indices. Voilà comment on peut représenter tout ça :

Indice Valeur

0 Maurice

1 Jean

2 Pierre

3 Paul

On peut voir ici qu'il s'agit d'une liste de prénoms. On appelle cela un tableau, aussi appelé array. La syntaxe de définition du tableau en PHP (pour dire "voilà, cette variable sera un tableau") sera de la forme suivante :

<?php      $prenoms = array(); //on déclare le tableau de prénoms, remarquez que cela se fait avec la fonction array() 

     /*        On va initialiser les valeurs pour les indices 0, 1, 2  et 3       */ 

     $prenoms[0] = 'Maurice';      $prenoms[1] = 'Jean';      $prenoms[2] = 'Pierre';      $prenoms[3] = 'Paul'; ?>

Les tableaux peuvent avoir des indices sous forme de nombres entiers ou de chaînes de caractères. On parle alors respectivement en PHP de tableaux indexés et de tableaux associatifs. Pour les tableaux indexés, le premier indice commence toujours à 0 lorsque le tableau est généré par une fonction. Vous pouvez cependant forcer les indices aux valeurs que vous souhaitez, mais cela peut être source d'erreurs. Faites-y donc attention ;)

75

Page 76: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les tableaux à indices numériques (indexés)

En PHP, les tableaux indexés diffèrent uniquement des tableaux associatifs par leurs indices. Ici, ils sont numériques.

Nous avons vu dans le premier exemple de ce cours comment affecter différentes valeurs à un tableau :

<?php      $prenoms = array(); //on déclare le tableau de prénoms, remarquez que cela se fait avec la fonction array() 

     /*        On va initialiser les valeurs pour les indices 0, 1, 2  et 3       */ 

     $prenoms[0] = 'Maurice';      $prenoms[1] = 'Jean';      $prenoms[2] = 'Pierre';      $prenoms[3] = 'Paul'; ?>

Voyons une syntaxe équivalente :

<?php      $prenoms = array(0 => 'Maurice',                       1 => 'Jean',                       2 => 'Pierre',                       3 => 'Paul'); //on initialise le tableau de prénoms ?>

Dans le cas où vous souhaitez garder le premier indice à zéro (et les suivants incrémentés de 1 à chaque fois) vous pouvez également utiliser la syntaxe suivante :

<?php      $prenoms = array('Maurice', 'Jean', 'Pierre', 'Paul'); //on initialise le tableau de prénoms ?>

C'est bien beau tout ça, mais comment afficher la valeur du tableau pour un indice spécifié ? bah on utilise toujours echo, mais cette fois-ci voilà comment on accède au tableau :

<?php      echo $prenoms[0]; //Va afficher "Maurice"      echo $prenoms[1]; //Va afficher "Jean" 

     ... ?>

Les tableaux associatifs

76

Page 77: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP peut également vous permettre de distinguer les différentes valeurs de vos tableaux par des indices associatifs. Ils sont constitués de chaînes de caractères. Prenons cette fois l'exemple d'un article. On va le différencier par plusieurs choses : Son numéro unique Son nom Son prix

Voilà comment on pourrait représenter ça avec un tableau associatif :

<?php      /*        Première possibilité      */ 

     $article = array('Numero' => 77,                        'Nom'            => 'Nom de l\'article',                        'Prix'             => 7); 

     /*        Autre possibilité      */ 

     $article = array(); 

     $article['Numero'] = 77;      $article['Nom']      = 'Nom de l\'article';      $article['Prix']       = 7; ?>

Si on veut afficher le prix de l'article, on utilisera toujours echo, mais de cette façon :

<?php      echo $article['Prix']; //Affiche "7" ?>

Parcourir un tableau

Les tableaux offrent une possibilité assez intéressante qui est de stocker plusieurs données dans une seule variable. PHP vous permet d'appliquer de nombreuses opérations sur les tableaux, donc celle de les parcourir. En effet, vous aurez par exemple besoin de lister tous les articles d'un tableau pour les afficher. On peut utiliser pour faire cette opération la fonction foreach(), dont nous allons voir la syntaxe de base ici :

<?php      $tableau = array(...); 

     foreach($tableau AS $indice => $valeur)      {              instructions;      } ?>Voici ce que cela donne avec un exemple :

77

Page 78: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php      $tableau = array(0 => 'Chiffre 0',                       1 => 'Chiffre 1',                       2 => 'Chiffre 2'); 

     foreach($tableau AS $cle => $valeur)      {              echo $cle.' | '.$valeur.'<br />';      } ?>

Exécutez ce code et regardez ce que cela affiche ;) La variable $cle va récupérer l'indice du tableau, et la variable $valeur sa valeur associée. Si vous n'avez pas besoin de récupérer l'indice, vous pouvez également utiliser la fonction foreach() comme ceci :

<?php      $tableau = array(0 => 'Chiffre 0',                       1 => 'Chiffre 1',                       2 => 'Chiffre 2'); 

     foreach($tableau AS $valeur)      {              echo $valeur.'<br />';      } ?>

Ceci fonctionne également pour les tableaux associatifs, vous récupèrerez alors la chaîne de caractères correspondant à l'indice dans la variable $cle.

78

Page 79: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques :

Les tableaux

<html lang="en">

<head>

<title>Arrays</title>

</head>

<body>

<?php

$numbers = array(4,8,15,16,23,42);

echo $numbers[0];

?>

<br />

<?php $mixed = array(6, "fox", "dog", array("x", "y", "z")); ?>

<?php echo $mixed[2]; ?><br />

<?php //echo $mixed[3]; ?><br />

<?php //echo $mixed ?><br />

<?php echo $mixed[3][1]; ?><br />

<?php $mixed[2] = "cat"; ?>

<?php $mixed[4] = "mouse"; ?>

<?php $mixed[] = "horse"; ?>

<pre>

<?php echo print_r($mixed); ?>

</pre>

79

Page 80: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php

//PHP 5.4 added the short array syntax.

$array = [1,2,3];

?>

</body>

</html>

Les tableaux associatifs

<html lang="en">

<head>

<title>Array Functions</title>

</head>

<body>

<?php $numbers = array(8,23,15,42,16,4); ?>

Count: <?php echo count($numbers); ?><br />

Max value: <?php echo max($numbers); ?><br />

Min value: <?php echo min($numbers); ?><br />

<br />

<pre>

Sort: <?php sort($numbers); print_r($numbers); ?><br />

Reverse sort: <?php rsort($numbers); print_r($numbers); ?><br />

</pre>

<br />

80

Page 81: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Implode: <?php echo $num_string = implode(" * ", $numbers); ?><br />

Explode: <?php print_r(explode(" * ", $num_string)); ?><br />

<br />

15 in array?: <?php echo in_array(15, $numbers); // returns T/F ?><br />

19 in array?: <?php echo in_array(19, $numbers); // returns T/F ?><br />

</body>

</html>

81

Page 82: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les datesLes dates

La gestion des dates en PHP est très simple. Vous allez voir que tout au long de ce chapitre, nous allons nous servir d'une fonction principale, la fonction date(). Nous verrons ensuite la fonction time() et mktime(). L'utilisation de ces trois fonctions constitue les bases de ce tutoriel sur les dates en PHP.

La fonction date()

Incontournable, la fonction date() s'utilise de différentes façons. Elle renvoie toujours une chaîne de caractères correspondant à ce qu'on lui a demandé (ça peut être l'heure, le jour, le mois, etc...). Attention, les paramètres renvoyés correspondront à ceux du serveur, si votre serveur a une heure déréglée, la fonction date() ne renverra pas une heure correcte. Pour que la fonction sache ce qu'on attend d'elle et qu'elle ne nous renvoie pas n'importe quoi (les minutes au lieu de l'heure par exemple) on va placer comme paramètre unique un code.

Ce code se compose de différents caractères que nous allons détailler ci-dessous :

Caractère Signification Exemples de valeurs possibles :

Jour

j Jour du mois sur deux chiffres sans les zéros initiaux 1 à 31

d Jour du mois sur deux chiffres avec un zéro initial en fonction du jour 01 à 31

l (L minuscule) Jour de la semaine en anglais Sunday à Saturday

w Jour de la semaine au format numérique 0 (dimanche) à 6 (samedi)

z Jour de l'année 0 à 366

Semaine

W Numéro de semaine dans l'année (les semaines commencent le lundi) Exemple : 42 (la 42ème semaine de l'année)

Mois

F Mois, textuel, version longue; en January à December

82

Page 83: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Caractère Signification Exemples de valeurs possibles :

anglais, comme January ou December

m Mois au format numérique, avec zéros initiaux 01 à 12

n Mois sans les zéros initiaux 1 à 12

t Nombre de jours dans le mois 28 à 31

Année

L Est ce que l'année est bissextile 1 si bissextile, 0 sinon.

Y Année sur 4 chiffres Exemples : 1999 et 2003

y Année sur 2 chiffres Exemples : 99 et 03

Heure

a Ante méridien et Post méridien (minuscules) am ou pm

A Ante méridien et Post méridien (majuscules) AM ou PM

g Heure (format 12h) sans les zéros initiaux 1 à 12

G Heure (format 24h) sans les zéros initiaux 0 à 23

h Heure (format 12h) avec les zéros initiaux 01 à 12

H Heure (format 24h) avec les zéros initiaux 00 à 23

s Secondes avec zéros initiaux 00 à 59

i Minutes avec zéros initiaux 00 à 59

83

Page 84: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Par exemple, voici un cas concret : nous allons afficher l'année en cours avec la fonction date() :

<?php      echo date('Y'); //affichera l'année actuelle sur 4 chiffres  ?>

Vous n'avez plus qu'à vous référer aux autres codes pour afficher ce que vous voulez. Tout ça c'est bien beau mais si vous souhaitez afficher toute une date avec un seul appel à la fonction date, comment feriez-vous ?

Si vous souhaitez afficher le mois et l'année, vous pourriez faire ceci :

<?php      echo date('m').' '.date('Y'); //affichera le mois sur deux chiffres et l'année actuelle sur 4 chiffres  ?>

Cette solution est cependant peu pratique et gourmande. Vous avez un moyen bien plus simple de le faire :

<?php      echo date('m Y'); //affichera le mois sur deux chiffres et l'année actuelle sur 4 chiffres  ?>

Vous allez même pouvoir formater votre date comme bon vous semble, par exemple si vous souhaitez séparer les composantes de votre date par un slash (/), vous pouvez mettre ceci :

<?php      echo date('m/Y'); ?>

<?php$date = date("d-m-Y");$heure = date("H:i");Print("Nous sommes le $date et il est $heure");?>

<? $date = gmdate("H\hi"); print("Il est $date"."gmt."); ?> 

84

Page 85: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Le timestamp PHP

Vous allez sûrement vous demander de quoi il s'agit, et c'est normal ;) Un timestamp est un nombre qui indique le nombre de secondes qui se sont écoulées depuis le premier janvier 1970. Vous allez me dire jusque-là, "mais à quoi ça sert" ? patience, on y arrive :)

Le premier janvier 1970 à minuit, le timestamp valait 0. Il tient maintenant sur 10 chiffres, c'est dire si le nombre de secondes qui se sont écoulées depuis est important !

85

Page 86: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Pour afficher le timestamp de la seconde actuelle, on utilise la fonction time() de PHP. Voici un exemple :

<?php      echo time(); //Affiche le nombre de secondes écoulées depuis le 1er janvier 1970 ?>

Par défaut, la fonction date ne demande qu'un seul paramètre comme nous l'avons vu plus haut, cela permet d'afficher par exemple le jour actuel ou encore la minute et la seconde courantes. Nous pouvons par contre, et là cela devient intéressant, afficher toutes ces informations pour un timestamp donné. La fonction date telle que nous l'avons vue correspond à ceci :

<?php      echo date('Y', time()); ?>

Si nous indiquons un timestamp différent, PHP va nous retourner tout ce que vous voulez pour le timestamp donné et non pour le temps courant. Imaginez ceci : 

<?php      $timestamp = time() - 3600;      echo date('j', $timestamp); ?>

PHP va vous retourner ici le jour qu'il était il y a une heure ! en effet, on utilise ici le timestamp $timestamp qui correspond au timestamp actuel (obtenu via la fonction time() auquel on a retranché 3600 secondes, soit une heure) !Vous comprenez maintenant qu'il va être possible d'effectuer des choses très puissantes avec le timestamp de PHP. Vous venez d'apprendre comment convertir un timestamp en date avec la fonction date(), nous allons maintenant voir comment convertir une date en timestamp, vous allez voir ce n'est pas compliqué !

Conversions d'une date vers un timestamp

PHP permet de convertir une date vers un timestamp. Pour ce faire, on utilise la fonction mktime(). Elle va vous permettre à partir du jour, de l'heure, etc ... d'une date classique, d'obtenir le timestamp correspondant. Ce timestamp pourra être ensuite stocké ou encore subir des traitements. Voici la syntaxe de base de la fonction mktime() :

<?php      $timestamp = mktime(heures, minutes, secondes, mois, jour, année); ?>

86

Page 87: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Si vous voulez obtenir le timestamp du 3 janvier 1988 à 2h31 et 10 secondes, vous pouvez mettre ceci :

<?php      echo mktime(2, 31, 10, 1, 3, 1988); ?>

87

Page 88: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les inclusions de fichiers : fonctions include et require

Présentation

Tout ce que vous venez d'apprendre sur PHP est bien beau, mais si il y a une chose essentielle en PHP, c'est bien l'inclusion de fichiers. En quoi cela consiste t-il ? Et bien imaginions que vous ayez un site qui comporte toujours le même menu à gauche ou encore la même partie haute, en (X)HTML vous étiez (à moins d'utiliser des frames dépréciées et néfastes pour le référencement) obligé 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.

L'include, ou comment inclure des fichiers en PHP

Le code en lui-même est très simple. On utilise la structure du langage "include". Elle peut donc ne pas prendre de parenthèses. Cette structure va vous permettre d'inclure un fichier PHP à interpréter.

Voici un exemple permettant d'inclure la page "haut.php" dans le fichier courant :

<?php      include 'haut.php'; ?>

Le principe est simple : vous allez pouvoir grâce à ce code exécuter le code PHP inclus dans le fichier "haut.php". C'est à dire que si par exemple le fichier inclus contient du code HTML ou des instructions "echo" affichant du HTML, vous allez pouvoir afficher un code HTML bien défini sur toutes les pages de vos sites via un seul fichier que vous inclurez quand et où vous le voulez.Le fichier "haut.php" peut contenir du code PHP mais aussi du code HTML, il est important de le souligner. Inutile donc pour afficher du code HTML d'utiliser echo à foison dans votre fichier inclus.Voyons maintenant un exemple pratique qui consistera à inclure pour une page PHP, le haut du site. Toutes nos pages PHP pourront s'en resservir pour que le haut du site soit identique sur toutes les pages. Pour cet exemple, nous allons utiliser deux fichiers, l'un sera HTML (le fichier "haut.php") et sera identique sur toutes les pages pour lequel nous ferons appel à lui, et l'autre en PHP permettra d'inclure ce fichier.Contenu du fichier "haut.php" :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"><head><title>Bienvenue sur mon site web !</title></head>

88

Page 89: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<body><h1>Bienvenue sur mon site !</h1>Contenu du fichier "bas.php" qui sera le pied de page du site :</body></html>Contenu du fichier "index.php" qui sera l'accueil du site :<?php      include 'haut.php'; 

     echo 'Ici le contenu du site'; 

     include 'bas.php'; ?>

Ce qui donnera en HTML lorsque vous appellerez la page "index.php" :<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"><head><title>Bienvenue sur mon site web !</title></head><body><h1>Bienvenue sur mon site !</h1>Ici le contenu du site</body></html>

Attention à l'utilisation à foison de fichiers inclus. Plus vous utiliserez include, plus le temps de génération de la page sera ralenti (car il faut bien faire un accès disque pour lire les différents fichiers). Préférez un seul include d'un fichier un peu plus gros que de 4 fichiers très petits.

Inclusion avec require

la structure du langage require fonctionne de la même façon qu'include. Cependant, il existe une différence entre ces deux méthodes. Lorsque vous tentez d'inclure un fichier, si le fichier n'existe pas que se passe t-il ? Et bien par défaut, PHP affichera une erreur mais continuera l'exécution du script. Imaginions maintenant que vous ayez un espace membres qui, dans un fichier inclus, vérifie que l'internaute soit bien identifié comme étant membre pour afficher le reste. Voici un exemple résumé (le code n'est pas complet) :

<?php      include 'verification.php'; 

     /*      * Code qui sera exécuté si le membre est identifié      */ 

     echo 'vous êtes membre !'; ?>Et maintenant, voici le contenu du fichier "verification.php" qui est chargé de vérifier si l'internaute est bien identifié en tant que membre :

89

Page 90: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php      if(!est_membre())      {           exit('Vous devez être membre pour accéder à cette page');      } ?>

Le code est bien sûr très simplifié, nous considèrerons que la fonction est_membre() est plus haut dans le code ;) Le but est uniquement de comprendre ce que peut entraîner l'absence d'inclusion d'un fichier sensible. Ici, nous faisons appel à la fonction est_membre() qui renvoie TRUE si l'internaute est identifié comme membre, et FALSE sinon. Le point d'exclamation permet d'effectuer le contraire de la condition, ici on traduit par "si l'internaute n'est pas membre" tandis que sans le point d'exclamation on aurait dit "si l'internaute est membre". Le code exécuté arrête alors le script PHP si le visiteur n'est pas membre en utilisant la structure du langage exit. Tout ceci est bien, mais si le fichier "verification.php" n'existe pas, dans ce cas, PHP affichera "vous êtes membre !" ce qui ne va pas du tout avec ce que l'on souhaite faire. Nous allons donc utiliser la structure du langage "require". Celle-ci permet d'inclure un fichier et de couper le script si le fichier n'a pu être inclus.

<?php      require 'verification.php'; //Coupera l'exécution du code si le fichier n'a pu être inclus par PHP 

     /*      * Code qui sera exécuté si le membre est identifié      */ 

     echo 'vous êtes membre !'; ?>

require permet à la différence d'include de couper l'exécution du script PHP si le fichier à inclure n'a pu être inclus.

90

Page 91: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques simple:

<?php include("included_functions.php"); include("included_header.php");?> The header has been included. <br /> <?php echo hello("Everyone"); ?><br /> </body></html>

Incluted_functions.php<?php function hello($name) { return "Hello {$name}!"; }?>

Incluted_header.php

<html lang="en"> <head> <title>Includes</title> </head> <body>

Cas pratiques avec sécurité :

Le code de la page accueil.php

<p>Mettez ici simplement le contenu que vous voulez voir afficher en accueil.</p>

Le code de la page news.php

<p>Mettez ici simplement le contenu que vous voulez voir afficher dans les news. Il y a de forte chance que cela soit du code PHP qui vous génère ces news. Cela ne pose aucun problème, procédez comme à votre habitude: requête, boucle et echo.</p>

Le code de la page menu.htm

<ul>

91

Page 92: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

  <li>     <a href="index.php?page=accueil" title="L'accueil">Accueil</a>  </li>  <li>    <a href="index.php?page=news" title="Les News ">News</a>  </li></ul>

 

Nous allons maintenant créer une page index.php qui va être le noyau de notre site. Elle va se charger d'inclure tout les éléments découpés afin de construire une page complète.

Le code de la page index.php

<div class="entete" ><?php   include('entete.htm');  // Nous appelons l'entete du site?></div><div class="colonneGauche" ><?php   include('menu.htm');   // Nous appelons notre menu?></div><div class="colonneDroite"><?php   include($_GET['page'].'.php');   // Nous appelons le contenu central de la page?></div>

<div class="pied"><?php   include('pied.htm');   // Nous appelons le pied de page?></div>

Le code de la page index.php

<div class="entete" ><?php   include('entete.htm');  // Nous appelons l'entete du site?></div><div class="colonneGauche" ><?php 

92

Page 93: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

  include('menu.htm');   // Nous appelons notre menu?></div><div class="colonneDroite"><?php

  // On définit le tableau contenant les pages autorisées  // ----------------------------------------------------  $pageOK = array('news' => 'news.php',                   'accueil' => 'accueil.php');

  // On teste que le paramètre d'url existe et qu'il est bien autorisé  // -----------------------------------------------------------------  if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) ) {    include($pageOK[$_GET['page']]);   // Nous appelons le contenu central de la page  } else {    include('accueil.php');   // Page par défaut quant elle n'existe pas dans le tableau  }

?></div> <div class="pied"><?php   include('pied.htm');   // Nous appelons le pied de page?></div>

 

Explication

Comme vous le voyez nous avons créé un tableau associatif. Ce tableau est construit ainsi : son index représente les paramètres d'inclusion autorisés dans l'url, les valeurs représentent le chemin réel du fichier. En l'occurence les fichiers sont dans le même répertoire que la page index.php, mais vous auriez pu vouloir inclure un fichier dans le répertoirecolGauche contenu dans le répertoire courant. Dans ce cas vous auriez dû rajouter une ligne au tableau de cette forme : 'page' => 'colGauche/fichier.php'.

Ensuite nous testons l'existence de cette ligne du tableau avec comme index du tableau, le paramètre passé en url. Si la ligne existe c'est que le paramètre est autorisé, on inclu donc le fichier en utilisant la valeur de la ligne concernée du tableau.

93

Page 94: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

94

Page 95: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

95

Page 96: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Comment faire une redirection   ?

<?php

// This is how you redirect to a new page

function redirect_to($new_location) {

header("Location: " . $new_location);

exit;

96

Page 97: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

}

$logged_in = $_GET['logged_in'];

if ($logged_in == "1") {

redirect_to("basic.html");

} else {

redirect_to("http://www.lynda.com");

}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html lang="en">

<head>

<title>Redirect</title>

</head>

<body>

</body>

</html>

97

Page 98: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les formulairesPrésentation

Quand je vous ai présenté PHP au début de cette section, je vous avais parlé d'interactivité avec le visiteur. C'est là que les formulaires sont le plus souvent utilisés. En effet un formulaire permet d'interagir avec l'internaute. L'avantage que nous allons voir maintenant est que PHP permet de faire tout et n'importe quoi instantanément en fonction de ce que souhaite le visiteur. Vous allez pouvoir disposer d'un site complètement dynamique sans bouger le petit doigt !Je supposerai que vous savez comment créer des formulaires en (X)HTML, donc je ne ferai pas de rappel poussé sur leur utilisation. N'hésitez donc pas à revoir le cours de HTML si vous pensez avoir des lacunes à ce niveau.Il existe deux méthodes d'envoi de formulaire en (X)HTML : la méthode POST et la méthode GET. La méthode GET transmet les informations du formulaire dans l'adresse du site, adresse qui est limitée en fonction du navigateur à un certain nombre de caractères et qui est encore moins sécurisée que la méthode POST. Nous allons donc commencer par la méthode POST.PHP va créer lorsque des données de formulaires seront disponibles, des variables commençant par $_GET ou $_POST (en fonction de la méthode d'envoi et de l'url de la page), vous allez donc voir que d'exploiter les données de formulaires est très simple !

L'envoi de formulaire via méthode POST et les textbox

Nous allons commencer par le traitement des formulaires simples comportant une zone de texte. Nous avons attribué une valeur par défaut à la zone de texte. Voyons le code XHTML :

<form action="page.php?formulaire" method="post"><p><input type="text" name="pseudo" value="Entre ici ton pseudo" /></p><p><input type="submit" value="Envoyer" /></p></form>

Comme vous pouvez le constater, il n'y a rien de compliqué là dedans. J'ai juste corsé un peu l'adresse de la page php qui sera utilisée pour le traitement. Comme je vous l'ai appris pour la page concernant les variables en PHP, ici une variable nommée $_GET['formulaire'] sera présente mais ne comportera pas de valeur. C'est tout pour les complications :p

Bon tout ça c'est bien beau, mais une fois que le visiteur clique sur "Envoyer" que se passe t-il sur la page "page.php" ? Et bien la variable $_POST['pseudo'] sera crée et sa valeur sera le pseudo qu'a entré le visiteur. Si le visiteur a juste cliqué sur "Envoyer" sans toucher à la zone de texte, la variable $_POST['pseudo'] aura pour valeur 'Entre ici ton pseudo' qui est la valeur par défaut de cette zone de texte.Lorsque vous soumettez un formulaire avec PHP via la méthode POST, celui-ci crée des variables $_POST['X'] avec 'X' correspondant aux noms des différents champs.

98

Page 99: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Ceci est valable pour tout formulaire. Les valeurs de ces différentes variables correspondent aux valeurs des champs en question. Pour tout champ de formulaire, lorsque le visiteur ne touche à rien, les valeurs par défaut seront conservées et utilisées de la même manière par PHP (qui n'a aucun moyen de savoir si il s'agit d'une valeur par défaut ou d'une valeur remplie par le visiteur). Vous venez maintenant de comprendre pourquoi nous parlerons de sécurité plus loin sur cette page. En effet, comme PHP ne peut savoir de qui proviennent les informations, il faudra toujours les vérifier pour éviter les failles de sécurité.Revenons à notre formulaire. Le visiteur a cliqué et a renseigné son pseudo, maintenant nous voudrions l'afficher.

Voici un code tout simple pour la page "page.php" permettant de faire ceci en PHP :

<?php      if(isset($_POST['pseudo'], $_GET['formulaire'])) //On regarde si les variables $_POST['pseudo'] et $_GET['formulaire'] existent, sinon la condition ne sera pas validée     {           echo htmlentities($_POST['pseudo']);      } ?>

Vous remarquerez que l'on regarde d'abord si les variables que l'on souhaite utiliser existent grâce à la fonction isset() (qui peut prendre en paramètre plusieurs variables). Ceci est tout à fait normal et vous devez procéder de la sorte lorsque vous souhaitez accéder avec PHP à des variables provenant de formulaires, dont vous n'êtes pas sûr de l'existence.

Voyons ce code que n'importe quel débutant (ce n'est pas péjoratif) aurait pu faire :

<?php       echo htmlentities($_POST['pseudo']); ?>

Le problème de ce code, est qu'il ne vérifie pas si la variable $_POST['pseudo'] existe. Ce code peut donc tenter d'afficher une variable qui n'existe pas, ce qui retournera généralement une erreur. Plus grave, si vous utilisez cette variable pour faire des traitements plus poussés, vous pourrez avoir de belles failles de sécurité dans votre site. Un mot maintenant sur la fonction htmlentities() : elle permet de transformer le code HTML pouvant être envoyé par le visiteur en code visible. En effet, imaginiez que votre visiteur entre comme pseudo "<body>" par exemple, et bien vous ne verrez rien à l'écran car le texte qu'il aura entré sera interprété comme étant du code HTML (logique, puisque PHP envoie du texte, et <body> est un texte comme un autre pour PHP, il ne fera donc pas la différence). Il faut donc transformer <body> en son code HTML visible. Voilà pourquoi on utilise toujours cette fonction.

D'une manière générale, servez-vous toujours de la fonction htmlentities() lorsque vous tentez d'afficher du texte provenant de formulaires.

99

Page 100: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les textarea

Passons maintenant aux zones de texte plus évoluées. Nous allons maintenant traiter le cas de la zone de texte multilignes appelée textarea. Voici un exemple simple en XHTML :

<form action="traitement.php" method="post"><p><textarea name="description" rows="5" cols="50">Entrez ici une description de votre site</textarea></p><p><input type="submit" value="Envoyer" /></p></form>

Tout ce qu'il y a de plus classique. Lorsque le formulaire est envoyé à la page "traitement.php", vous pourrez récupérer la variable $_POST['description'] (car cette fois-ci le champ porte le nom "description" et non "pseudo") comme nous l'avons fait tout à l'heure. Voilà ce que ça donne :

<?php      if(isset($_POST['description'])) //On regarde si la variable $_POST['description'] existe      {           echo htmlentities($_POST['description']);      } ?>

Le select

Bon, pour l'instant rien de compliqué. Nous allons maintenant étudier le cas du select. Comme vous le savez, un <select> peut être à choix unique ou à choix multiples. Regardons le code pour le select à choix unique. Vous allez voir que la méthode de récupération de la valeur ne diffère pas :

<form action="traitement.php" method="post"><p><select name="couleur">     <option value="rouge">Couleur rouge</option>     <option value="vert" selected="selected">Couleur verte</option>     <option value="bleu">Couleur bleue</option></select></p><p><input type="submit" value="Envoyer" /></p></form>

Ici, si nous souhaitons afficher la couleur qu'a sélectionné le visiteur, nous utiliserons ce code :

<?php      if(isset($_POST['couleur']))      {            echo htmlentities($_POST['couleur']);      } ?>

100

Page 101: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Nous allons maintenant passer aux choses plus sérieuses avec le select multiple. En effet, imaginions que quelqu'un souhaite commander un article en plusieurs couleurs, il faudra qu'il puisse sélectionner plusieurs valeurs d'un coup dans le select.

Voyons comment ça se présente en (X)HTML :

<form action="traitement.php" method="post"><p><select name="couleur" multiple="multiple">     <option value="rouge">Couleur rouge</option>     <option value="vert" selected="selected">Couleur verte</option>     <option value="bleu">Couleur bleue</option></select></p><p><input type="submit" value="Envoyer" /></p></form>

Si l'utilisateur sélectionne une ou plusieurs valeurs, que va t-il se passer ? Et bien je vous le donne en mille : PHP va créer un tableau $_POST['couleur'] qui contiendra la ou les différentes valeurs que l'utilisateur aura sélectionné. Voici un exemple qui affiche toutes les valeurs sélectionnées par le visiteur :

<?php      if(isset($_POST['couleur']) AND is_array($_POST['couleur']))      {           foreach($_POST['couleur'] AS $valeur)           {                 echo 'Vous avez sélectionné la couleur'.htmlentities($valeur).'<br />';           }      } ?>

Notez l'utilisation du is_array() qui permet de vérifier si on a bien transmis un tableau. Ceci est très important car la fonction foreach() nécessite un tableau en paramètre (ici $_POST['couleur'] est le tableau à parcourir). Si $_POST['couleur'] n'avait pas été un tableau, vous auriez eu une erreur, c'est donc pour ça que l'on vérifie non seulement que $_POST['couleur'] existe mais qu'il est un tableau. Si vous ne vous rappelez plus comment on utilise les tableaux, n'hésitez pas à aller relire le cours les concernant.

D'une manière générale, pensez à toujours vérifier pour les données provenant de formulaires, que votre variable est du type que vous attendez, avant d'effectuer un quelconque traitement sur elle.

Les cases à cocher (checkbox)

Voyons maintenant comment on utilise les cases à cocher. On commence comme d'habitude avec un exemple de code XHTML. Le principe consistera à savoir ici si le visiteur veut se connecter automatiquement au site. Pour cela, on utilisera une checkbox. Si le visiteur la coche, il sera connecté automatiquement au site lors de sa prochaine visite, dans le cas contraire rien ne se passera.

Voici le code XHTML :

101

Page 102: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<form action="traitement.php" method="post"><p><input type="checkbox" name="connexion_automatique" value="1" /></p><p><input type="submit" value="Envoyer" /></p></form>

Bon jusque-là rien de très compliqué. Vous allez voir pour la partie de traitement, c'est toujours aussi simple !

<?php      if(isset($_POST['connexion_automatique']))      {           echo 'Vous avez coché la case !';      } ?>

Ici il s'agit d'un cas particulier, en effet, lorsque la case à cocher n'est pas cochée, le navigateur ne renvoie rien, donc la variable $_POST['connexion_automatique'] n'existe pas. Si elle existe, cela signifie donc que la case a été cochée.

Les boutons radios

Les boutons radio permettent de ne sélectionner qu'une seule option parmis plusieurs. Par exemple si vous demandez "souhaitez-vous recevoir la newsletter mensuelle ?" le visiteur peut répondre "oui" ou "non", mais pas les deux à la fois.

Voici ce que ça donne en XHTML :<form action="traitement.php" method="post"><p><input type="radio" name="choix" value="oui" />Oui</p><p><input type="radio" name="choix" value="non" />Non</p><p><input type="submit" value="Envoyer" /></p></form>

Ici, pour savoir ce qu'a répondu le visiteur, on fera ceci en PHP :

<?php      if(isset($_POST['choix']))      {          echo htmlentities($_POST['choix']); //affichera "oui" ou "non" en fonction de ce qu'a sélectionné le visiteur      } ?>

102

Page 103: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les champs cachés (hidden)

Les champs cachés fonctionnent exactement de la même manière que pour un champ de texte simple, la seule différence étant qu'ils ne seront pas affichés sur la page web. Vous pourrez transmettre ainsi des informations que le visiteur n'a pas besoin de remplir. N'allez pourtant pas croire que cette méthode est sécurisée, il s'agit juste d'une méthode bien pratique pour transmettre des variables et elle doit donc subir les mêmes traitements que les autres variables, à savoir une vérification minutieuse avant toute utilisation.

Voici un exemple en XHTML :

<form action="traitement.php" method="post"><p><input type="hidden" name="champ_cache" value="ici ce que vous voulez" />Oui</p><p><input type="submit" value="Envoyer" /></p></form>

Et voici comment on récupère la valeur de ce champ caché en PHP :

<?php      if(isset($_POST['champ_cache']))      {          echo htmlentities($_POST['champ_cache']); //affiche le contenu du champ      } ?>

La méthode get

Cette méthode de transmission de données passe par l'url, nous avons vu comment récupérer des données en PHP qui provenaient de l'url, il s'agit des variables $_GET['nom'] où nom est le nom du champ de formulaire dans notre cas. 

Voici un exemple en XHTML pour le champ de type hidden :

<form action="traitement.php" method="get"><p><input type="hidden" name="champ_cache" value="ici ce que vous voulez" />Oui</p><p><input type="submit" value="Envoyer" /></p></form>

La valeur se récupère de la même façon, en GET cette fois :

<?php      if(isset($_GET['champ_cache']))      {          echo htmlentities($_GET['champ_cache']); //affiche le contenu du champ      } ?>

103

Page 104: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

104

Page 105: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques :

Afficher le nom et prénom.

<html><body> <form method="post" action="verif.php"> Nom : <input type="text" name="nom" size="12"><br> Prénom : <input type="text" name="prenom" size="12"> <input type="submit" value="OK"> </form></body></html>

<?php $prenom = $_POST['prenom']; $nom = $_POST['nom']; print("<center>Bonjour $prenom $nom</center>"); ?>

Vérifier la présence des informations.

La première fonction que nous utiliserons est empty(), qui permet de contrôler si un champs est vide. Ensuite nous allons contrôler que $_POST['url'] commence bien par http:// à l'aide des deux fonctions strtolower() et substr().

<html><body> <form method="post" action="verif.php"> Titre : <input type="text" name="titre" size="12"><br> URL : <input type="text" name="url" size="12" value="http://"> <input type="submit" value="OK"> </form></body></html>

<?php $titre = $_POST['titre']; $url = $_POST['url']; if(empty($titre)) { print("<center>Le '<b>Titre</b>' est vide !</center>"); exit(); } // vérification du début de l'url

105

Page 106: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

$verif_url = strtolower($url); $verif_url = substr("$verif_url", 0, 7); // on verifie les 7 premiers caractères if ($verif_url!="http://") { print("L'URL doit commencer par <b>http://</b>"); exit(); } else { print("$titre : <a href=\"$url\">$url</a>"); } ?>

Ajouter un email

Avec cet exemple nous commençons à attaquer les conditions, c'est un aspect primordial dans tous les langages. La première vérification porte sur le champ 'titre', la fonction empty()permet de contrôler si celui-ci est vide ou non. Ce qui nous donne :

if(empty($titre)){ print("<center>Le '<b>Titre</b>' est vide !</center>"); exit(); } : Si la variable $titre est vide alors j'affiche le message : 'Le titre est vide' (placé entre accolades) et j'arrête l'exécution du reste du code avec la commande exit().

Par contre si la variable n'est pas vide, l'exécution ne prend pas en compte ce qui se trouve entre accolades et continue.

La seconde vérification est plus fine puisqu'il s'agit de vérifier que les 7 premiers caractères qui ont été entrés par le visiteur sont bien http://. Pour commencer nous utilisons la fonctionstrtolower() qui permet de transformer tous les caractères en minuscules (ex. HTTP://www.MONsite.CoM devient http://www.monsite.com ). Puis à l'aide de la fonction substr(), nous sélectionnons les 7 premiers caractères (0 est toujours le premier caractère d'une chaine - le second chiffre ' 7  ' étant le nombre de caractères à sélectionner), puis nous les comparons à ce que nous avons dans notre condition if :

if ($verif_url!="http://"){ print("L'URL doit commencer par <b>http://</b>"); exit(); } : Si les 7 premiers caractères sont différents ( signe: != ) de http://, alors on exécute ce qui ce trouve entre accolades (en l'occurrence on affiche un message d'erreur), puis nous arrêtons le reste du code avec la commande exit().

Par contre si le résultat est correct, PHP ignore ce qui ce trouve entre accolades et exécute le reste du code.

<html><body> <form method="post" action="verif.php"> Votre email : <input type="text" name="email" size="20">

106

Page 107: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<input type="submit" value="OK"> </form></body></html>

<?php $email = $_POST['email']; $point = strpos($email,"."); $aroba = strpos($email,"@");

if($point=='') { echo "Votre email doit comporter un <b>point</b>"; } elseif($aroba=='') { echo "Votre email doit comporter un <b>'@'</b>"; } else { echo "Votre email est: '<a href=\"mailto:"."$email"."\"><b>$email</b></a>'"; } ?>

107

Page 108: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exercices pratiques :

1) Envoyer un formulaire automatiquement par email :

Voici le code HTML du formulaire d’envoi : envoimail.html

<form id="form1" name="form1" method="post" action="envoimail.php">

//cela ne fonctionne que si nous avons un server de mail si non nous pouvons utiliser un server de mail en ligne en indiquant alors l’url complète. http://www.monserverdemail.be/envoimail.php

// il faut pour cela utiliser un ftp pour transférer le fichier php sur internet. Par exemple : Filezilla.

<p>

<label>Nom :

<input type="text" name="nom" id="nom" />

</label>

</p>

<p>

<label>Votre email :

<input type="text" name="mail" id="mail" />

</label>

</p>

<p>

<label>Sujet :

<input type="text" name="sujet" id="sujet" />

</label>

</p>

<p>

<label>Votre message :

<textarea name="message" cols="50" rows="10" id="message"></textarea>

</label>

</p>

<p>

108

Page 109: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<label>

<input type="submit" name="envoyer" id="envoyer" value="Envoyer" />

</label>

<label>

<input type="reset" name="reinitialiser" id="reinitialiser" value="Réinitialiser" />

</label>

</p>

</form>

Voici le code PHP : envoimail.php

<?php

// je ne défini pas manuellement les champs comme précédement, je les défini au sein d’une boucle foreach et d’un tableau

$vars = array("nom", "mail", "objet", "message");

foreach($vars as $var)

if(isset($_POST[$var]))

$$var = $_POST[$var];

else

$$var = '';

//je teste la validité des données

if(strlen($nom) < 3)

die("Un nom doit avoir plus de 3 caractères !");

if(!eregi('^([a-z0-9\._-])+@([^\.]+\.[^\.]+)', $mail, $matched))

die("Adresse invalide !!");

else if(!getmxrr($matched[2], $mxrr))

die("Serveur de mail invalide !!");

$expediteur = "[email protected]";

109

Page 110: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

//Utilisation des variables d’environnement, pour connaître l’adresse ip de l’expéditeur.

$expediteurIP = $_SERVER[REMOTE_ADDR];

$corpsDuMail = "Demande d'informations :

Nom : $nom

eMail : $mail

Objet : $objet

Message :

$message";

//méthode PHP d’envoi de mail

mail($expediteur, "Nouveau message...", $corpsDuMail, "de: $mail");

print "Mail envoyé...";

?>

2) Créer une base de données en Workbench: shema -> info1 table -> infos_tbl

requête SQL:CREATE TABLE infos_tbl (id INT (11) not null AUTO_INCREMENT, nom VARCHAR (35) not null , prenom VARCHAR (35) not null , email VARCHAR (70) not null , icq INT (11) null , titre VARCHAR (70) not null , url VARCHAR (255) not null , PRIMARY KEY (id), INDEX (id), UNIQUE (id))

2) Créer une page html: Form.html

<html><form method="POST" action="add.php"><center><input type="text" name="nom" size="20" value="nom" maxlength="35"> <input type="text" name="prenom" size="20" value="prenom" maxlength="35"><br><input type="text" name="email" size="20" value="email" maxlength="70"> <input type="text" name="icq" size="20" value="icq" maxlength="11"><br><input type="text" name="titre" size="20" value="titre du site" maxlength="70"> <input type="text" name="url" size="20" value="url du site" maxlength="255"><br><input type="submit" value="Envoyer" name="envoyer"></center></form>

110

Page 111: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

3) Insérer des données dans la base de données à travers le formulaire php. add.php<html lang="en"><head><title>add</title></head><body><?php // On commence par récupérer les champs 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['icq'])) $icq=$_POST['icq'];else $icq="";if(isset($_POST['titre'])) $titre=$_POST['titre'];else $titre="";if(isset($_POST['url'])) $url=$_POST['url'];else $url="";

// On vérifie si les champs sont vides if(empty($nom) OR empty($prenom) OR empty($email) OR empty($titre) OR empty($url)) { echo '<font color="red">Attention, seul le champs <b>ICQ</b> peut rester vide !</font>'; } // Aucun champ n'est vide, on peut enregistrer dans la table else { $link = mysqli_connect('localhost', 'root', '', 'info'); // connexion à la base /* Vérification de la connexion */if (mysqli_connect_errno())

{printf("Echec de la connexion : %s\n",mysqli_connect_error()); exit();

}

if ($result = $link->query("SELECT DATABASE()")) //Retourne le nom de la base de données courante

{$row = $result->fetch_row();printf("La base de donnees courante est %s.\n", $row[0]);echo "<br>";$result->close();}

111

Page 112: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

// On insère les informations du formulaire dans la table$sql = "INSERT INTO infos_tbl(id, nom, prenom,email, icq, titre, url) VALUES('','$nom','$prenom','$email','$icq','$titre','$url')"; $result = mysqli_query($link, $sql) ;echo 'Vos infos on ete ajoutees.'; // on affiche le résultat pour le visiteur echo "<br/>"; // Requête "Select" retourne un jeu de résultats$result = mysqli_query($link, "SELECT * FROM infos_tbl");while ($row=mysqli_fetch_row($result)){print("id:$row[0] nom:$row[1] prenom:$row[2] email:$row[3] icq:$row[4] titre:$row[5] url:$row[6]) <br>");}mysqli_close($link); // on ferme la connexion } ?> </body></html>

112

Page 113: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Afficher le nom et prénom de la table infos_tbl

<html lang="en">

<head>

<title>afficher nom et prénom </title>

</head>

<body>

<?php

// On commence par récupérer les champs

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['icq'])) $icq=$_POST['icq'];

else $icq="";

if(isset($_POST['titre'])) $titre=$_POST['titre'];

else $titre="";

if(isset($_POST['url'])) $url=$_POST['url'];

else $url="";

113

Page 114: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

// On vérifie si les champs sont vides

if(empty($nom) OR empty($prenom) OR empty($email) OR empty($titre) OR empty($url))

{

echo '<font color="red">Attention, seul le champs <b>ICQ</b> peut rester vide !</font>';

}

// Aucun champ n'est vide, on peut enregistrer dans la table

else

{

$link = mysqli_connect('localhost', 'root', '', 'info'); // connexion à la base

/* Vérification de la connexion */

if (mysqli_connect_errno())

{

printf("Echec de la connexion : %s\n", mysqli_connect_error());

exit();

}

if ($result = $link->query("SELECT DATABASE()")) //Retourne le nom de la base de données courante

{

$row = $result->fetch_row();

printf("La base de donnees courante est %s.\n", $row[0]);

echo "<br>";

$result->close();

}

// exécution de la requete

$result = mysqli_query ($link, "SELECT nom, prenom FROM infos_tbl order by 2,1");

114

Page 115: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

// lecture des lignes

while ($row=mysqli_fetch_row($result))

{

print ("<pre>");

for ($i=0; $i<mysqli_num_fields($result);$i++)

{

print ("$row[$i] ");

}

}

print ("</pre>");

}

// déconnection

mysqli_close($link);

?>

</body>

</html>

115

Page 116: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les sessionsPrésentation

Les sessions en PHP permettent de sauvegarder des variables de page en page pendant une certaine durée prédéfinie par PHP (et modifiable bien entendu). L'avantage des sessions sur les variables de type $_GET et $_POST est double : outre l'absence de formulaires (et même de tout code HTML) pour gérer les sessions, ce système va vous permettre de transmettre des variables sur toutes les pages de votre site d'une manière transparente pour vous (en PHP) ainsi que pour l'utilisateur. Vous imaginez si un membre devait cliquer à chaque fois sur les pages qu'il visite sur un bouton de formulaire indiquant qu'il est connecté ? ça ne serait pas vraiment viable comme système. Les variables de session vont pouvoir mémoriser tout ce que vous souhaitez pendant la durée de connexion d'un visiteur. Sur ce site par exemple, lorsque vous êtes connecté, j'utilise le système de sessions pour savoir que vous êtes toujours là sans que vous ayez besoin de retaper votre mot de passe ou votre nom d'utilisateur à chaque page consultée.La technique est simple : chaque utilisateur ayant besoin des sessions se voit attribuer un identifiant unique appelé ID de session. Cet identifiant est stocké sur le poste de l'internaute sous forme d'un cookie ou transite via l'URL si l'option session.use_trans_sid est à 1 (ou On) dans le fichier php.ini. Utiliser la méthode du cookie est plus que recommandée : un identifiant de session dans l'URL empêche de retenir l'adresse d'une page simplement par le visiteur néophyte, cela rallonge donc l'adresse de votre page. Cela nuit également au référencement de votre page. En effet, l'identifiant étant unique, lorsque le robot du moteur de recherche scanne votre site, il ne retombera jamais sur la même URL plusieurs fois de suite. Vous pouvez donc dire adieu à votre référencement en procédant comme ça.

Il est important de toujours avoir à l'idée qu'un identifiant de session peut être dérobé par un pirate. Évitez donc autant que possible le transit par l'url des informations de session (qui peuvent généralement se retrouver dans des copier-collers de liens dans un forum par exemple). 

Utilisation des sessions

Avant d'utiliser les sessions sur une page, on doit toujours utiliser la fonction session_start() placée avant tout envoi de code HTML, et donc généralement tout en haut de votre page PHP :

<?php      session_start(); //doit être placé avant tout echo ou autre code html      //Vous pouvez commencer à utiliser les sessions après le session_start(); ?>

Pourquoi session_start() doit-elle être placée de la sorte ? et bien parce que si PHP utilise les cookies pour repérer quel est l'id de session utilisé par l'internaute, il va écrire cet id de session dans un cookie. Or, le protocole HTTP fonctionne de telle sorte que les en-têtes (qui permettent de dire à votre navigateur "crée un cookie ayant tel nom et telle valeur") sont envoyés avant le premier caractère HTML

116

Page 117: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

transmis. Cela veut dire que dès que vous transmettrez un caractère HTML, les en-têtes seront envoyés et vous ne pourrez plus les modifier, vous ne pourrez donc plus écrire le cookie de session. En général, si vous faites une maladresse de ce style, vous vous retrouverez avec une erreur de headers already sent.Les variables de session fonctionnent comme les variables classiques. Voici un exemple pour attribuer une valeur à une variable de session nommée login :

<?php      session_start(); //doit être appelée avant toute utilisation des sessions      $_SESSION['login']='valeur'; ?>

Pour récupérer la valeur d'une variable de session (sur la même page ou sur une autre page, après un session_start()), il s'agit de la même procédure que pour une variable classique hormis l'ajout du session_start() tout en haut de la page :

<?php      session_start();      if(isset($_SESSION['login']))      {           echo $_SESSION['login']; //affiche la valeur de $_SESSION['login'] qui a pu être attribué dans une autre page php      } ?>

Pour savoir si une variable de session existe, on procède de la même façon que pour les autres variables à savoir qu'on utilise la fonction isset().Vous souhaiterez peut-être effacer une ou plusieurs variables de session, au même titre qu'une autre variable en PHP, il faut utiliser pour ça la fonction unset().Voici un petit exemple simple pour effacer la variable de session login que nous avons créée tout à l'heure (le membre ne pourra donc plus être considéré comme identifié) :

<?php      session_start();      if(isset($_SESSION['login']))      {           unset($_SESSION['login']);      } ?>

Si vous souhaitez effacer toute la session d'un coup, vous pouvez utiliser la fonction session_destroy() pour détruire toutes les variables de session d'un visiteur. Cette fonction doit quand même avoir été initialisée par un session_start(), comme vous le feriez sur toutes vos pages.Pour une plus grande sécurité, vous aurez peut-être envie de connaître l'id de session du visiteur, pour pouvoir effectuer divers traitements dessus ou encore pour l'enregistrer quelque part pour en garder une trace. PHP dispose d'une fonction destinée à cet usage, il s'agit de la fonction session_id().

117

Page 118: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php      session_start();      echo session_id(); //Retourne l'identifiant de session ?>

Vous pouvez également modifier l'id de session courant en spécifiant une valeur dans la fonction session_id(), mais par contre il faudra cette fois-ci que vous le fassiez avant le session_start() sinon ça ne fonctionnera pas.

<?php      session_id(md5(mt_rand()));      session_start();      echo session_id(); //Retourne l'identifiant de session ?>

Voilà, ce que vous venez de voir suffit amplement pour gérer un système de sessions sur votre site, pour réaliser un espace membres ou encore un panier en ligne. Comme quoi, des notions simples permettent souvent de faire des choses concrètes en PHP.

118

Page 119: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP : Les cookiesQu'est-ce qu'un cookie ?

Les cookies sont de petits fichiers textes placés sur votre disque dur par les sites internet qui les utilisent. A chaque consultation d'une page, votre navigateur envoie dans les en-têtes HTTP, le nom et les données des cookies que le site a créés, et qui sont encore valides.

Pour créer un cookie sur le navigateur de l'internaute (le client), le site internet place une mention dans les requêtes qu'il envoie au navigateur. Celui-ci les interprète et décide de créer un cookie disposant d'un nom, d'une valeur et d'une date de fin de validité. Chaque site internet peut créer plusieurs cookies, mais ils ont tous, chacun, une taille maximale de 4 Ko. N'espérez donc pas stocker de grosses informations par ce moyen.

Les cookies ne sont consultables que par le site qui les a créés. Il sera donc impossible pour un site internet de lire l'ensemble de vos cookies.

Ce mécanisme de communication permet de conserver des données de pages en pages, bien qu'on préfère en PHP les sessions, bien plus sécurisées et situées côté serveur.

Créer un cookie en PHP

On utilise la fonction PHP setcookie() pour créer un cookie.

Exemple de création d'un cookie

<?php setcookie('moncookie','Anthony',time()+$validite);?>

Création d'un cookie valable 7 jours

La variable $validite est un nombre entier spécifiant le nombre de secondes (par rapport au temps actuel) pendant lesquelles le cookie sera valide. Si vous souhaitez créer un cookie valable 7 jours, il faudra compter 7 * 24 * 3600 secondes.

<?php    setcookie('moncookie','Anthony',time()+ 3600 * 24 * 7);?>

D'autres paramètres existent pour la fonction setcookie() mais je n'en parlerai pas ici. Ils permettent entre-autres de restreindre la visibilité des cookies à un ou plusieurs sous-domaines de votre site, ou encore de ne pas rendre visible le cookie via Javascript. Des explications plus détaillées sont disponibles sur fr.php.net

119

Page 120: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Attention ! l'usage de la fonction setcookie() se fait avant toute écriture de code HTML ou textuel. Si vous ne respectez pas cette consigne, une erreur Headers already sent by apparaîtra. Vous pouvez utiliser la bufferisation de sortie en PHP pour résoudre ce problème si vous n'avez pas totalement la main sur votre code.

Supprimer un cookie

Pour supprimer un cookie, c'est très simple. A l'aide de la fonction setcookie(), vous passez en paramètre le nom du cookie que vous souhaitez supprimer, et c'est tout !

<?php setcookie('moncookie','');?>

Lire la valeur d'un cookie

Si vous vous souvenez, nous avons vu plus haut que l'utilisation des cookies était en partie similaire à celle des sessions. C'est bien le cas !Pour lire un cookie nommé moncookie, vous devrez utiliser le code suivant :

<?php    echo $_COOKIE['moncookie'];?>

120

Page 121: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Fichiers et dossiersPrésentation

Les fichiers et dossiers sont très souvent utilisés en PHP. Nous verrons plus loin qu'il existe d'autres manières de stocker les données en utilisant ce qu'on appelle une base de données, qui est une autre forme de stockage très couramment utilisée.Nous allons apprendre pour ce chapitre à manipuler des fichiers existants (ouvrir un fichier, enregistrer des données et fermer le fichier).

Ouvrir un fichier en PHP

Nous supposerons que vous avez déjà un fichier qui se nomme "test.txt" (fichier texte donc) sur votre disque dur, dans le répertoire courant que vous utilisez pour travailler en PHP. Vous savez ce qu'est une fonction, donc je ne vais pas mettre plus de temps à vous dire que pour ouvrir un fichier, plusieurs fonctions sont disponibles en fonction de ce que l'on souhaite faire.La plus simple est la fonction file_get_contents(). Elle prend comme paramètre le nom du fichier (nous ne détaillerons pas les autres paramètres possibles de cette fonction ici, ils ne nous seront pas utiles pour la suite). On récupère le contenu du fichier ouvert dans une variable.

Voici comment ça se passe :

<?php      $fichier = file_get_contents('test.txt'); //récupère le contenu du fichier et le place dans la variable $fichier 

     echo $fichier; //affiche le contenu du fichier ?>

Vous n'avez pas à fermer le fichier quand vous utilisez cette fonction, qui à mon avis est adaptée quand vous ne souhaitez pas lire les données du fichier d'une certaine façon. Vous verrez qu'avec une autre fonction que nous allons voir maintenant, vous allez pouvoir faire plus de choses. La fonction que nous allons utiliser porte le doux nom de fopen() et demande au minimum deux paramètres devant être renseignés. Le premier paramètre est le nom du fichier (ce qui ne change pour le moment pas avec la fonction file_get_contents()), et le deuxième est un peu particulier. En effet, ce deuxième paramètre va être utile pour déterminer le mode d'ouverture du fichier. Voici un récapitulatif des modes disponibles :

121

Page 122: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

mode Description

r Ouvre le fichier en lecture seule, le pointeur de fichier est placé au début du fichier.

r+ Ouvre le fichier en lecture + écriture, le pointeur de fichier est placé au début du fichier.

wOuvre le fichier en écriture seule; le pointeur de fichier est placé au début du fichier et écrase les données du fichier existant (si il existe). Si le fichier n'existe pas, ce mode permet de créer le fichier.

w+Ouvre le fichier en lecture et écriture; le pointeur de fichier est placé au début du fichier et écrase les données du fichier existant (si il existe). Si le fichier n'existe pas, ce mode permet de créer le fichier.

a Ouvre le fichier en écriture seule; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, il est créé.

a+ Ouvre le fichier en lecture et écriture; le pointeur de fichier est placé à la fin du fichier. Si le fichier n'existe pas, il est créé.

xCrée et ouvre le fichier en lecture seule; le pointeur de fichier est placé au début du fichier. Si le fichier existe déjà, fopen() va échouer. Si le fichier n'existe pas, fopen() tente de le créer. Cette option est supportée à partir de PHP 4.3.2 et fonctionne uniquement avec des fichiers locaux.

x+Crée et ouvre le fichier en lecture et écriture; place le pointeur de fichier au début du fichier. Si le fichier existe déjà, fopen() va échouer. Si le fichier n'existe pas, il est crée. Cette option est supportée à partir de PHP 4.3.2, et fonctionne uniquement avec des fichiers locaux.Vous vous demandez peut-être ce qu'est un pointeur de fichier. En fait, prenons un exemple simple avec un fichier contenant "123456". Le pointeur de fichier peut être représenté comme un curseur que vous placeriez à une certaine position. Si vous écrivez à partir de cette position, vous remplacerez les caractères qui suivent. Le pointeur de fichier commence à la position 0, cette position correspond à un curseur placé juste avant le premier caractère du fichier. Voici comment on peut représenter ça :

Si votre pointeur de fichier est en position 0, tout ce que vous écrirez remplacera les caractères 1, 2, 3 etc ... alors que si vous aviez placé votre curseur en position 6, vous auriez écrit après et votre fichier aurait donc été "prolongé".

122

Page 123: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Maintenant nous allons mettre en pratique tous ces exemples. Si nous souhaitons ouvrir le fichier "test.txt" en lecture, on regarde d'abord le mode que nous allons utiliser. Ici, il s'agit du mode r, voici donc la syntaxe à utiliser pour ouvrir le fichier :

<?php      $ressource_fichier = fopen('test.txt', 'r'); //Ouvre le fichier en lecture seule ?>

Notez le nom de la variable que j'ai utilisée, ici on ne récupère pas le contenu du fichier mais une ressource qui va permettre de contrôler ce fichier. On va donc ensuite pouvoir dire à PHP "utilise cette ressource et récupère le contenu du fichier". Pour récupérer le contenu du fichier, il y a plusieurs manières : Récupérer caractère par caractère le contenu du fichier. Récupérer ligne par ligne le contenu du fichier. Récupérer tout le contenu du fichier d'une traite (nous avons déjà vu une

méthode avec la fonction file_get_contents()).

Lire un fichier caractère par caractère

Nous allons commencer par la méthode consistant à récupérer un (ou plusieurs caractères) du fichier. La fonction permettant de retourner un seul caractère s'appelle fgetc() et prend en paramètre la fameuse ressource de fichier dont je vous ai parlé tout à l'heure.

<?php      $ressource_fichier = fopen('test.txt', 'r'); //Ouvre le fichier en lecture seule, on supposera qu'il existe sous peine d'avoir une erreur 

     if($ressource_fichier) //Si $ressource_fichier ne vaut pas FALSE on peut continuer      {           $carac1 = fgetc($ressource_fichier); //Place le chiffre 1 dans la variable $carac1           $carac2 = fgetc($ressource_fichier); //Place le chiffre 2 dans la variable $carac2 

          fclose($ressource_fichier);      } ?>

Vu que notre fichier contient "123456" si vous faites des fgetc() successivement, vous allez pouvoir récupérer le "1" puis le "2", etc ...A chaque fois que vous utilisez la fonction fgetc(), PHP incrémente le pointeur de fichier d'une position, voilà pourquoi vous ne lisez pas le même caractère à chaque fois (ce qui ne serait pas forcément ce qu'on souhaite).Vous imaginez bien que vous ne savez pas forcément le nombre de caractères d'un fichier, et que cette méthode n'est valable pour des fichiers contenant un nombre très restreint de caractères. On peut déjà se dire que l'on pourrait utiliser une boucle pour récupérer tous les caractères du fichier, mais il y a un problème. En effet, quoi mettre dans la condition de continuité de la boucle ? On doit dire à la boucle "arrête-toi dès que tu atteints la fin du fichier" et nous ne connaissons pour le moment aucune condition à placer pour lui dire cela. Heureusement, PHP vient à notre secours avec la fonction feof qui renvoie TRUE si le pointeur se trouve à la fin du fichier (et donc qu'il n'y a plus aucun caractère à lire). Nous utilisons également la fonction fclose() qui permet de fermer le fichier et est indispensable.

123

Page 124: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voici donc ce que ça donne :

<?php      $ressource_fichier = fopen('test.txt', 'r'); //Ouvre le fichier en lecture seule, on supposera qu'il existe sous peine d'avoir une erreur 

     if($ressource_fichier) //Si $ressource_fichier ne vaut pas FALSE on peut continuer      {           $contenu_fichier   = ''; 

          while(!feof($ressource_fichier)) //Tant que l'on est pas à la fin du fichier           {                $contenu_fichier .= fgetc($ressource_fichier); //Récupère le caractère en cours et l'ajoute au contenu de la variable $contenu_fichier           }           fclose($ressource_fichier); 

          echo $contenu_fichier; //affiche le contenu du fichier      } ?>

Un petit rappel : $variable .= 'valeur'; est équivalent à $variable = $variable . 'valeur'; sauf que PHP interprète la première solution plus rapidement, vous y gagnez en clarté et en performances générales.Concernant la solution de lire le fichier caractère par caractère, nous venons de le voir à titre purement pédagogique. On évitera cette solution pour des scripts couramment utilisés. Il vaut mieux lire le fichier d'une traite ou ligne par ligne, vous minimiserez ainsi les appels aux fonctions qui sont gourmands en ressources système.

Lire un fichier ligne par ligne

Deuxième méthode, cette fois-ci plus adaptée à de gros fichiers, la lecture ligne par ligne. On utilise la fonction fgets() qui permet de lire une ligne d'une seule traite.

Voici ce que ça donne, je pense que vous comprendrez car cela ne change presque pas par rapport à l'exemple précédent :

<?php      $ressource_fichier = fopen('test.txt', 'r'); 

     if($ressource_fichier) //Si $ressource_fichier ne vaut pas FALSE on peut continuer      {           $contenu_fichier   = ''; 

          while(!feof($ressource_fichier)) //Tant que l'on est pas à la fin du fichier           {                $contenu_fichier .= fgets($ressource_fichier); //Récupère la ligne en cours et l'ajoute au contenu de la variable $contenu_fichier           } 

          fclose($ressource_fichier); 

124

Page 125: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

          echo $contenu_fichier; //affiche le contenu du fichier      } ?>

Lire un fichier sous forme de tableau

Vous avez déjà vu ce que sont les tableaux. Et bien PHP va vous permettre de récupérer le contenu d'un fichier dans un tableau, chaque ligne du tableau correspondra à une ligne du fichier. Ceci est très pratique quand vous avez besoin d'une ligne en particulier dans votre fichier (dont vous connaissez le numéro) ou encore pour faire des opérations de tri alphabétiques, numériques ou que sais-je encore. En tout cas, sachez que c'est également très utilisé ;)

La fonction que nous allons utiliser s'appelle file(). Comme son nom ne l'indique pas, elle va vous retourner un tableau contenant tout votre fichier. Voici comment on l'utilise :

<?php      $tableau = file('test.txt'); //Place le contenu du fichier dans un tableau, on a supposé ici que le fichier existe sous peine d'avoir une erreur. ?>

Et voilà, c'est aussi simple que ça. Maintenant, il faut se souvenir d'une des fonctions que l'on peut utiliser pour parcourir un tableau :pBon allez je vous le dit, on peut prendre par exemple la fonction foreach(). Pour placer le contenu du fichier dans une variable sous forme de chaîne et afficher le fichier (comme nous l'avons fait pour les exemples précédents) on procèdera de cette façon :

<?php      $tableau = file('test.txt'); //Place le contenu du fichier dans un tableau, on suppose que le fichier existe sous peine d'avoir une erreur 

     if(is_array($tableau)) //Si la variable $tableau est bien un tableau, on peut continuer      {           $contenu_fichier = ''; 

          foreach($tableau AS $ligne)           {                $contenu_fichier .= $ligne;           } 

          echo $contenu_fichier; //Affiche le contenu du fichier, notez que l'on a pas besoin d'utiliser fclose() ici      } ?>

Écrire dans un fichier

Nous allons voir une seule méthode pour écrire dans un fichier, il s'agit d'utiliser la fonction fputs() disponible sur toutes les versions de PHP. Il faut d'abord ouvrir le

125

Page 126: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

fichier à l'aide de la fonction fopen() et un mode d'écriture approprié, ensuite on utilise fputs() pour écrire les données, et ensuite on ferme le fichier.

Voici un exemple pour écrire les données "7654321" dans le fichier "test.txt" que nous avons utilisé tout au long de cette page :

<?php      $ressource_fichier = fopen('test.txt', 'w'); 

     if($ressource_fichier AND is_writable('test.txt')) //Si $ressource_fichier ne vaut pas FALSE et que le fichier est accessible en écriture alors on peut continuer     {           fputs($ressource_fichier, '7654321'); //Si une erreur a lieu, fputs() renverra FALSE, il faudra dans ce cas utiliser l'opérateur triple égal pour le savoir

          fclose($ressource_fichier);      } ?>

Quelques fonctions utiles

Si vous souhaitez vérifier qu'un fichier existe, vous utiliserez pour cela la fonction file_exists() qui renverra TRUE ou FALSE si le fichier existe ou non. Elle prend en paramètre le nom du fichier.

Voici un exemple :

<?php      if(file_exists('test.txt'))      {           echo 'Le fichier existe';      }      else      {           echo 'Le fichier n\'existe pas';      } ?>

Il faut toujours avant d'ouvrir un fichier, vérifier si il existe, ce que je n'ai pas fait dans mes exemples précédents, voilà pourquoi je vous mettais à chaque fois "on supposera que le fichier existe sous peine d'avoir une erreur". En effet, si vous tentez d'effectuer une ouverture d'un fichier inexistant, PHP vous renverra une erreur, ce qui serait fâcheux en terme de programmation.Vous aurez peut-être également besoin de savoir comment effacer un fichier. En PHP, on utilise la fonction unlink() avec comme paramètre le nom du fichier à effacer.

Voici comment on l'utilise :

<?php      if(file_exists('test.txt'))      {           unlink('test.txt'); 

126

Page 127: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     } ?>

127

Page 128: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les expressions régulièresPrésentation

Les expressions régulières sont souvent utilisées en PHP quand on doit faire des traitements conditionnels très poussés sur les chaînes de caractères. Ce chapitre est malheureusement compliqué à comprendre, et nous aborderons plein d'exemples simples qui je l'espère vous permettront de faire des choses plus compliquées ensuite.Une expression régulière (aussi appelée regex) va par exemple vous permettre de savoir si une chaîne est composée de 6 caractères numériques, de savoir si elle commence par un "a" tout en finissant par un "w" ou encore de savoir si il s'agit d'une date valide, etc ...Toutes ces conditions que l'on fixe se présentent sous la forme d'une chaîne de caractères qui peut être immense en fonction de ce que l'on souhaite savoir ou récupérer. 

Les fonctions PCRE

En PHP, il existe deux "langages" pour les expressions régulières. Ces deux langages sont le POSIX et le PCRE. Nous étudierons les fonctions utilisant le langage PCRE, plus performant que le POSIX (que ce soit en terme de puissance ou de rapidité de traitement). Les fonctions utilisant le PCRE commencent généralement par le préfixe "preg_".Voici une liste des fonctions PCRE que nous serons amenées à utiliser (il en existe d'autres) : preg_match_all preg_match preg_replace preg_split

Ces fonctions s'utilisent généralement de la manière suivante (pour les fonctions de remplacement) :preg_X('masque', 'chaine de remplacement', 'chaine de caractères dans laquelle on appliquera le masque');Les fonctions de comparaison sont plutôt de ce style là :preg_Y('masque', 'chaine de caractères dans laquelle on appliquera le masque');La chaîne "masque" correspond à une expression régulière. Nous allons voir plus bas comment créer des expressions régulières. Avant toute chose, il faut savoir qu'une regex est toujours délimitée par deux caractères identiques appelés délimiteurs. Ces délimiteurs sont importants car ils vont vous permettre d'ajouter des options à votre expression régulière (comme par exemple l'insensibilité aux majuscules/minuscules).

Voici l'exemple général d'utilisation d'une regex :`masque`options

Ce qui peut donner par exemple :`[a-z]*`i

Ici, vous ne le savez pas encore mais ceci désigne une chaîne composée de lettres

128

Page 129: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

uniquement, majuscules ou minuscules (le i dans l'option signifie que la recherche est insensible aux minuscules ou majuscules)

Recherche d'une chaîne - bases

La recherche d'une chaîne de caractères simple peut se faire avec la fonction strpos() de PHP, qui sera bien plus rapide qu'une expression régulière. Toutefois, ses fonctionnalités sont très limitées car elle ne peut disposer en paramètre que d'une chaîne fixe. Avec une expression régulière vous allez pouvoir imposer des conditions performantes sur la recherche.

Pour rechercher une chaîne suivant des conditions précises, on utilise la fonction preg_match(). Elle s'utilise comme ceci :

<?php      $chaine = 'Un exemple de chaîne simple'; 

     if(preg_match('`exemple`', $chaine))      {           echo 'Vrai, la chaîne correspond au masque';      }      else      {           echo 'Faux, la chaîne ne correspond pas au masque';      } ?>

Ici, la chaîne correspond au masque car nous cherchons la chaîne "exemple" qui se situe bien dans la phrase "Un exemple de chaîne simple". Bon, vous vous imaginez que les fonctions de preg_match() ne se limitent pas à ça, sinon utiliser strpos() ...Voyons d'autres cas de figure :

<?php      $chaine = 'Un exemple de chaîne simple'; 

     if(preg_match('`Exemple`', $chaine))      {           echo 'Vrai, la chaîne correspond au masque';      }      else      {           echo 'Faux, la chaîne ne correspond pas au masque';      } ?>

129

Page 130: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Ici, vous aurez un résultat faux car le E de exemple est en majuscule. Pour remédier à ce problème, on utilise l'option "i" qui signifie que le masque ne tient pas compte des minuscules et majuscules. Les options se placent après le deuxième délimiteur (ici le caractère `) :

<?php      $chaine = 'Un exemple de chaîne simple'; 

     if(preg_match('`Exemple`i', $chaine))      {           echo 'Vrai, la chaîne correspond au masque';      }      else      {           echo 'Faux, la chaîne ne correspond pas au masque';      } ?>

Ici, preg_match() renvoie TRUE. Voyons d'autres cas : Chaîne Regex Résultat

'Un exemple de chaîne simple' `exemple` Vrai (le mot "exemple" se trouve bien dans la chaîne)

'Un exemple de chaîne simple' `compliquée` Faux (le mot "compliquée" ne se trouvant pas dans la chaîne)

'Un exemple de chaîne simple' `Exemple` Faux car le E est en majuscule dans la regex et pas dans la chaîne

'Un exemple de chaîne simple' `Exemple`i Vrai car le i rend insensible à la casse (majuscules/minuscules) la regex

Recherche d'une chaîne : condition "ou"

Le symbole "ou" est désigné en PCRE par une seule barre verticale (contrairement au PHP qui lui en demande deux dans les conditions habituelles).Mettons que nous recherchions dans une chaine le mot "site" ou le mot "web". La regex pourra s'écrire comme ceci :`site|web`

Chaîne Regex Résultat

'Bienvenue sur mon site web' `site|web` Vrai (on a bien soit site soit web dans la chaîne)

'BIENVENUE SUR MON SITE WEB' `site|web` Faux (aucun des deux mots n'est en minuscules)

'BIENVENUE SUR MON SITE WEB' `site|web`i

Vrai, on a rendu l'expression régulière insensible à la casse

'Bienvenue sur mon site' `site|web` Vrai car le mot "site" figure dans la chaîne à analyser

130

Page 131: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

'Bienvenue sur mon espace web' `site|web` Vrai car le mot "web" figure dans la chaîne à analyser

'Bienvenue sur mon espace' `site|web` Faux car ni le mot "site" ni le mot "web" ne figurent dans la chaîne

Le début et la fin d'une chaîne

Bon, nous allons maintenant voir quelque chose d'un peu plus précis. Il s'agit du début et de la fin d'une chaîne. Par exemple nous allons pouvoir dire "est-ce que cette chaîne commence par la lettre A majuscule et se termine par un b minuscule ?"

Les deux symboles utilisés pour désigner cela sont ceux-ci : ^ qui désigne le début d'une chaîne. $ qui désigne la fin d'une chaîne.

Chaîne Regex Résultat

'Anthony' `^A` Vrai (la chaîne commence bien par un A)

'Anthony' `y$` Vrai (la chaîne se termine par un y)

'Début de phrase' `^Dt$` Faux car la chaîne est différente de "Dt"

'Bienvenue sur mon espace web'

`^Bienvenue sur mon espace web$` Vrai car la chaîne est identique des deux côtés

'Bienvenue sur mon espace web' `^Bienvenue web$` Faux car il y a des mots entre le mot

"Bienvenue" et le mot "Web"

Les quantificateurs

Les quantificateurs sont très utiles, grâce à eux vous allez pouvoir dire "je veux savoir si cette chaîne commence par 7 fois la lettre A", ou encore "il me faut un A, trois o et deux z". Il faut tout d'abord retenir trois symboles : ? qui désigne "0 ou une occurrence". Si on prend par exemple le masque `v?`, la

châine 'v' sera valide, 'vv' ne sera pas valide et '' sera valide + qui désigne "1 ou plusieurs occurrences". Si on prend par exemple le

masque `v+` la chaîne 'v' sera valide, 'vv' le sera aussi, 'vvvvvv' aussi mais par contre '' ne sera pas valide.

* qui désigne "0, 1 ou plusieurs occurrences".  Si on prend par exemple le masque `v+`, la chaîne 'v' sera valide, 'vv' le sera aussi, 'vvvvvv' aussi ainsi que ''

Ces symboles s'appliquent uniquement à la lettre (ou au mot si vous placez des parenthèses) qui est situé(e) à gauche du symbole.

Chaîne Regex Résultat

131

Page 132: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

'Anthony' `An?thony` Vrai (Il y a bien 0 ou 1 "n" après le A)

'Annnnnnthony' `An?thony` Faux (il y a plus de 1 "n" après le A)

'Annnnnnthony' `An+thony` Vrai (il y a bien au moins 1 "n" après le A)

'Chat' `Chats?$`Vrai car le mot "chat" peut ici aussi être au pluriel (0 ou 1 "s"), ensuite on marque la fin de la chaîne

'Chat' `Chats*$`Vrai car * signifie "0", "1" ou "plusieurs" ici il n'y a pas de s, la condition reste quand même vraie.

Il existe un autre moyen de quantifier, cette fois plus précisément, une chaîne ou une lettre, ou encore une classe de caractères (on verra ce que c'est juste après).

On utilise pour cela les accolades. Voici comment ça fonctionne : {X} : la chaîne doit être répétée X fois. Par exemple : `A{2}` fonctionnera pour

AA mais pas pour AAA ni pour A. {X,Y} : la chaîne peut être répétée de X fois à Y fois. Par

exemple :  `A{2,4}` fonctionnera pour AA, pour AAA et pour AAAA mais pas pour A ni pour AAAAA.

{X,} : la chaîne doit être répétée au moins X fois mais il n'y a pas de limite de nombre. Par exemple :  `A{2,}` fonctionnera pour AA, pour AAA, pour AAAA... mais pas pour A.

Chaîne Regex Résultat

'Anthony' `An{0,1}thony` Vrai (Il y a bien 0 ou 1 "n" après le A)

'Annnnnnthony' `An{2}thony` Faux (il n'y a pas deux "n" après le A)

'Annnnnnthony' `An{2,}thony` Vrai (il y a bien au moins 2 "n" après le A)

Les classes de caractères

Les classes de caractères vont vous permettre d'effectuer des recherches précises tout en limitant le nombre de caractères de vos expressions régulières. Les classes de caractères sont toujours contenues entre des crochets simples ou doubles (nous verrons certaines classes de caractères spéciales après).Voici un exemple d'expression régulière incluant une classe de caractères : `[nv]ous`le [nv] signifie "n" OU "v". Les mots "nous" et "vous" seront donc acceptés, il s'agit donc de l'équivalent de `(n|v)ous`

Chaîne Regex Résultat

132

Page 133: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

'Nous' `[nv]ous`i Vrai (le i rend la regex insensible à la casse)

'Nous' `[vs]$` Vrai (la chaîne se termine bien par un v ou un s)

Voyons maintenant quelques classes un peu spéciales, elles ont de spécial le fait que l'on utilise un tiret entre plusieurs valeurs, il s'agit donc d'intervalles de caractères. Nous allons voir ici quelques exemples rapides, car je pense que vous allez vite comprendre l'intérêt de cette syntaxe :`[a-z]` : indique une lettre minuscule allant de a à z`[0-3]` : indique un chiffre allant de 0 à 3`[a-z0-9]` : indique des lettres minuscules OU des chiffres allant de 0 à 9

Chaîne Regex Résultat

'Anthony' `[a-z]*` Faux (le premier A est en majuscules)

'Annnnnnthony' `[a-z]*`i Vrai (les caractères sont tous des lettres minuscules ou majuscules)

'Annnnnnthony1' `[0-9]$` Vrai (la chaîne se termine bien par un chiffre allant de 0 à 9)

Vous pouvez également interdire un ou une plage de caractères, cette fois-ci on utilise le symbole ^ placé juste après le premier crochet ouvrant. Il ne signifie plus "début de la chaîne" mais une interdiction.

Chaîne Regex Résultat

'ANTHONY' `^[^a-z]*$` Vrai (la chaîne ne contient pas de minuscules)

'Anthony' `^[^a-z]*$` Faux (la chaîne contient des minuscules)

Voici maintenant quelques classes encore spéciales, puisqu'elles sont contenues entre des doubles crochets. Ce sont des classes prédéfinies qui vont vous simplifier la syntaxe de vos regex :

[[:alpha:]] : n'importe quelle lettre [[:lower:]] : n'importe quelle lettre en minuscule [[:upper:]] : n'importe quelle lettre en majuscule [[:alnum:]] : n'importe quelle lettre ou chiffre [[:digit:]] : n'importe quel chiffre [[:punct:]] : n'importe quel signe de ponctuation [[:space:]] : n'importe quel espace blanc [[:blank:]] : espace ou tabulation [[:graph:]] : caractères affichables et imprimables [[:cntrl:]] : caractères d'échappement [[:xdigit:]] : caractères héxadécimaux [[:print:]] : scaractères imprimables exceptés ceux de contrôle

133

Page 134: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les métacaractères

Les métacaractères sont des caractères spéciaux effectuant des actions bien précises sur les chaînes. Voici la liste de ces caractères :[ ] ! ( )  { } ^ $ ? . + * \ #Le problème qu'ils génèrent est lorsque vous souhaitez les utiliser dans vos recherches ou remplacements de caractères. Il faut les faire précéder d'un antislash \. Voici un exemple :

Chaîne Regex Résultat

'ça va?' `ça va?$` Faux (la chaîne ne se termine pas par 0 ou 1 "a")

'ça va?' `ça va\?$` Vrai (on a échappé correctement le caractère)Attention, cette règle ne s'applique pas à l'intérieur des classes de caractères. Ainsi, la classe [ab+?] signifie que vous pourrez avoir la lettre "a" ou "b" ou "+" ou "?".

134

Page 135: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Les classes abrégées

Les classes abrégées vont vous permettre de réduire encore la longueur de vos expressions régulières au mépris de leur compréhension directe. On utilise pour cela un antislash suivi d'un caractère, qui à eux deux signifient une classe de caractère plus complexe. Quand on connaît la signification des lettres par coeur, c'est assez facile de ne pas se tromper, mais sinon la confusion peut régner, voilà pourquoi personnellement je préfère utiliser les classes de caractères simples. Voici la liste des classes de caractères abrégées : . signifie que vous pouvez mettre n'importe quel caractère. \w indique les mots [_a-zA-Z0-9] \W indique ce qui ne correspond pas à un mot [^_a-zA-Z0-9] \d indique que vous souhaitez un chiffre [0-9] \D indique les caractères n'étant pas des chiffres [^0-9] \s correspond à un espace (correspond à \t \n \r) \S correspond à ce qui n'est pas un espace (\t \n \r) \t correspond à une tabulation \n correspond à un saut de ligne \r correspond à un retour chariot

135

Page 136: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Les imagesPrésentation

PHP ne se limite pas à la génération de pages (X)HTML. En effet, celui-ci peut également afficher des images et les générer à la volée. Vous avez sans doute déjà vu des  formulaires demandant un code à recopier pour être sûr que ce n'est pas un ordinateur qui remplit les champs automatiquement, et bien PHP permet de créer des images de ce style, mais heureuseument, ses performances ne s'arrêtent pas là. Vous allez pouvoir créer des images aux possibilités limitées uniquement par votre créativité artistique. 

Activer la librairie GD

Par défaut, la librairie GD est désactivée. Il va donc falloir l'activer car sinon vous ne pourrez pas faire ce qui va suivre. Pour l'activer, il faut que vous trouviez un fichier nommé "php.ini" qui contient les paramètres de configuration de PHP. Ce fichier se situe généralement dans le répertoire "apache2" d'easyPHP ou encore de Wamp. Essayez également dans le répertoire C:\Windows. Une fois ce fichier ouvert, localisez la ligne suivante : ;extension=php_gd2.dll, supprimez le point-virgule, enregistrez le fichier php.ini puis redémarrez Apache (ou relancez complètement le programme que vous utilisez pour travailler en PHP, easyPHP, Wamp, etc ...)

Créer une image

Avant de parler de création d'image proprement dite, il faut savoir qu'il existe plusieurs types d'images. Les types les plus répandus sur le web sont les formats gif, jpg et png. Cela tombe bien, GD permet de gérer ces trois formats (et d'autres, mais nous ne les utiliserons pas ici).

Pour que le navigateur sâche qu'il envoie une image au navigateur et non une page (X)HTML, on doit envoyer un en-tête spécial sous peine de voir s'afficher des caractères incompréhensibles lorsque l'on demandera l'image. Cet en-tête dit juste "voilà, j'envoie une image de tel type". On doit renseigner dans cet en-tête (les en-têtes sont aussi appelés headers) le type mime du fichier envoyé. Je vais vous donner les trois types mimes que nous utiliserons :

Pour une image gif, le type mime à utiliser est image/gif Pour une image jpg, le type mime à utiliser est image/jpeg Pour une image png, le type mime à utiliser est image/png

Il faut maintenant que l'on envoie l'en-tête, on utilise pour cela la fonction header() en PHP. Mettons que l'on veuille générer une image jpg, on utilisera le code suivant :

136

Page 137: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php      header('Content-type: image/jpeg'); ?>

Création d'une image de base

Pour créer une image, il y a deux solutions. Vous pouvez partir de rien du tout (et créer l'image de toutes pièces) ou partir d'une image déjà existante sur le disque dur. Pour créer une image en partant de zéro, on va utiliser la fonction imagecreate(), pour créer une image à partir d'un fichier, il existe trois fonctions en fonction du type de fichier de l'image source :

imagecreatefromgif() : cette fonction permet de créer une image en partant d'une image gif source, on passera en paramètre le nom de l'image gif.

imagecreatefromjpeg() : cette fonction permet de créer une image en partant d'une image jpg source, on passera en paramètre le nom de l'image jpg.

imagecreatefrompng() : cette fonction permet de créer une image en partant d'une image png source, on passera en paramètre le nom de l'image png.

En cas d'utilisation d'une fonction imagecreatefromX(), les dimensions de l'image que vous allez générer seront pour le moment dictées par les dimensions de l'image que vous avez ouverte. Dans le cas contraire, il faudra préciser les dimensions de l'image à créer.

Voici un exemple créant une image de base, sans ouvrir d'image existante :

<?php      header('Content-type: image/jpeg'); 

     $image = imagecreate(100, 50); //Crée une image de 100 pixels de large et 50 pixels de haut ?>

Lorsque nous utiliserons les fonctions de la librairie GD, nous travaillerons en coordonnées X, Y selon ce plan :

Pour créer une image tout en se servant d'une image déjà existante, voici un exemple pour une image jpeg, il suffit juste de remplacer le nom de la fonction imagecreatefromjpeg par le nom de la fonction qui va bien pour le fichier que vous souhaitez :

137

Page 138: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php      header('Content-type: image/jpeg'); 

     $image = imagecreatefromjpeg('monimage.jpg'); //Crée une image à partir de 'monimage.jpg' ?>

Envoi de l'image au navigateur ou sauvegarde sur le disque

Une fois que vous avez fini de générer votre image, il faut soit l'envoyer au navigateur, soit la sauvegarder sur le disque. On utilise pour cela différentes fonctions qui diffèrent uniquement selon le type d'image que vous allez envoyer ou sauvegarder.

Voici la liste des fonctions que nous serons amenés à utiliser : imagegif() : cette fonction permet de générer une image gif. Si vous souhaitez

sauvegarder l'image sur le disque, dans le paramètre de la fonction, entrez le nom du fichier sous lequel l'image sera sauvegardée.

imagejpeg() : cette fonction permet de générer une image jpg. Si vous souhaitez sauvegarder l'image sur le disque, dans le paramètre de la fonction, entrez le nom du fichier sous lequel l'image sera sauvegardée.

imagepng() : cette fonction permet de générer une image png. Si vous souhaitez sauvegarder l'image sur le disque, dans le paramètre de la fonction, entrez le nom du fichier sous lequel l'image sera sauvegardée.

Les couleurs

On travaillera en PHP avec le système de couleurs RGB (red, green, blue). Ce système permet de recomposer une quantité enorme de couleurs à partir de 256 possibilités de rouge, 256 possibilités de vert et 256 possibilités de bleu. Vous pourrez si vous le souhaitez connaître le code de votre couleur en utilisant un éditeur d'images. Windows intègre paint par défaut qui permet au moins de connaître ça ;)Pour que PHP sâche quelle couleur il doit utiliser, on stocke les couleurs dans des variables.

Les "codes couleurs" sont générés grâce à la fonction imagecolorallocate().

<?php     $blanc = imagecolorallocate($image, 255, 255,255); //Premier 0 : quantité de rouge, second 0 : quantité de vert, troisième 0 : quantité de bleu      $noir = imagecolorallocate($image, 0, 0, 0); ?>

Le premier imagecolorallocate() que vous ferez correspondra à la couleur de fond de votre image. Vous pourrez toujours le changer de couleur ultérieurement via des bidouilles, mais pensez-y. Si vous souhaitez une image à fond blanc, il faut utiliser le code couleur 255, 255, 255.

138

Page 139: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Ecrire du texte

GD permet heureusement d'écrire du texte sur les images. On utilise pour cela la fonction imagestring().

<?php      imagestring($image, $taille_de_police, $x, $y, $texte, $couleur); ?>

Nous allons maintenant détailler les paramètres de cette fonction : $image : correspond à l'image que vous avez créée avec imagecreate() $taille_de_police : il s'agit ici d'un nombre allant de 1 à 5 précisant la grosseur de

la police. Nous n'utiliserons que pour ce chapitre des polices par défaut. $x : coordonnées en pixels sur l'axe des abscisses. $y : coordonnées en pixels sur l'axe des ordonnées. $couleur : une couleur générée avec imagecolorallocate()

Si nous souhaitons écrire "Salut à tous" aux coordonnées (10, 50) en police noire de taille 4, on procèdera comme ceci :

<?php      imagestring($image, 4, 10, 50, 'Salut à tous !', $noir); ?>

Nous allons maintenant voir l'exemple complet :

<?php      header('Content-type: image/jpeg');  

     $image = imagecreate(100, 50); //Crée une image de 100 pixels de large et 50 pixels de haut      $blanc = imagecolorallocate($image, 255, 255, 255); //Premier 0 : quantité de rouge, second 0 : quantité de vert, troisième 0 : quantité de bleu      $noir = imagecolorallocate($image, 0, 0, 0);      imagestring($image, 4, 10, 50, 'Salut à tous !', $noir); //Affiche une chaîne sur l'image      imagejpeg($image); //Renvoie l'image au navigateur ?>

Remarquez l'utilisation de la fonction imagejpeg() qui prend en paramètre l'image que l'on souhaite envoyer/sauvegarder. Cela permet à PHP ici d'envoyer l'image au navigateur.

139

Page 140: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Quelques formes bien utiles

Heureusement, les possibilités de GD ne s'arrêtent pas là et il est possible de créer de nombreuses formes. Voici quelques fonctions bien utiles et leurs effets :

Créer une ligne :

La fonction imageline() permet de créer une ligne. Voici un exemple :

<?php$noir = imagecolorallocate($image, 0, 0, 0);imageline($image, $x1, $y1, $x2, $y2, $noir);?>

Nous venons de créer une ligne. Les coordonnées du premier point sont ($x1,$y1) et du second point ($x2,$y2). La ligne aura une couleur valant $noir (ici la couleur noire, qui vaut 0,0,0 en RVB).

 Modifier le style des lignes et des contours de formes :

La fonction imagesetstyle() permet de modifier le style des lignes et des contours de formes pour créer des lignes personnalisées. Voici un exemple :

<?php      header('Content-type: image/gif'); 

     $image   = imagecreate(200, 200);      $blanc    = imagecolorallocate($image, 255, 255, 255);      $noir      = imagecolorallocate($image, 0, 0, 0);      $rouge   = imagecolorallocate($image, 255, 0, 0); 

     $style    = array($noir, $rouge, $noir, $rouge, $rouge, $rouge, $noir); //un pixel noir, un pixel rouge, un pixel noir ... 

     imagesetstyle($image, $style); //Applique le style sur l'image      imagesetthickness($image, 20); //Modifie l'épaisseur de la ligne 

     imageline($image, 50, 60, 150, 60, IMG_COLOR_STYLED); //On utilise la constante IMG_COLOR_STYLED qui signifie que GD doit utiliser le style défini plus haut

140

Page 141: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     imagegif($image); ?>

Nous venons de créer une ligne. Les coordonnées du premier point sont (50, 60) et du second point (150, 60). La ligne sera personnalisée (notez la constante IMG_COLOR_STYLED). Il y aura respectivement un pixel noir, un pixel rouge, un pixel noir, trois pixels rouges et un pixel noir (voir le tableau $style).

Voilà ce que cela donne en pratique :

Créer un rectangle :

La fonction imagerectangle() permet de créer un rectangle. On l'utilise comme ceci :

<?php      header('Content-type: image/gif'); 

     $image = imagecreate(200, 200);      $blanc  = imagecolorallocate($image, 255, 255, 255);      $noir    = imagecolorallocate($image, 0, 0, 0); 

     imagerectangle($image, 50, 50, 150, 150, $noir); 

     imagegif($image); ?>

Nous venons de créer un rectangle. Les coordonnées du premier point sont ($x1,$y1) et du second point ($x2,$y2). Le rectangle sera comme tous nos exemples précédents noir : $noir (ici la couleur noire, qui vaut 0,0,0 en RVB). Voilà ce que cela donne en pratique :

Maintenant appliquons ce que l'on a appris concernant les contours personnalisés :

<?php      header('Content-type: image/gif'); 

     $image    = imagecreate(200, 200);      $blanc    = imagecolorallocate($image, 255, 255, 255);      $noir    = imagecolorallocate($image, 0, 0, 0); 

141

Page 142: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     $rouge    = imagecolorallocate($image, 255, 0, 0); 

     $style    = array($noir, $rouge, $noir, $rouge, $rouge, $rouge, $noir); //un pixel noir, un pixel rouge, un pixel noir ... 

     imagesetstyle($image, $style); //Applique le style sur l'image, ici la bordure du rectangle sera de ce style      imagesetthickness($image, 10); //Ici, la largeur correspondra à la largeur du contour du rectangle 

     imagerectangle($image, 50, 50, 150, 150, IMG_COLOR_STYLED); 

     imagegif($image); ?>

Ca a de la classe non ? Si vous souhaitez que le rectangle soit rempli, on utilise la fonction imagefilledrectangle() qui s'utilise de la même façon que la fonction imagerectangle().

Créer une ellipse :

Vous pouvez quand même créer autre chose que des lignes et des rectangles ! Il existe par exemple une fonction vous permettant de créer des ellipses. Celle-ci porte le nom de imageellipse(). Voici ce que ça donne au niveau du code :

<?php       header('Content-type: image/gif');  

     $image    = imagecreate(200, 200);       $blanc    = imagecolorallocate($image, 255, 255, 255);       $noir    = imagecolorallocate($image, 0, 0, 0);  

     imageellipse($image, 100, 50, 150, 70, $noir);  

     imagegif($image);  ?>

142

Page 143: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Et ce que ça donne en pratique :

Inutile que je vous montre comment créer une ellipse avec un contour personnalisé, je pense que vous savez comment faire maintenant ;)Pour ce qui est de l'ellipse remplie intégralement, on utilise la fonction imagefilledellipse() qui se comporte comme la fonction imageellipse().

Créer un polygone :

La fonction imagepolygon() permet de créer un polygone. On l'utilise comme ceci :

<?php        header('Content-type: image/gif');   

     $image    = imagecreate(200, 200);        $blanc    = imagecolorallocate($image, 255, 255, 255);        $noir    = imagecolorallocate($image, 0, 0, 0);          $points = array(50,10,70,60,90,40);  

     imagepolygon($image,$points,3,$noir);  

     imagegif($image);   ?>

Voici ce que ça donne :

Inutile de vous dire que vous pouvez également créer des polygones aux lignes personnalisées ou/et remplis. Ici, le chiffre 3 dans les paramètres de la fonction correspond au nombre de points du polygone. Les points sont déterminés par le tableau $points. Détaillons un peu le principe de ce tableau via cette image :

 

Effets sur les images

Les possibilités de GD ne s'arrêtent pas là. Vous allez pouvoir faire des rotations d'images, rendre des images transparentes, redimensionner des images ...Voyons comment effectuer la rotation d'une image :

143

Page 144: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php        header('Content-type: image/gif');   

     $image    = imagecreate(150, 150);        $blanc    = imagecolorallocate($image, 255, 255, 255); //On a donc une image de 150*150 sur fond blanc      $noir     = imagecolorallocate($image, 0, 0, 0);  

     $image = imagerotate($image, 45, $noir); //L'image sur fond blanc a été tournée de 45° et le "vide" a été comblé par du noir 

     imagegif($image); ?>

Rendre une image transparente :

Les images GIF et PNG supportent la transparence. PHP et GD vont vous permettre de définir une couleur transparente sur une image. Reprenons l'image ci-dessus qui a été tournée de 45 degrés. Nous aimerions faire disparaître le noir. Voilà comment on pourrait procéder :

<?php      header('Content-type: image/gif');    

     $image = imagecreate(150, 150);         $blanc  = imagecolorallocate($image, 255, 255, 255); //On a donc une image de 150*150 sur fond blanc       $noir    = imagecolorallocate($image, 0, 0, 0); 

     $image = imagerotate($image, 45, $noir); //L'image sur fond blanc a été tournée de 45° et le "vide" a été comblé par du noir  

     $noir    = imagecolorallocate($image, 0, 0, 0); //On réalloue du noir, l'image ayant été modifiée. 

     imagecolortransparent($image, $noir); //Le noir devient transparent 

     imagegif($image);  ?>

144

Page 145: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voici ce que cela donne (il reste encore des pixels "presque noirs" voilà pourquoi ils n'ont pas été supprimés, car ils ne sont pas exactement noirs ;) ) :

 Redimensionner une image :

PHP et GD sont très utilisés pour redimensionner les images. Par exemple, sur ce site, votre avatar est redimensionné automatiquement si il est trop grand. J'utilise GD pour faire cela, avec une fonction très simple d'utilisation. Il s'agit de la fonction imagecopyresampled(). Imaginions que nous souhaitions réduire l'image à 100*100 pixels :

<?php      header('Content-type: image/gif');    

     $image       = imagecreate(150, 150);      $destination = imagecreate(100, 100); //Image qui sera l'image de destination 

     $blanc    = imagecolorallocate($image, 255, 255, 255); //On a donc une image de 150*150 sur fond blanc       $noir     = imagecolorallocate($image, 0, 0, 0); 

     $image    = imagerotate($image, 45, $noir); //L'image sur fond blanc a été tournée de 45° et le "vide" a été comblé par du noir  

     $noir     = imagecolorallocate($image, 0, 0, 0); //On réalloue du noir, l'image ayant été modifiée. 

     $largeur_src = imagesx($image); //Renvoie la largeur de l'image source      $hauteur_src = imagesy($image); //Renvoie la hauteur de l'image source 

     imagecopyresampled($destination, $image, 0, 0, 0, 0, 100, 100, $largeur_src, $hauteur_src); 

     imagecolortransparent($destination, $noir); //Le noir devient transparent 

     imagegif($destination);  ?>

145

Page 146: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voilà ce que l'on obtient :

146

Page 147: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Envoyer un mailPrésentation

Vous vous êtes peut-être déjà demandé comment un site faisait pour vous envoyer un mail directement après votre inscription ou encore selon des paramètres que vous avez renseignés. La réponse tient à peu de choses : l'envoi de mails via PHP. Il existe différents moyens pour envoyer un mail en PHP, le plus simple étant d'utiliser la fonction prévue à cet effet, à savoir la fonction mail().

La fonction mail() s'utilise de cette façon :<?php      mail('email_destinataire', 'sujet', 'message'); ?>

Envoi de mails au format texte

Les mails au format texte sont les mails les plus simples à envoyer. Ils ne possèdent pas de mise en forme (ni images, ni police spéciale, ni gras, etc ...) et sont de nos jours de moins en moins utilisés. Leur avantage principal est qu'ils sont lisibles par tous et qu'ils sont plus légers que leurs homologues (X)HTML, ce qui est idéal pour les serveurs et les petites connexions.La syntaxe à utiliser pour la fonction mail() est donc identique à celle que nous avons décrite plus haut. Pour faire un saut de ligne dans le message, on utilise \n qui doit être entouré de guillemets doubles et non de guillemets simples. En effet, "\n" est un seul caractère "interprété". '\n' ne fonctionnera donc pas.

<?php      mail('email_destinataire', 'sujet', 'message'); ?>

Les en-têtes (headers)

Les en-têtes sont utilisés dès que vous aurez envie de personnaliser un peu votre mail. Spécifier une adresse de réponse, plusieurs adresses d'envoi, des copies cachées, etc ... sont des choses impossibles sans utiliser d'en-têtes avec PHP. Voici la liste des principaux en-têtes (headers) :

From : cet en-tête permet de spécifier l'adresse email de l'expéditeur. On peut mettre tout et n'importe quoi comme adresse mail, et donc vous comprennez maintenant pourquoi vous recevez des emails de bill gates en personne (sic) et autres débilités (SPAM).On l'utilise comme ceci : From: "Nom de l'expéditeur" <adresse mail de l'expéditeur>

Reply-To : cet en-tête permet de spécifier l'adresse email de réponse.On l'utilise comme ceci : Reply-To: adresse_mail

Cc: : cet en-tête permet de spécifier les autres destinataires qui recevront le mail en Cc (Carbon copy), c'est à dire que tous les destinataires pourront voir à

147

Page 148: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

qui le message a été transmis.On l'utilise comme ceci : Cc: email1,email2,email3...

Bcc: : cet en-tête permet de spécifier les autres destinataires qui recevront le mail en Bcc (Blind carbon copy), c'est à dire que les destinataires ne pourront pas voir à qui le message a été transmis, il s'agit d'une copie cachée.On l'utilise comme ceci : Bcc: email1,email2,email3...

Content-Type : cet en-tête permet de spécifier le type mime du mail et son charset (jeu de caractères).

Content-Transfer-Encoding : cet en-tête permet de spécifier l'encodage du mail ou de l'une de ses parties (utile dans le cas d'un envoi texte+html par exemple). Il peut par exemple prendre les valeurs 7 et 8 bit (l'encodage 7 bit étant utilisé dans les pays anglophones n'ayant pas besoin de gérer les lettres accentuées).

X-Priority : Permet de définir le niveau de priorité du mail envoyé. Peut prendre une valeur variant de 1 à 5. Plus ce chiffre est faible, plus haute est la priorité.

Disposition-Notification-To : Permet de spécifier l'adresse mail de retour pour la confirmation de lecture.

La fonction mail() prend maintenant un autre argument en paramètre, à savoir les headers que vous aurez tous séparés par des \n. Voici ce que ça peut donner :

<?php      $headers ='From: "nom"<[email protected]>'."\n";      $headers .='Reply-To: [email protected]'."\n";      $headers .='Content-Type: text/plain; charset="iso-8859-1"'."\n";      $headers .='Content-Transfer-Encoding: 8bit'; 

     if(mail('[email protected]', 'Sujet', 'Message de test', $headers))      {           echo 'Le message a bien été envoyé';      }      else      {           echo 'Le message n\'a pu être envoyé';      } ?>

Bon, vous allez voir que maintenant envoyer un mail au format HTML n'est plus si compliqué.

Envoi de mails en HTML avec PHP

Il nous faut juste modifier le message pour le mettre au format HTML, et modifier le header "content-type" pour dire cette fois-ci que le message est au format HTML.

Rien de bien sorcier, voici ce que ça donne en pratique :

<?php      $headers ='From: "nom"<[email protected]>'."\n";      $headers .='Reply-To: [email protected]'."\n";      $headers .='Content-Type: text/html; charset="iso-8859-1"'."\n";      $headers .='Content-Transfer-Encoding: 8bit'; 

     $message ='<html><head><title>Un titre ici</title></head><body>Un

148

Page 149: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

message de test</body></html>'; 

     if(mail('[email protected]', 'Sujet', $message, $headers))      {           echo 'Le message a été envoyé';      }      else      {           echo 'Le message n\'a pu être envoyé';      } ?>

Envoyer des mails au formats texte et HTML

Pour être compatible avec tous les clients mails, il existe une solution : envoyer les mails aux formats texte et HTML. L'avantage de ce type d'envoi est que les clients mails qui n'acceptent pas le HTML verront le mail au format texte tandis que les autres pourront profiter de la mise en page plus évoluée offerte par le HTML. Voici un exemple de code permettant d'envoyer un mail au format texte et HTML :

<?php      //-----------------------------------------------      //DECLARE LES VARIABLES      //----------------------------------------------- 

     $destinataire='[email protected]';     $email_expediteur='[email protected]';      $email_reply='[email protected]';

     $message_texte='Bonjour,'."\n\n".'Voici un message au format texte';      $message_html='<html>      <head>      <title>Titre</title>      </head>      <body>Test de message</body>      </html>'; 

     //-----------------------------------------------      //GENERE LA FRONTIERE DU MAIL ENTRE TEXTE ET HTML      //----------------------------------------------- 

     $frontiere = '-----=' . md5(uniqid(mt_rand())); 

     //-----------------------------------------------      //HEADERS DU MAIL      //----------------------------------------------- 

     $headers = 'From: "Nom" <'.$email_expediteur.'>'."\n";      $headers .= 'Return-Path: <'.$email_reply.'>'."\n";      $headers .= 'MIME-Version: 1.0'."\n";      $headers .= 'Content-Type: multipart/alternative; boundary="'.$frontiere.'"'; 

     //-----------------------------------------------      //MESSAGE TEXTE      //----------------------------------------------- 

149

Page 150: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     $message = 'This is a multi-part message in MIME format.'."\n\n"; 

     $message .= '--'.$frontiere."\n";      $message .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n";      $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";      $message .= $message_texte."\n\n"; 

     //-----------------------------------------------      //MESSAGE HTML      //-----------------------------------------------      $message .= '--'.$frontiere."\n";     $message .= 'Content-Type: text/html; charset="iso-8859-1"'."\n";      $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";      $message .= $message_html."\n\n"; 

     $message .= '--'.$frontiere."\n"; 

     if(mail($destinataire,$sujet,$message,$headers))      {           echo 'Le mail a été envoyé';      }      else      {           echo 'Le mail n\'a pu être envoyé';      } ?>

On génère d'abord une frontière (boundary) qui permettra au client mail de séparer les différents contenus. Cette frontière, lorsqu'elle sera utilisée, sera entourée de deux tirets accolés. Après la frontière, on modifie éventuellement les headers appliqués localement (ici le type du message).

Le code est ensuite prêt.

Envoyer des mails avec pièces jointes

Les frontières (boundary) dans les mails permettent d'envoyer aussi des pièces jointes. On encodera les pièces jointes en Base 64 à l'aide de la fonction PHP base64_encode(). Voici un exemple :

<?php      //-----------------------------------------------      //DECLARE LES VARIABLES      //----------------------------------------------- 

     $email_expediteur='[email protected]';      $email_reply='[email protected]';      $message_texte='Bonjour,'."\n\n".'Voici un message au format texte'; 

     $message_html='<html>      <head>      <title>Titre</title>      </head>      <body>Test de message</body> 

150

Page 151: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     </html>'; 

     //-----------------------------------------------      //GENERE LA FRONTIERE DU MAIL ENTRE TEXTE ET HTML      //----------------------------------------------- 

     $frontiere = '-----=' . md5(uniqid(mt_rand())); 

     //-----------------------------------------------      //HEADERS DU MAIL      //----------------------------------------------- 

     $headers = 'From: "Nom" <'.$email_expediteur.'>'."\n";      $headers .= 'Return-Path: <'.$email_reply.'>'."\n";      $headers .= 'MIME-Version: 1.0'."\n";      $headers .= 'Content-Type: multipart/mixed; boundary="'.$frontiere.'"'; 

     //-----------------------------------------------      //MESSAGE TEXTE      //-----------------------------------------------      $message = 'This is a multi-part message in MIME format.'."\n\n"; 

     $message .= '--'.$frontiere."\n";      $message .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n";      $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";      $message .= $message_texte."\n\n"; 

     //-----------------------------------------------      //MESSAGE HTML      //-----------------------------------------------      $message .= '--'.$frontiere."\n"; 

     $message .= 'Content-Type: text/html; charset="iso-8859-1"'."\n";      $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";      $message .= $message_html."\n\n"; 

     $message .= '--'.$frontiere."\n"; 

     //-----------------------------------------------      //PIECE JOINTE      //----------------------------------------------- 

     $message .= 'Content-Type: image/jpeg; name="nom_du_fichier.jpg"'."\n";      $message .= 'Content-Transfer-Encoding: base64'."\n";      $message .= 'Content-Disposition:attachement; filename="nom_du_fichier.jpg"'."\n\n"; 

     $message .= chunk_split(base64_encode(file_get_contents('nom_du_fichier.jpg')))."\n"; 

     if(mail($destinataire,$sujet,$message,$headers))      {           echo 'Le mail a été envoyé';      }      else      { 

151

Page 152: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

          echo 'Le mail n\'a pu être envoyé';      } ?>

152

Page 153: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Programmation orientée objetPrésentation de la POO (programmation orientée objet) en PHP

La POO (programmation orientée objet) est une forme particulière de programmation destinée à faciliter la maintenance et la réutilisation / adaptation de vos scripts PHP. Elle consiste à représenter des objets (du monde réel ou non) sous une forme d'entités informatiques. On représente généralement un objet global par ce que l'on appelle une classe. Une classe va regrouper un ensemble de fonctions et de propriétés pouvant agir sur l'objet. Si on prend par exemple une voiture dans le monde réel, on peut modéliser une voiture par une classe "Voiture" qui aura comme propriétés le nombre de roues, le nombre de portes, etc ...

Les classes

Une classe regroupe des fonctions et des variables (appelées cette fois "attributs", car il s'agit des attributs d'une classe) qui interragissent avec l'objet. C'est à dire que pour un objet "voiture" par exemple, vous aurez une classe nommée "Voiture" et vous pourrez avoir une fonction qui modifie le niveau de carburant (le niveau de carburant étant un attribut de la classe que l'on ne peut modifier que via une fonction (appelée "méthode") qui ira modifier cet attribut). On appelle ce principe l'encapsulation des données, le but de l'encapsulation des données étant de ne pas pouvoir accéder aux données de l'objet directement mais via des fonctions (appelées ici "méthodes"). Chaque attribut peut donc disposer de droits d'accès à l'extérieur de la classe. Nous verrons tout ceci au fur et à mesure que vous lisez cette page.Avant toute chose, PHP 5 a amélioré le support objet de PHP par rapport à PHP 4, nous allons donc utiliser PHP 5 pour tous nos exemples. Si vous avez besoin de savoir comment PHP 4 fonctionne avec l'objet, je vous conseille d'aller jeter un oeil dans la rubrique codes sources orientés objet du site, qui vous permettra d'obtenir des sources de tous types.

Voici comment une classe peut être codée en PHP 5 :

<?php      class Voiture      {           /**           * Déclaration des attributs           */ 

          private $niveau_carburant;           private $nombre_portes;           private $nombre_roues; 

          /**           * Cette méthode un peu spéciale est le constructeur, elle est exécutée lorsque vous "créez" votre objet. Elle doit initialiser les attributs de la classe.          */ 

          public function __construct() 

153

Page 154: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

          {                $this->niveau_carburant = 50;                $this->nombre_portes = 3;                $this->nombre_roues = 4;           } 

          /**           * Première méthode accessible par tous et modifiant le niveau de carburant           */ 

          public function modifier_carburant(int $niveau)           {                $this->niveau_carburant = $niveau;           }

          /**           * Seconde méthode accessible à tous et modifiant le nombre de portes          */ 

          public function modifier_nb_portes(int $nb_portes)           {                $this->nombre_portes = $nb_portes;           }      } ?>

Notion d'objet

Imaginions que vous souhaitiez créer deux voitures dans votre code. Sans programmation orientée objet, on aurait pu stocker les voitures et leurs attributs dans un tableau, ce qui devient vite impossible à gérer. Avec la programmation orientée objet, vous allez pouvoir créer deux objets différents en deux lignes de code. Créer un objet se fait en "instanciant" une classe. Quand on instancie une classe, on crée une version de l'objet ayant des caractéristiques propres. Si vous créez un deuxième objet, il est indépendant du premier, bien qu'ils utilisent tous les deux la même classe (ici nos deux objets seront des voitures, ils utiliseront donc la même classe "Voiture", mais seront bien différents pour autant. Nous pourrons par exemple avoir une voiture ayant trois portes et la seconde 5 portes).

Créer un objet (instanciation d'une classe)

Voici comment on crée un objet Voiture en PHP (on supposera que vous avez inclus le fichier contenant la classe, ou alors que le code de la classe se trouve au-dessus du code que vous allez voir) :

<?php      $objet_voiture = new Voiture(); ?>La variable $objet_voiture représente l'objet qui est ici une voiture. Lorsque vous exécutez ce code, la méthode __construct() de la classe est exécutée. Comme il s'agit d'une fonction, elle peut prendre elle aussi des paramètres. Tout dépend comment vous souhaitez coder votre classe, mais vous pourriez très bien avoir une

154

Page 155: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

fonction __construct() qui initialise les attributs en fonction des paramètres que vous lui fournissez. Voici ce que ça pourrait donner :

<?php       class Voiture       {            /**            * Déclaration des attributs            */  

          private $niveau_carburant;            private $nombre_portes;            private $nombre_roues;  

          /**            * Cette méthode un peu spéciale est le constructeur, elle est exécutée lorsque vous "créez" votre objet. Elle doit initialiser les attributs de la classe.          */  

          public function __construct(int $nb_carburant, int $nb_portes, int $nb_roues = 4)            {                 $this->niveau_carburant = $nb_carburant;                 $this->nombre_portes = $nb_portes;                 $this->nombre_roues = $nb_roues;            }  

          /**            * Première méthode accessible par tous et modifiant le niveau de carburant            */  

          public function modifier_carburant(int $niveau)            {                 $this->niveau_carburant = $niveau;            } 

          /**            * Seconde méthode accessible à tous et modifiant le nombre de portes           */  

          public function modifier_nb_portes(int $nb_portes)            {                 $this->nombre_portes = $nb_portes;            }       }  ?>

Lorsque vous créerez l'objet voiture, vous allez pouvoir sans passer par les méthodes appropriées lui fixer un niveau de carburant, un nombre de portes et un nombre de roues (par défaut 4). Voici deux façons de créer l'objet :<?php       $objet_voiture = new Voiture(50, 3); //50 : niveau de carburant et 3 portes, on a pas besoin de spécifier le nombre de roues car il est de 4 par défaut

     $autre_voiture = new Voiture(10, 5, 6); //10 : niveau de carburant, 5 portes et 6 ro

155

Page 156: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

ues ?>

Il est important de signifier que les objets $objet_voiture et $autre_voiture sont deux objets différents qui peuvent avoir leurs propriétés propres. Vous commencez peut-être maintenant à comprendre avec quelle simplicité vous allez pouvoir créer autant d'objets que vous le souhaitez ;)

Constructeurs et destructeurs

Les constructeurs et destructeurs sont des méthodes particulières. D'une part, elle commencent par deux signes "underscores" accolés (touche 8 du pavé alphanumérique). D'autre part, elles sont exécutées à des moments précis.Le constructeur est appelé automatiquement quand vous créez votre objet. Généralement, cette méthode sert à donner une valeur de départ aux différents attributs de la classe pour vous permettre de "construire" l'objet. Ce n'est cependant pas une obligation et vous pouvez très bien ne rien mettre dans cette méthode.Le destructeur est appelé à la fin d'exécution de votre script. La méthode s'appelle cette fois-ci __destruct().

<?php       class Voiture       {            /**            * Déclaration des attributs            */  

          private $niveau_carburant;            private $nombre_portes;            private $nombre_roues;  

          /**            * Cette méthode un peu spéciale est le constructeur, elle est exécutée lorsque vous "créez" votre objet. Elle doit initialiser les attributs de la classe.          */  

          public function __construct(int $nb_carburant, int $nb_portes, int $nb_roues = 4)            {                 $this->niveau_carburant = $nb_carburant;                 $this->nombre_portes = $nb_portes;                 $this->nombre_roues = $nb_roues;            }  

          /**            * Destructeur, appelé quand l'objet est détruit          */  

          public function __destruct()            {                 echo 'L\'objet a été détruit';          }

156

Page 157: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     }?>

Visibilité des propriétés et méthodes

PHP 5 introduit la notion de visibilité de méthodes et d'attributs. Chaques attributs et méthodes peuvent se voir attribuer un droit d'accès. Le principe de l'encapsulation voudrait que l'on mette tous les attributs uniquement modifiables et accessibles à l'intérieur de la classe, et les méthodes accessibles de l'extérieur. En pratique, ce n'est pas toujours le cas.

Les trois mots permettant de gérer les accès sont ceux-ci : public : n'importe qui a accès à la méthode ou à l'attribut demandé. protected : seule la classe ainsi que ses sous classes éventuelles (classes

héritées, on verra ce que c'est plus loin). private : seule la classe ayant défini l'élément peut y accéder.

Pour la classe Voiture, vous pouvez constater que les attributs ne sont pas modifiables à l'extérieur de la classe, il faut passer par les méthodes appropriées.Pour accéder à un attribut d'une classe, on utilise ce code : $objet->attribut

<?php        class Voiture        {             /**             * Déclaration des attributs             */   

          private $niveau_carburant;             public $nombre_portes;             private $nombre_roues; 

          /**             * Cette méthode un peu spéciale est le constructeur, elle est exécutée lorsque vous "créez" votre objet. Elle doit initialiser les attributs de la classe.           */   

          public function __construct(int $nb_carburant, int $nb_portes, int $nb_roues = 4)             {                  $this->niveau_carburant = $nb_carburant;                  $this->nombre_portes = $nb_portes;                  $this->nombre_roues = $nb_roues;             }      } ?>Maintenant, on instancie la classe :

<?php      $voiture = new Voiture(50, 3); 

     echo $voiture->nombre_portes; //va afficher "3" car l'attribut est en accès public

     echo $voiture->nombre_roues; //Erreur, on ne peut pas y accéder car l'attribut est

157

Page 158: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

en accès privé ! ?>

Notez que l'on ne met pas de signe $ pour accéder ou définir des valeurs aux attributs d'une classe. Le mot-clé $this est un peu spécial et il désigne la classe courante.

L'héritage

L'héritage consiste à utiliser une classe parente et une ou plusieurs classes filles qui héritent des propriétés de la classe parente. Par exemple, si vous avez une classe Vehicule, vous pouvez avoir une classe Voiture qui hérite de certaines propriétés de la classe Vehicule, ainsi qu'une autre classe Moto qui va hériter de certaines propriétés de la classe Voiture tout en ajoutant des propriétés propres. Le mot utilisé pour dire à PHP qu'une classe hérite d'une autre est le mot-clé extends.

Prenons l'exemple d'une classe Vehicule :

<?php         class Vehicule      {              /**              * Déclaration des attributs              */    

          protected $prix; //On souhaite que les classes qui en héritent puissent y accéder    

          /**              * Cette méthode un peu spéciale est le constructeur, elle est exécutée lorsque vous "créez" votre objet. Elle doit initialiser les attributs de la classe.            */    

          public function __construct(int $prix_vehicule)              {                   $this->prix = $prix_vehicule;              }

          /**              * Cette méthode permet de modifier le prix du véhicule          */    

          public function modifier_prix;(int $nouveau_prix)              {                   $this->prix = $nouveau_prix;              }       }  ?>

Comme vous pouvez le constater, on a mis dans la classe Vehicule tout ce qui sera commun aux différents véhicules que nous allons pouvoir créer. Ici, j'ai mis un attribut "prix" car une voiture ou une moto ont toutes les deux un prix. On met donc tout ce que les véhicules ont en commun dans une même classe, et cette classe sera

158

Page 159: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

étendue par d'autres classes plus spécifiques. Voici maintenant une classe Voiture qui étend les propriétés de la classe Vehicule :

<?php          class Voiture extends Vehicule      {               /**               * Déclaration des attributs               */     

          private $climatisation; 

          /**               * Constructeur de la classe Voiture           */     

          public function __construct(int $prix_vehicule, bool $clim)               {                parent::__construct($prix_vehicule); //On appelle le constructeur de la classe Vehicule en lui fournissant le prix                $this->climatisation = $clim;           }        }   ?>

Voici ce que ça donne au niveau de l'instanciation :

<?php       $voiture = new Voiture(17000, TRUE); //On crée une voiture valant 17000 euros et ayant la climatisation 

     $voiture->modifier_prix(15000); //On peut modifier le prix de la voiture ?>

Comme vous pouvez le constater, on peut accéder à la classe parente comme si on accédait à la classe Voiture (avec la méthodemodifier_prix()). Si vous aviez mis la méthode modifier_prix() en accès privé, vous n'auriez pu effectuer la modification directement. Le niveau de protection le plus restrictif permettant cette modification est le niveau protected.Ceci marque la fin du cours sur ce chapitre, qui est vraiment très loin d'être exhaustif. Je vous conseille d'aller lire la documentation de php.net pour avoir plus de précisions sur ce sujet qui mériterait bien plus qu'un chapitre.

159

Page 160: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP - Bases de données et PHPMyAdminIntroduction

Les bases de données sont des éléments très importants en PHP. On les utilise pour stocker des données. Leur gros avantage est que via un langage dédié, on va pouvoir récupérer les données stockées très rapidement, faire de nombreuses opérations dessus, tout ça en un temps record !

Par exemple, le forum informatique de ce site repose entièrement sur l'utilisation d'une base de données qui contient les messages, les sujets, etc ...On abrège souvent "base de données" par BDD, donc si vous me voyez écrire cela plus loin, ne vous posez pas de questions ;) On appelle SGBD un système de gestion de base de données. L'avantage du SGBD est que pour aller chercher vos données, vous ne vous préoccupez pas de savoir où sont stockées les données ni comment, vous dites "Je veux telle donnée" et le SGBD va la chercher pour vous. Vous pourrez également récupérer des données d'une manière très compliquée qui dépendent d'énormément de facteurs, chose quasi impossible en stockant les données dans un fichier sans de nombreux calculs très lourds. Le langage que l'on utilise pour interroger et effectuer des opérations sur une ou plusieurs bases de données/tables s'appelle le SQL.

Pour tout ce qui suit, nous allons utiliser un SGBD appelé MySQL. Il s'agit du SQBD le plus répandu, vous ne devriez donc pas avoir de problème à faire fonctionner votre site ultérieurement. Cependant, PHP supporte d'autres SGBD dont voici une liste non exhaustive :

mSQL Sybase MySQL Oracle Unix dbm Informix SQL Server PostgreSQL.

Les tables

Une base de données contient des tables. Faisons une analogie : Vous avez un bureau qui représente la base de données. Sur ce bureau vous avez des dossiers, ce sont les tables. Ces dossiers contiennent des documents, pour nous les données.

160

Page 161: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Une table contient des champs. Chaque champ va pouvoir recevoir un type de données bien précis. On ne stocke pas un numéro de sécurité sociale avec le même type que le nom et le prénom. On peut représenter une table sous la forme d'un tableau :

Ici, nous avons trois champs : id_cat : c'est un numéro destiné à distinguer toutes les catégories. Plus tard, on

verra qu'il s'agit aussi d'une question d'optimisation. On n'utilise pas le champ "nom" pour distinguer les catégories, mais un champ numérique, qui sera bien plus rapide à traiter pour MySQL.

nom : Il s'agit d'un nom de catégorie description : il s'agit d'une description de notre catégorie

Chacune des données que vous allez stocker dans la table va remplir les champs, et une donnée correspond ici à une ligne du tableau. Par exemple pour stocker des articles on aurait pu prendre une liste de champs comme "numero, titre, texte" le tout formant la table "articles". Il est bien important de savoir qu'une table peut comporter un nombre infini de données (dans la limite de vos ressources matérielles bien entendu). Une base de données peut elle aussi comporter une infinité de tables.

PHPMyAdmin

PHPMyAdmin est une application PHP qui va vous permettre de gérer vos bases de données. Vous allez pouvoir créer des bases, des tables, etc... sans vous préoccuper du langage SQL qu'il faut écrire. Pour accéder à PHPMyAdmin, tapez dans votre navigateur l'adresse suivante :http://localhost/phpmyadminSi vous avez installé EasyPHP, tapez ceci : http://localhost/mysql/ (le / de fin est important)Si tout s'est bien passé, vous allez arriver devant un écran de ce style :

161

Page 162: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Vous allez maintenant pouvoir créer votre base de données. Pour l'exemple, nous allons créer une base de données intitulée actualites. Mettez donc actualites dans la case Créer une base de données et cliquez sur Créer. Ne vous préoccupez pas du champ interclassement.

La base de données a été créée. Comme vous pouvez le constater, le langage SQL que PHPMyAdmin a utilisé pour créer cette base est CREATE DATABASE actualitesIl s'agit de ce qu'on appelle une requête (My)SQL. Nous allons maintenant créer une table news qui va contenir des actualités pour notre site Web. Réfléchissez maintenant au nombre de champs que nous pourrions mettre. Tout d'abord, il faut pouvoir identifier chacune des actualités postées. Je vous ai dit plus haut qu'il fallait utiliser un champ de type numérique. On va le nommer id_news. Chaque news aura donc un id différent. Ensuite, il faut que l'on connaisse le titre de l'actualité, sa date de parution, l'auteur de la news et son texte. Cela nous fait donc 5 champs au total. Dans la case nom, indiquez news, dans la case nombre de champs, mettez 5, puis cliquez sur Exécuter.

162

Page 163: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Vous voici maintenant devant une liste de champs qu'il va falloir déterminer. Le premier champ sera notre champ id_news. Indiquez donc dans la première case id_news. Pour le type de champ, je vous laisse regarder cette page : types de champs MySQL. Après réflexion, vous pourrez avoir une quantité de news assez importante, on va donc utiliser un type SMALLINT avec comme attribut UNSIGNED. Vous pourrez donc stocker 65536 news. Je pense que c'est correct non ?Dans le champ extra indiquez autoincrement. Pourquoi ? car en fait, l'avantage de ce type de champ est que vous allez pouvoir ne pas vous préoccuper du numéro à ajouter, MySQL le fera pour vous. Quand vous ajouterez une news, vous n'aurez donc pas à aller récupérer le numéro maximum existant pour lui ajouter un et l'insérer dans la base. Sélectionnez ensuite la troisième option (icône avec un U), qui indique que ce champ sera un champ ayant une valeur unique (il s'agit également d'un INDEX qui va vous permettre d'accélérer les recherches sur la base, mais nous y viendrons plus tard).

Pour le second champ, il s'agit du titre de l'actualité. On peut donc nommer ce champ titre, et lui mettre un type VARCHAR (mettez 255 dans l'option "taille/valeurs").

Pour le troisième champ, il s'agit d'une date de parution. Vous connaissez ce qu'est un timestamp, nous n'allons pas utiliser ce type de champ car le timestamp de PHP et celui de MySQL sont différents. En revanche, nous allons utiliser un type INT avec l'attribut UNSIGNED, qui permettra de stocker des dates provenant de la fonction time() de PHP.

Pour le quatrième champ, nous allons utiliser le nom auteur, qui contiendra le pseudo du posteur de la news, avec le type VARCHAR et 20caractères dans la zone "taille/valeurs". Il faut savoir qu'il serait plus efficace de stocker un numéro correspondant à un numéro de membre, seulement nous n'avons pas de table membres et je ne vais donc pas vous compliquer la tâche pour ce premier exercice.

Le dernier champ sera de type TEXT et portera le nom de texte. Il servira à contenir le texte de la news.Choisissez dans la zone "moteur de stockage" l'option MyISAM. Je ne vous dis pas pourquoi, mais sachez que certains types de tables ne sont pas supportés chez certains hébergeurs, ce qui n'est pas le cas du type MyISAM. Ce n'est pas dramatique en soi car on peut changer de type de table via les options de PHPMyAdmin, mais les autres types offrent certaines spécificités que nous ne détaillerons pas ici et qui peuvent ne pas être adaptées. Une fois que tout est rempli, cliquez sur le bouton Sauvegarder.

Si tout va bien, PHPMyAdmin exécutera la requête suivante :

CREATE TABLE `news` (     `id_news` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT ,     `titre` VARCHAR( 255 ) NOT NULL,     `date` INT UNSIGNED NOT NULL ,     `auteur` VARCHAR( 20 ) NOT NULL ,     `texte` TEXT NOT NULL , UNIQUE ( `id_news` ) )ENGINE = MYISAM ;

Vous vous retrouvez devant cet écran :

163

Page 164: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Maintenant, nous allons insérer des données dans cette table news. Pour ce faire, remarquez les onglets présents en haut du cadre de droite :

Cliquez sur l'onglet Insérer. Vous obtenez à l'écran une représentation des différents champs avec des zones de texte pour vous permettre de les remplir :

Il va maintenant falloir remplir les champs. Voici ce que vous pouvez mettre :Tout d'abord dans le champ id_news, ne mettez rien, en effet on a dit que c'était un champ qui se remplissait automatiquement. Pour le titre, à vous de trouver un titre accrocheur :p. En ce qui concerne la date, faites dans un fichier PHP ceci :

<?php       echo time(); ?>

164

Page 165: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Notez la valeur obtenue et renseignez-la dans le champ date. Pour le champ auteur, indiquez votre pseudo. Mettez ensuite un texte dans la zone de texte correspondant au champ texte, ce sera le texte de la news. Cliquez ensuite sur Exécuter.

Voilà ce qu'a pu donner la requête :

INSERT INTO `news` ( `id_news` , `titre` , `date`, `auteur` , `texte` ) VALUES ( NULL , 'Bienvenue sur mon site !', '1166970760', 'Anthony', 'Ceci est ma première actualité !' );

Si vous souhaitez maintenant consulter les données présentes dans la table, vous pouvez cliquer sur l'onglet Afficher. Voici ce que vous obtenez (j'ai inséré une autre news entre temps pour vous montrer que l'on peut en mettre le nombre qu'on veut) :

J'espère que ce chapitre sur PHPMyAdmin et une introduction à MySQL vous ont permis de comprendre les concepts fondamentaux de ce qu'est une base de données, car pour le prochain chapitre, nous allons maintenant parler de requêtes, le tout mélangé avec du code PHP :p

165

Page 166: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

PHP et les requêtes MySQLIntroduction

Après avoir vu ce qu'était une base de données et découvert comment fonctionnait PHPMyAdmin dans le chapitre précédent, nous allons maintenant nous intéresser à la partie PHP, car n'oubliez pas que PHP va vous permettre de communiquer avec votre base de données. Dans ce chapitre, on utilisera toujours PHP pour communiquer avec MySQL, mais sachez qu'il est tout à fait possible d'entrer les requêtes à la main dans ce qu'on appelle une console (pour voir la console Windows, cliquez sur démarrer, Exécuter et tapez cmd).

Avant toute chose, il faut que vous sachiez qu'on ne fait pas directement une requête avec une fonction PHP. Il faut d'abord passer par plusieurs étapes. Un SGBD dispose ainsi de droits d'accès et peut comporter plusieurs bases. Il faut donc tout d'abord s'identifier au serveur MySQL que l'on souhaite utiliser. Une fois cette identification faite, il faut sélectionner la base sur laquelle on souhaite travailler. Et après ça, vous pourrez effectuer vos requêtes ! Voyons comment cela fonctionne.

Connexion au serveur MySQL

La première étape consiste à se connecter au serveur MySQL. Pour cela, on utilise la fonction mysql_connect() de PHP. Elle prend trois arguments:

L'adresse IP (ou l'alias pointant vers l'ip) du serveur MySQL Le nom d'utilisateur Le mot de passe

Ces trois paramètres vous sont fournis par votre hébergeur. Lorsque vous travaillez avec EasyPHP ou Wamp, les paramètres à utiliser sont : localhost root

et il n'y a pas de mot de passe à renseigner.

Voilà comment vous pouvez coder ça pour un usage local :

<?php       $connexion = mysql_connect('localhost', 'root', '') OR die('Erreur de connexion');      ?>

La partie OR die('Erreur de connexion') n'est pas indispensable, mais elle permet de couper le script si il n'a pas réussi à se connecter au serveur. Il est important pour une application sécurisée de bien gérer les erreurs que vous pouvez avoir à la connexion ou lors de la sélection de base de données (on va voir ça tout de suite)

166

Page 167: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Sélection de la base de données

Une fois que vous êtes connecté au serveur MySQL, sachant qu'il peut contenir une infinité de bases de données, il faut bien qu'il sâche sur laquelle vous souhaitez travailler. On utilise pour cela la fonction mysql_select_db() en PHP. Elle prend comme paramètre le nom de la base de données que vous souhaitez utiliser.Pour ceux qui ont suivi le chapitre précédent, j'avais utilisé une base actualites. Tous mes exemples vont donc s'appuyer sur cette base que nous avons créée ensemble.

Voici comment dire à PHP que nous allons travailler sur cette base :

<?php      mysql_select_db('actualites') OR die('Sélection de la base impossible'); ?>

Encore une fois, la partie OR die('Sélection de la base impossible') n'est pas indispensable mais conseillée.

Déconnexion du serveur MySQL

Il s'agit d'une étape très importante et trop souvent négligée dans de nombreux scripts. Il faut savoir que MySQL dispose d'un paramètre spécifiant le nombre maximum de connexions simultannées qu'il peut traiter. En local, vous n'aurez pratiquement jamais de problème avec ce paramètre (qui se manifeste par une erreur de Max user connections et vous empêche donc d'effectuer vos requêtes). En revanche, chez un hébergeur, ce paramètre est souvent placé à une valeur de 3 ou de 5 (5 étant préférable). Cela veut dire que 5 connexions pourront avoir lieu quasiment simultanément. Vous vous dites "c'est énorme, il n'y aura jamais personne en même temps qui pourra cliquer sur mon site". Le problème, est que la connexion est par défaut, si vous ne la fermez pas, active pendant toute la durée de génération de la page. Si vous ouvrez votre connexion tout en haut de la page et que le serveur met 1 seconde (ce qui est énorme) pour générer la page, votre connexion restera ouverte pendant une seconde. Vous imaginez qu'il devient alors très facile d'avoir 5 connexions à la même seconde pour peu que vous ayez un peu de visiteurs ou des scripts très lents. Il faut donc fermer la connexion le plus tôt possible, après avoir effectué la dernière requête, etAVANT TOUT TRAITEMENT.

Vous allez voir tout à l'heure que nous allons utiliser la fonction mysql_query() pour effectuer des requêtes MySQL, et bien voici un schéma qu'il faudrait adopter pour bénéficier d'une optimisation maximum :

<?php      $connexion = mysql_connect('localhost', 'root', '') OR die('Erreur de connexion');      mysql_select_db('actualites') OR die('Erreur de sélection de la base'); 

     $requete1 = mysql_query('....');      $requete2 = mysql_query('....');      //Ici vous placez vos autres requêtes      mysql_close(); //On ferme la connexion à MySQL 

167

Page 168: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     //Ici vous mettez le code PHP qui va aller récupérer les données provenant des requêtes (fonction mysql_fetch_row() par exemple) ?>

Comme vous pouvez le voir, on utilise la fonction mysql_close() pour fermer la connexion au serveur MySQL. Par défaut, elle ne prend pas de paramètre.

Lire des données dans une table

Avant de lire des données dans une table, il faut que votre table contienne des enregistrements. On va se servir toujours de la même table que précédemment, c'est à dire la table news. Vous pouvez y insérer quelques enregistrements via PHPMyAdmin, comme je vous l'ai déjà montré au chapitre précédent.Qu'il s'agisse d'une lecture, d'une écriture ou d'une modification de données ou de paramètres, il vous faudra passer par la fonction mysql_query(). Query signifie requête en anglais. C'est cette fonction qui va vous permettre d'interagir avec MySQL.

<?php      $requete = mysql_query('Ici votre requête SQL'); ?>

Le résultat de la requête sera retourné dans la variable $requete. Attention, il s'agit d'une variable de type resource. Vous ne pourrez donc pas faire un echo de cette variable, ça ne vous renverra pas ce que vous attendez. On va en reparler juste après ;)Voyons comment effectuer une requête de sélection de certains champs :En SQL, lorsque vous souhaitez sélectionner des données provenant d'une table, on utilise tout d'abord le mot SELECT, qui veut dire que vous vous apprêtez à récupérer des données. Ensuite, vous devez indiquer à MySQL la liste des champs de la table que vous souhaitez voir dans votre résultat, séparés par des virgules. Vous devez ensuite indiquer à quelle table vous souhaitez prendre les données via le mot clé FROM suivi du nom de la table

Si nous souhaitons récupérer les champs titre et texte de la table news, voici comment nous allons procéder :

<?php      $requete = mysql_query('SELECT titre, texte FROM news'); ?>

Bon c'est bien beau tout ça, mais comment fait-on pour récupérer le résultat d'une requête sous forme textuelle ? Et bien on utilise pour cela quatre fonctions de PHP (en fait on en utilise une parmis les quatre). Voilà les trois fonctions que vous pouvez utiliser : mysql_fetch_row() : cette fonction va retourner un tableau avec des indices

numériques (l'indice 0 correspond au premier champ de la requête, l'indice 1 au second champ ...). Je vous conseille d'utiliser cette fonction pour des tables dans lesquelles vous sélectionnez peu de champs (un ou deux), car c'est la fonction la plus rapide.

mysql_fetch_array() : cette fonction va retourner un tableau avec par défaut les indices numériques et associatifs. Elle est plus lente que mysql_fetch_row() mais

168

Page 169: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

plus simple d'utilisation. Pour la rendre plus rapide, on peut utiliser la fonction mysql_fetch_assoc() qui va uniquement retourner un tableau avec les indices associatifs.

mysql_fetch_object() : cette fonction retourne un objet qui aura pour attributs les champs de la requête MySQL.

Voyons voir ce que ça donne pour sélectionner tous les enregistrements de la table actualites, et les afficher :

<?php      mysql_connect('localhost', 'root', '') OR die('Erreur de connexion à la base');      mysql_select_db('actualites') OR die('Erreur de sélection de la base'); 

     $requete = mysql_query('SELECT titre, texte FROM news') OR die('Erreur de la requête MySQL'); 

     mysql_close(); 

     /**      * On récupère les données      * Tant qu'une ligne sera présente, la boucle continuera      */ 

     while($resultat = mysql_fetch_object($requete))      {           echo '<p>Titre : '.$resultat->titre.'. Texte : '.$resultat->texte.'</p>';      } ?> 

Avec la fonction mysql_fetch_row(), voici ce que ça aurait donné :

<?php       mysql_connect('localhost', 'root', '') OR die('Erreur de connexion à la base');       mysql_select_db('actualites') OR die('Erreur de sélection de la base');  

     $requete = mysql_query('SELECT titre, texte FROM news') OR die('Erreur de la requête MySQL');  

     mysql_close();  

     /**       * On récupère les données       * Tant qu'une ligne sera présente, la boucle continuera       */  

     while($resultat = mysql_fetch_row($requete))       {            echo '<p>Titre : '.$resultat[0].'. Texte : '.$resultat[1].'</p>';       }  ?>Et avec la fonction mysql_fetch_assoc() (équivalente à la fonction mysql_fetch_array() à laquelle on passe une constante en second paramètre : MYSQL_ASSOC) :<?php        mysql_connect('localhost', 'root', '') OR die('Erreur de connexion à la base');        mysql_select_db('actualites') OR die('Erreur de sélection de la base');   

169

Page 170: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     $requete = mysql_query('SELECT titre, texte FROM news') OR die('Erreur de la requête MySQL');   

     mysql_close();   

     /**        * On récupère les données        * Tant qu'une ligne sera présente, la boucle continuera        */   

     while($resultat = mysql_fetch_assoc($requete))  //équivalent à  while($resultat = mysql_fetch_array($requete, MYSQL_ASSOC))      {             echo '<p>Titre : '.$resultat['titre'].'. Texte : '.$resultat['texte'].'</p>';        }   ?>

Pour tout ce qui est insertion de données, je vous conseille de lire les requêtes MySQL associées dans ce cours : requêtes MySQL d'insertion de données. Le principe est le même, sauf que là on ne récupère aucun résultat.

Fonctions Descriptions

mysql_affected_rows() Retourne le nombre de rangée affectées par la dernière requête faite sur la base de données.

mysql_close() Ferme la connexion à une base de données.

mysql_connect()

Établit une connexion vers la base de données spécifiée dans les arguments. Si cette base se trouve sur un port différent, faites suivre le nom de la machine par (:) puis le numéro du port (ex. :8080). Cette connexion est automatiquement fermée à la fin de l'exécution du script sauf si une fonction mysql_close() intervient auparavant.

mysql_create_db() Permet de créer une nouvelle base de données.

mysql_data_seek()Déplace le pointeur interne de la rangée du résultat vers la rangée spécifiée. Utilisez cette fonction avec mysql_fetch_row() pour passer à la rangée spécifiée et récupérer les données.

mysql_db_query()Permet d'exécuter une requête SQL sur une ou plusieurs tables d'une base de données.Attention cette fonction est obsolète, ne l'utilisez plus, utilisez mysql_query !

mysql_drop_db() Permet de supprimer une base de données. Dans ce cas toutes les données sont perdues.

mysql_errno() Retourne le numéro de l'erreur générée lors de la dernière action sur la base de donnée.

170

Page 171: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

mysql_error() Retourne la description textuelle d'une erreur générée par la dernière action sur une base de données.

mysql_fetch_array()

Retourne un tableau qui représente tous les champs d'une rangée dans le résultat. Chaque appel récupère la prochaine rangée et ce jusqu'à ce qu'il n'y en ait plus. Chaque valeur de champ est stockée de deux façons: elle est indexée par un offset qui commence par '0', et indexée par le nom du champ.

mysql_fetch_assoc()Comme mysql_fetch_array() mais indexée uniquement par le nom du champ. Dans la plupart des cas, utiliser cette fonction ou mysql_fetch_row() de préférence à mysql_fetch_array().

mysql_fetch_field() Récupère l'information attachée à un champs du résultat. Ces champs sont numérotés à partir de zéro.

mysql_fetch_lengths() Retourne un tableau d'une longueur spécifiée pour chaque champ de résultat.

mysql_fetch_object()

Cette fonction est semblable à mysql_fetch_array() et à mysql_fetch_row(). Mais à la place, elle retourne un objet. Chaque champ du résultat correspond à une propriété dans l'objet renvoyé. Chaque appel à mysql_fetch_object() retourne la rangée suivante, ouFalse s'il ne reste plus de rangée.

mysql_fetch_row()

Comme mysql_fetch_array() mais indexée uniquement par le numéro d'ordre du champ. C'est la méthode la plus rapide pour obtenir des résultats à partir d'une requête. Dans la plupart des cas, utiliser cette fonction ou mysql_fetch_assoc() de préférence à mysql_fetch_array().

mysql_field_flags() Permet d'obtenir une description des options rattachées au champs spécifié.

mysql_field_len() Retourne la longueur maximale du champ spécifié.

mysql_field_name() Retourne le nom d'une colonne. L'argument champ correspond à un offset numéroté à partir de zéro.

mysql_field_seek()Déplace le pointeur interne du champ vers le champs spécifié. Le prochain appel versmysql_field_seel() retournera l'information de ce champs.

mysql_field_table() Retourne le nom de la table pour le champ spécifié.

mysql_field_type() Retourne le type d'un champ particulier dans le résultat obtenu.

mysql_free_result() Libère la mémoire associée au résultat spécifié. Elle n'est toutefois

171

Page 172: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

pas strictement nécessaire, car cette mémoire est automatiquement vidée lorsqu'un script termine son exécution.

mysql_insert_id()Après l'insertion d'un nouvel enregistrement avec un champ auto_increment, la fonctionmysql_insert_id() retourne l'ID qui vient d'être affecté au nouvel enregistrement.

mysql_list_dbs()Interroge le serveur pour obtenir une liste de bases de données. Elle retourne un pointeur de résultat qui pourra être exploité avec mysql_fetch_row() et d'autres fonctions similaires.

mysql_list_fields()Retourne un pointeur de résultat correspondant à une requête sur une liste de champs pour la table spécifiée. Ce pointeur pourra être exploité par toutes les fonctions qui recherchent des rangées à partir d'un résultat. Notez que l'argument lien reste optionnel.

mysql_list_tables()Retourne le pointeur de résultat d'une liste de tables pour la base de données spécifiée. Ce pointeur pourra être exploité par toutes les fonctions qui recherchent des rangées à partir d'un résultat. Notez que l'argument lien reste optionnel.

mysql_num_fields() Retourne le nombre de champs dans un résultat.

mysql_num_rows() Retourne le nombre de rangées dans un résultat. Anciennement mysql_numrows()

mysql_pconnect()Cette fonction opère de la même manière que mysql_connect(), sauf que la connexion ne se referme pas à la fin de l'exécution du script sauf si un mysql_close() se trouve en fin de script.

mysql_query()

Permet d'exécuter une requête SQL sur une ou plusieurs tables d'une base de données. Si la requête exécute une instruction: INSERT, DELETE ou UPDATE, une valeur booléenne sera retournée (0 ou 1). Dans le cas d'une requête de type SELECT, vous obtiendrez un identifiant de résultat.

mysql_result()

Retourne la valeur du champ spécifié dans la rangée concernée. L'argument champ peut être un numéro et, dans ce cas, il sera considéré comme un champ offset. Il peut également désigner le nom de la colonne, avec éventuellement celui de la table. Enfin, il peut également renvoyer à un alias.

mysql_select_db() Sélectionne la base de données par défaut.

Syntaxe SQL pour créer la table : clients_tbl

172

Page 173: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

CREATE TABLE clients_tbl (id INT not null AUTO_INCREMENT, prenom VARCHAR (50) not null , nom VARCHAR (50) not null , ne_le DATE not null , ville VARCHAR (90) not null , enfants INT not null , PRIMARY KEY (id))

Cas pratiques :

<?php $db = mysql_connect('sql.free.fr', 'login', 'password');  // 1 mysql_select_db('nom_de_la_base',$db);                    // 2 $req = mysql_query('SELECT * FROM clients_tbl');          // 3 $res = mysql_num_rows($req);                               // 4 

echo 'Il y a '.$res.' enregistrement(s) dans la table Clients.';  // 5 

mysql_close($db);  // 6 ?>

Explication du code ci-dessus :

1. On se connecte à la base de données :Host : Par exemple "sql.free.fr", vous pouvez également utiliser "localhost" par défaut.Login : Ensuite vous devez mettre le "login" pour accéder à la base (chez les hébergeurs gratuits c'est souvent le même login que l'accès FTP).Password : Et pour finir le "mot de passe", là aussi il s'agit très souvent du même password que l'accès FTP.

2. On sélectionne la base de données, en effet je vous rappelle que MySQL est un serveur de bases de données, donc il peut contenir plusieurs bases. Bien sûr dans votre cas si vous êtes chez un hébergeur gratuit, vous n'avez en général droit qu'à une seule base, mais MySQL ne le sait pas ;), il faut donc lui spécifier sur quelle base vous souhaitez vous connecter.Notez : Chez Free.fr et Nexen le nom de la base est souvent le même que le login de connection.

3. La fonction mysql_query() permet de passer une requête SQL vers la base de données, c'est évidement l'un des attraits intéressants de PHP (notez que nous initialisons au passage la variable $req qui contient la requête).

4. La fonction mysql_num_rows() permet de compter le nombre d'enregistrements que retourne la requête "$req" dans notre cas : 5 puisqu'il s'agit d'un simple "select " sur la table sans aucune condition, nous initialisons donc une variable $res qui contient : 5.

173

Page 174: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

5. Il ne reste plus qu'à afficher le nombre de résultats avec un echo() de $res.

6. Et pour finir on referme la connexion - ouverte avec mysql_connect - avec la fonction mysql_close(). Cette fonction n'est pas vraiment obligatoire avec un mysql_connect(), car par défaut la connexion sera coupée automatiquement à la fin de l'exécution du script.

Requête SQL : CREATE TABLE famille_tbl ( id int(11) NOT NULL auto_increment, nom varchar(255) NOT NULL, prenom varchar(255) NOT NULL, statut varchar(255) NOT NULL, date date DEFAULT '0000-00-00' NOT NULL, PRIMARY KEY (id), KEY id (id), UNIQUE id_2 (id) );

INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Grégoire', 'Grand-père', '1932-05-17');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Germaine', 'Grand-mère', '1939-02-15');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Gérard', 'Père', '1959-12-22');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Marie', 'Mère', '1961-03-02');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Julien', 'Fils', '1985-05-17');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Manon', 'Fille', '1990-11-29');

Affichage des résultats tels qu'ils sont dans la table sans condition.

<?php // on se connecte à MySQL $db = mysql_connect('localhost', 'login', 'password'); 

// on sélectionne la base mysql_select_db('nom_de_la_base',$db); 

// on crée la requête SQL $sql = 'SELECT nom,prenom,statut,date FROM famille_tbl'; 

// on envoie la requête $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 

// on fait une boucle qui va faire un tour pour chaque enregistrement while($data = mysql_fetch_assoc($req))     {     // on affiche les informations de l'enregistrement en cours     echo '<b>'.$data['nom'].' '.$data['prenom'].'</b> ('.$data['statut'].')';     echo ' <i>date de naissance : '.$data['date'].'</i><br>';     } 

// on ferme la connexion à mysql 

174

Page 175: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

mysql_close(); ?> 

Explication :

Voici donc notre première boucle sur une table, champagne ! :). Plus sérieusement, vous vous apercevez que les résultats qui s'affichent sont exactement dans le même ordre que la table et pour cause, nous n'avons pas spécifié de condition dans notre requête (2), donc dans ce cas, la requête scanne la table de haut en bas.

Remarquez que la fonction mysql_fetch_assoc() renvoie un tableau dont les clés sont les noms des champs sélectionnés. On a aussi rajouté après mysql_query() ceci: or die('Erreur SQL !<br>' .$sql. '<br>'. mysql_error()); . Cela veut dire qu'en cas d'erreur dans la requete vers mysql, ce qui arrive fréquemment, php va afficher un message indiquant l'erreur renvoyée par mysql (grace à mysql_error()) ce qui fournit une aide précieuse pour comprendre le problème.

Affichage des résultats par ordre alphabétique de prénom.

<?php // Gardez le code ci-dessus, changez juste la requête SQL !   $sql = 'SELECT nom,prenom,statut,date FROM famille_tbl ORDER BY prenom'; 

// L'opérateur ORDER BY permet de classer soit alphabétiquement // soit numériquement suivant le type du champ. 

// Si l'on souhaite classer en décroissant (ex. de Z à A), nous // y ajouterons DESC soit : ORDER BY prenom DESC ?> 

Affichage des résultats par comparaison de date.

<?php // Gardez le code ci-dessus, changez juste la requête !   $sql = "SELECT nom,prenom,statut FROM famille_tbl WHERE date<'1960-01-01'"; 

// L'avantage d'avoir un type DATE dans notre base de données, c'est que // nous pouvons comparer des dates dans la requête SQL. // Ici nous ne souhaitons afficher que les membres de la famille qui sont // nés avant le 1er janvier 1960, soit : WHERE date<'1960-01-01' 

?>

Affichage des résultats avec le commande LIKE.

<?php // Gardez le code ci-dessus, changez juste la requête !   $sql = "SELECT nom,prenom,statut,date FROM famille_tbl WHERE prenom LIKE 'G%'"; 

175

Page 176: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

// Le signe pourcentage "%" placé après le G, indique que la lettre G peut // être suivie, mais pas précédée, d'autres caractères ! // Notez aussi que LIKE n'est pas sensible à la casse, cela veut dire que // la requête cherchera aussi bien des G majuscules que minuscules. 

?> 

<?php // Gardez le code ci-dessus, changez juste la requête !   $sql = "SELECT * FROM famille_tbl WHERE prenom LIKE '%MA%'"; 

// Le signe pourcentage "%" placé avant et après MA indique que la syllabe // peut-être précédée ou suivie de caractères. // Une fois de plus notez que LIKE n'est pas sensible à la casse, la requête // cherchera aussi bien des MA majuscules que des ma en minuscules. 

?> 

Pour terminer voici comment vous allez pouvoir convertir la date du format US au format FR, une fois que vous avez récupéré l'information depuis la table. Nous vous donnons deux façons de faire, la deuxième est bien meilleure !

<?php  // on se connecte à MySQL $db = mysql_connect('localhost', 'login', 'password');  

// on sélectionne la base mysql_select_db('nom_de_la_base',$db);  

// on crée la requete SQL $sql = 'SELECT nom,prenom,statut,date FROM famille_tbl';  

// on envoie la requête $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());  

// on fait une boucle qui va faire un tour pour chaque enregistrement while($data = mysql_fetch_array($req))      {     $a = substr($data['date'], 0, 4);     // conversion     $m = substr($data['date'], 5, 2);     // de la date     $j = substr($data['date'], 8, 2);     // au format     $date = $j.'-'.$m.'-'.$a;             // Français            // on affiche les informations de l'enregistrement en cours     echo '<b>'.$data['nom'].' '.$data['prenom'].'</b> ('.$data['statut'].')';      echo ' <i>date de naissance : '.$date.'</i><br>';      }  

// on ferme la connexion à mysql 

176

Page 177: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

mysql_close();  ?> 

<?php  // on se connecte à MySQL $db = mysql_connect('localhost', 'login', 'password');  

// on seléctionne la base mysql_select_db('nom_de_la_base',$db);  

// on crée la requete SQL $sql = "SELECT nom,prenom,statut,DATE_FORMAT(date, '%d-%m-%Y') as datefr FROM famille_tbl";  

// on envoie la requête $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());  

// on fait une boucle qui va faire un tour pour chaque enregistrement while($data = mysql_fetch_array($req))      {     // on affiche les informations de l'enregistrement en cours     echo '<b>'.$data['nom'].' '.$data['prenom'].'</b> ('.$data['statut'].')';      echo ' <i>date de naissance : '.$data['datefr'].'</i><br>';      }  

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

Autres cas pratiques :

1) Créer un fichier PHP : connexion.php

<?php

# FileName="Connection_php_mysql.htm"

# Type="MYSQL"

# HTTP="true"

$hostname_MaConnexion = "localhost";

$database_MaConnexion = "php_dream";

$username_MaConnexion = "root";

$password_MaConnexion = "";

$MaConnexion = mysql_pconnect($hostname_MaConnexion, $username_MaConnexion, $password_MaConnexion) or trigger_error(mysql_error(),E_USER_ERROR);

177

Page 178: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

?>

2) Créer une page affichePeintres.php

<?php require_once('Connections/MaConnexion.php'); ?>

<?php

if (!function_exists("GetSQLValueString")) {

function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")

{

if (PHP_VERSION < 6) {

$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

}

$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

switch ($theType) {

case "text":

$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";

break;

case "long":

case "int":

$theValue = ($theValue != "") ? intval($theValue) : "NULL";

break;

case "double":

$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";

break;

case "date":

$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";

break;

178

Page 179: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

case "defined":

$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;

break;

}

return $theValue;

}

}

$maxRows_affichePeintre = 10;

$pageNum_affichePeintre = 0;

if (isset($_GET['pageNum_affichePeintre'])) {

$pageNum_affichePeintre = $_GET['pageNum_affichePeintre'];

}

$startRow_affichePeintre = $pageNum_affichePeintre * $maxRows_affichePeintre;

mysql_select_db($database_MaConnexion, $MaConnexion);

$query_affichePeintre = "SELECT nom, ville FROM utilisateurs ORDER BY nom ASC";

$query_limit_affichePeintre = sprintf("%s LIMIT %d, %d", $query_affichePeintre, $startRow_affichePeintre, $maxRows_affichePeintre);

$affichePeintre = mysql_query($query_limit_affichePeintre, $MaConnexion) or die(mysql_error());

$row_affichePeintre = mysql_fetch_assoc($affichePeintre);

if (isset($_GET['totalRows_affichePeintre'])) {

$totalRows_affichePeintre = $_GET['totalRows_affichePeintre'];

} else {

$all_affichePeintre = mysql_query($query_affichePeintre);

$totalRows_affichePeintre = mysql_num_rows($all_affichePeintre);

}

179

Page 180: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

$totalPages_affichePeintre = ceil($totalRows_affichePeintre/$maxRows_affichePeintre)-1;

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Document sans titre</title>

</head>

<body>

<table width="200" border="1">

<tr>

<td>Nom</td>

<td><?php echo $row_affichePeintre['nom']; ?></td>

</tr>

<tr>

<td>Ville</td>

<td><?php echo $row_affichePeintre['ville']; ?></td>

</tr>

</table>

<p>&nbsp;</p>

<p>&nbsp;</p>

<table border="1">

<tr>

<td>nom</td>

<td>ville</td>

</tr>

<?php do { ?>

<tr>

180

Page 181: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<td><?php echo $row_affichePeintre['nom']; ?></td>

<td><?php echo $row_affichePeintre['ville']; ?></td>

</tr>

<?php } while ($row_affichePeintre = mysql_fetch_assoc($affichePeintre)); ?>

</table>

<p>&nbsp;</p>

</body>

</html>

<?php

mysql_free_result($affichePeintre);

?>

3) Créer une page d’ajout d’enregistrement : ajoutPeintre.php

<?php require_once('Connections/MaConnexion.php'); ?>

<?php

if (!function_exists("GetSQLValueString")) {

function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")

{

if (PHP_VERSION < 6) {

$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

}

$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

switch ($theType) {

case "text":

$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";

break;

case "long":

181

Page 182: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

case "int":

$theValue = ($theValue != "") ? intval($theValue) : "NULL";

break;

case "double":

$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";

break;

case "date":

$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";

break;

case "defined":

$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;

break;

}

return $theValue;

}

}

$editFormAction = $_SERVER['PHP_SELF'];

if (isset($_SERVER['QUERY_STRING'])) {

$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);

}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {

$insertSQL = sprintf("INSERT INTO utilisateurs (nom, ville) VALUES (%s, %s)",

GetSQLValueString($_POST['nom'], "text"),

GetSQLValueString($_POST['ville'], "text"));

mysql_select_db($database_MaConnexion, $MaConnexion);

$Result1 = mysql_query($insertSQL, $MaConnexion) or die(mysql_error());

182

Page 183: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

$insertGoTo = "affichePeintres.php";

if (isset($_SERVER['QUERY_STRING'])) {

$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";

$insertGoTo .= $_SERVER['QUERY_STRING'];

}

header(sprintf("Location: %s", $insertGoTo));

}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Document sans titre</title>

</head>

<body>

<form action="<?php echo $editFormAction; ?>" method="post" name="form1" id="form1">

<table align="center">

<tr valign="baseline">

<td nowrap="nowrap" align="right">Nom:</td>

<td><input type="text" name="nom" value="" size="32" /></td>

</tr>

<tr valign="baseline">

<td nowrap="nowrap" align="right">Ville:</td>

<td><input type="text" name="ville" value="" size="32" /></td>

</tr>

<tr valign="baseline">

<td nowrap="nowrap" align="right">&nbsp;</td>

183

Page 184: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<td><input type="submit" value="Ins&eacute;rer un enregistrement" /></td>

</tr>

</table>

<input type="hidden" name="MM_insert" value="form1" />

</form>

<p>&nbsp;</p>

</body>

</html>

184

Page 185: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Optimiser phpPHP est un langage de programmation interprété, c'est à dire que le fichier texte contenant le code PHP est analysé puis traité directement (pas de code compilé). Nous allons voir comment améliorer les performances de vos scripts PHP pour tirer le maximum de performances.

Les différentes techniques d'optimisation que nous allons voir ici vous permettront : De générer vos pages plus rapidement pour le visiteur D'économiser des ressources serveur D'accueillir plus de visiteurs en même temps sur votre site De coder plus proprement, car optimisation rime souvent (pas toujours) avec

clarté et propreté.

Suite aux différentes remarques plus ou moins fondées que j'ai pu lire sur le net, je tiens à préciser que le début de cet article ne vous fera pas gagner un temps de génération énorme si votre page est mal codée et qu'il s'agit de micro-optimisations, ça ne remplace donc en AUCUN cas un algorithme optimisé et ce pour n'importe quelle page de votre site. Privilégiez donc une amélioration de vos algorithmes avant de finir par optimiser les quelques tournures qui pourraient vous faire perdre quelques millièmes de secondes supplémentaires.

Nous allons donc commencer par optimiser les quelques millisecondes que vous pourriez perdre par l'emploi de fonctions moins efficaces que d'autres. Tous les benchs qui vont suivre ont été effectués avec la version 5.2.4 de PHP, la dernière au moment où j'écris ces lignes. Ils consistent en l'exécution d'une boucle comptant un nombre n d'itérations (ce nombre n est précisé en face de chaque bench car les différences sont parfois tellement minimes qu'elles exigent un nombre d'itérations plus important afin que l'on puisse les constater). A l'intérieur de cette boucle se trouve le code pour lequel on teste les performances. A la fin du script, on décompte le nombre de secondes qu'il a nécessité pour s'exécuter et on compare donc les différents codes entre-eux. Les benchs ont été exécutés 5 fois de manière à prendre la valeur moyenne du temps de génération et limiter les erreurs. A l'attaque !

Les simples et doubles quotes :

Commençons avec un classique en PHP à savoir les simples et doubles quotes (guillemets). Elles tiennent leur différence principale dans le fait que tout ce qui se trouve à l'intérieur des guillemets simple n'est pas interprété, contrairement à ce qui se trouve à l'intérieur des guillemets doubles. En pratique le code suivant fait exactement la même chose :

<?php      echo 'Voici une chaîne de test'; ?> 

<?php      echo "Voici une chaîne de test"; ?>

Par contre le code suivant donnera deux résultats totalement différents :Version 1:

185

Page 186: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php      $mavariable = 'bonjour tout le monde';      echo 'Valeur de la variable : $mavariable';  ?>  Version 2:<?php      $mavariable = 'bonjour tout le monde';      echo "Valeur de la variable : $mavariable";  ?>

Résultats avec 200 itérations :

Lorsque vous utilisez la deuxième version de cet exemple, vous constatez que la chaîne $mavariable est remplacée par sa valeur, contrairement à ce qui se passe dans la première version de cet exemple. Or, remplacer $mavariable par sa valeur nécessite du temps supplémentaire pour PHP car il doit non seulement rechercher le nom exact de la variable mais ensuite la remplacer par sa valeur. C'est pourquoi il est plus rapide d'utiliser la version 1. Bien me direz-vous, mais comment faire si on souhaite afficher le contenu d'une variable ? et bien on va pouvoir utiliser la concaténation.

Reprenons notre code lent et optimisons-le :

Version 1:<?php      $mavariable = 'bonjour tout le monde';      echo "Valeur de la variable : $mavariable";  ?> Version 2:<?php       $mavariable = 'bonjour tout le monde';       echo 'Valeur de la variable : '.$mavariable;   ?>Version 3:<?php       $mavariable = 'bonjour tout le monde';  

186

Page 187: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     print 'Valeur de la variable : '.$mavariable;   ?>

Nous pouvons également (cf version 3) utiliser la fonction print. Elle a une différence avec echo cependant : elle renvoie toujours la valeur 1, ce qui fait que vous pouvez l'utiliser dans des conditions ou autre. En pratique, elle est supposée être plus lente.

Voici une comparaison des temps de génération, toujours avec 200 itérations :

On constate qu'il n'y a ici aucune différence moyenne entre print et echo (cependant attention, j'ai constaté que print pouvait être plus rapide que echo, mais c'est généralement l'inverse. La moyenne a lissé les résultats). Vous pouvez (et uniquement pour echo) remplacer le point de concaténation par une virgule. Ceci peut se révéler plus rapide (sur 200 itérations je n'ai pas obtenu de différences suffisantes toutefois). Cela vient du fait qu'il est souvent plus rapide de concaténer un petit bout de chaîne et de tout envoyer dans le même buffer que de fermer et réouvrir le buffer nécessaire à chaque fois que vous utilisez echo.

Voici en quoi cela consiste :

Concaténation avec le point :

<?php      $mavariable = 'bonjour tout le monde';       echo 'Valeur de la variable : '.$mavariable;   ?>"Concaténation" avec la virgule :<?php       $mavariable = 'bonjour tout le monde';       echo 'Valeur de la variable : ',$mavariable;   ?>

Après ce bref passage autour de la fonction print et de la structure de langage echo, attaquons-nous aux différentes manières de codage. Commençons par la déclaration (et l'initialisation) des variables. Il existe plusieurs moyens de le faire :Version 1:<?php       $mavariable; 

187

Page 188: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     $mavariable2; 

     $mavariable = 'valeur';      $mavariable2= 'valeur'; ?>Version 2:<?php      $mavariable;$mavariable2; 

     $mavariable = $mavariable2 = 'valeur'; ?>

Voyons laquelle des deux est la plus rapide (toujours sur 200 itérations) :

Contrairement à PHP4 où j'avais obtenu des résultats plus rapides pour la version 1, c'est ici la version 2 (plus logique) qui l'emporte d'une courte tête. Passons maintenant aux conditions.

Il existe trois manières de faire des conditions en PHP :

La condition if/else L'instruction Switch L'opérateur ternaire

Les trois permettent de faire la même chose avec plus ou moins de syntaxe. Voyons trois exemples qui font absolument la même chose mais codés de manière différente :Version 1:

<?php       $variable = 1;      $i = 0; 

     if($variable === 1)      {           $i++;      }      elseif($variable === 2) 

188

Page 189: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

     {           $i = 2;      }      else      {           $i = 3;      } ?>

Version 2:<?php      $variable = 1;      $i = 0; 

     switch($variable)      {         case 1:           $i++;         break;         case 2:           $i = 2;         break;         default:           $i = 3;         break;      } ?> 

Version 3:<?php      $variable = 1;      $i = 0; 

     ($variable === 1) ? $i++ : (($variable === 2) ? $i = 2 : $i=3); ?> 

La première version utilise l'opérateur classique en PHP, à savoir la condition if/else. La seconde version utilise un switch tandis que la dernière utilise ce qu'on appelle l'opérateur ternaire. Les trois solutions ont des avantages et inconvénients différents du point de vue maintenance notamment, mais nous ne sommes ici que pour juger de leurs performances !

Voici donc les résultats du test, effectué encore une fois sur 200 itérations :

189

Page 190: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Test encore une fois étonnant, car il est le contraire de ce que j'obtenais en PHP4. La solution la plus rapide est donc l'opérateur ternaire bien que sa lisibilité soit absolument affreuse !

Passons maintenant aux boucles, et plus précisément à l'utilisation de la fonction count() dans une boucle. Vous êtes nombreux à mettre uncount() dans une boucle for de manière à ce que cette boucle s'arrête une fois que la variable à incrémenter dépasse la valeur retournée par la fonction count(). Or, en général, vous travaillez sur un tableau de dimension fixe, c'est à dire que count() va retourner à chaque fois la même valeur. Lorsque vous faites un tour de boucle, la valeur du count() est donc recalculée pour rien ! Voici les deux codes dont je veux parler :

Version 1:

<?php     $w = 0;     $tableau = array('test', 'hop');     $n = count($tableau); 

    for($i = 0; $i < $n; $i++)     {             $w++;     } ?>

Version 2:

<?php     $w = 0;     $tableau = array('test', 'hop'); 

    for($i = 0; $i < count($tableau); $i++)     {             $w++;     } ?>

190

Page 191: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voici maintenant les résultats pratiques de 200 itérations :

Placer un count() dans une boucle est ici deux fois plus lent ! On privilégiera donc la première solution. Dans le même genre de chose, voyons voir l'impact que peut avoir d'utiliser une boucle for ou une boucle while :

Version 1:<?php     $i=0;     while($i < 50)     {         $i++;     } ?> 

Version 2:<?php    for($i = 0; $i < 50; $i++)    { 

   } ?> 

Comparons maintenant les résultats de ces deux codes réalisant la même fonction (attention, en cas de code plus complexe, le for peut s'avérer bien utile car il accepte des conditions supplémentaires), toujours sur 200 itérations :

191

Page 192: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

 

Comme on peut le constater, le while est légèrement plus rapide.Ouverture d'un fichier :

Il y a beaucoup de fonctions permettant en PHP d'ouvrir un fichier pour lire son contenu. Nous allons tester trois fonctions qui ouvriront un fichier contenant une quinzaine de lignes. Voici les trois fonctions utilisées : file_get_contents() file() fopen() suivi de fread() pour récupérer les données et fclose pour fermer le

handle.

Voici les codes utilisés :

Version 1:<?php   $fichier=file_get_contents('bench.txt'); ?> 

Version 2:<?php    $fichier=file('bench.txt'); ?>

Version 3:<?php    $fp = fopen('bench.txt', 'r');    $fichier = fread($fp, filesize('bench.txt'));    fclose($fp); ?> 

Nous utiliserons toujours une boucle de 200 itérations. Voici les résultats (sans appel) : la fonction fopen() est de loin la plus efficace. La fonction file() nécessite la création d'un tableau et est de ce fait plus lente, de peu devant la fonction file_get_contents() qui malgré sa simplification n'est pas plus rapide.

192

Page 193: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Voyons un peu maintenant deux méthodes pour concaténer une valeur à une variable chaîne. Imaginions que vous ayez une variable contenant la valeur bonjour et que vous souhaitiez qu'elle contienne la valeur bonjour tout le monde. On peut utiliser trois méthodes, l'une d'entre-elles est cependant inintéressante puisqu'elle consiste à réassigner entièrement la nouvelle valeur à la variable :

<?php    $variable = 'bonjour';    $variable = 'bonjour tout le monde'; ?>

Nous n'allons donc pas l'utiliser. Voyons maintenant deux autres méthodes utilisant la concaténation ou la recopie de valeur :

Version 1:<?php    $variable = 'bonjour';    $variable = $variable.' tout le monde'; ?>

Version 2:<?php    $variable  = 'bonjour';    $variable .= ' tout le monde'; ?>

Voyons maintenant le résultat des tests effectués encore et toujours avec une boucle de 200 itérations :

193

Page 194: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

 

La concaténation l'emporte de peu, mais elle marque un net avantage en fonction de la longueur de la chaîne initiale. Plus la chaîne initiale est longue, plus la concaténation l'emporte aisément sur la recopie.Remplacement d'une expression dans une chaîne :

Il existe de multiples façons en PHP de remplacer une portion de chaîne par une autre valeur. Voici les deux fonctions principalement utilisées pour cela : preg_replace() str_replace()

Sachez qu'il est plus rapide d'utiliser str_replace() que preg_replace(), car str_replace() ne prend qu'une chaîne fixe en paramètre, contrairement à preg_replace() qui utilise les expressions régulières. Bien sûr dans le cas où vous souhaitez remplacer une chaîne selon une condition bien précise, la fonction str_replace() n'est généralement pas assez puissante et il vous faudra recourir à la fonctionpreg_replace().

Parcours d'un tableau :Préférez l'utilisation de la fonction foreach() à la place de l'utilisation du couple while(list() = each()). Nous allons pour le prouver remplir un tableau de 1000 valeurs aléatoires, puis nous allons parcourir ce tableau 200 fois des deux façons que je viens de mentionner. Voici les codes utilisés :Version 1:<?php    $w = 0;    foreach($tableau AS $cle => $valeur)    {        $w++;    } ?>Version 2:<?php    $w = 0;    while(list($cle, $valeur) = each($tableau))    {        $w++; 

194

Page 195: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

   } ?>

Voici les résultats obtenus :

 

Le while() combiné au list() est plus rapide que la fonction foreach().

Après toutes ces micro optimisations, nous allons maintenant parler d'autres méthodes pour optimiser vos scripts PHP de manière à améliorer cette fois-ci de manière conséquente les performances. Ces modifications sont plutôt orientées algorithmes ou bases de données. Pour consulter quelques règles d'optimisation de MySQL, vous pouvez consulter ce lien : Optimiser MySQL.

En PHP, il existe de nombreuses solutions destinées à simplifier la tâche des designers et développeurs. Elles peuvent non seulement leur faciliter la tâche, mais également accélérer le temps de génération de vos scripts si elles sont bien utilisées. On peut parler notamment des moteurs de templates, dont vous trouverez une version conçue par mes soins ici (en PHP5) : Moteur de templates PHP. Grâce à l'utilisation de ce genre de sources, vous disposerez la plupart du temps d'un mode "cache". Cacher les informations consiste à les enregistrer dans un fichier ou une base de données de manière à réduire les traitements nécessaires pour afficher les données la prochaine fois. Par exemple, lorsque vous affichez la liste de vos actualités, vous savez qu'elle ne sera pas mise à jour toutes les minutes, il est donc inutile de redemander à la base tout le contenu des actualités et d'effectuer des traitements dessus à chaque fois qu'un visiteur clique sur la page. Vous pouvez récupérer une bonne fois pour toutes cette liste, la mettre en cache (dans un fichier texte par exemple) et la réutiliser ensuite au lieu de faire appel à la base de données. Ce genre d'astuce peut très facilement diminuer de 50 % le temps de génération de vos pages et consommera moins de ressourcesCPU (au mépris parfois de la quantité de mémoire vive consommée). Ces scripts et méthodes d'optimisation prennent toute leur importance dès lors que vous avez un site web un minimum visité. Si vous avez dix visiteurs journaliers et que vos traitements ne sont pas trop lourds, il est inutile de mettre en place un système de cache, mais qui peut le plus peut le moins comme on dit !

195

Page 196: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

L'upload de fichier (sécurisé)Les formulaires d'upload sont de plus en plus répandus sur un site Web. PHP permet de gérer l'upload très simplement. Il faudra par contre sécuriser cet upload pour éviter aux gens mal intentionnés d'envoyer du code PHP (par exemple dans un formulaire d'upload d'avatar, nous souhaitons recevoir une image...), c'est aussi ce que nous verrons plus loin dans cet article.

Un formulaire d'upload en XHTML :

Un formulaire d'upload contient obligatoirement un champ de type file qui dispose d'un bouton parcourir pour que vous puissiez envoyer votre fichier. Voici un exemple de formulaire basique que nous utiliserons pour tous les exemples présents dans cet article :

<form action="upload.php" method="post" enctype="multipart/form-data"><p><input type="file" name="fichier_source" /><input type="submit" value="Envoyer" /></p></form>

Ce formulaire va nous permettre d'envoyer à notre page upload.php toute sorte de fichiers que nous analyserons ensuite.

La variable superglobale $_FILES :La variable superglobale $_FILES vous permet d'avoir pleins d'informations sur le fichier envoyé. Attention cependant : ces informations sont fournies par le navigateur Web, elles peuvent donc être manipulées. Attention aux failles de sécurité (notamment pour le type mime du fichier). Nous utiliserons pour tous nos exemples le nom de champ fichier_source dans notre formulaire XHTML.

Vous devez donc remplacer dans PHP fichier_source par le nom de votre champ file.

$_FILES['fichier_source']['name'] : renvoit le nom du fichier stocké sur la machine du client qui envoit le fichier.

$_FILES['fichier_source']['tmp_name'] : renvoit le nom du fichier stocké sur le serveur (le fichier a donc été reçu).

$_FILES['fichier_source']['type'] : renvoit le type mime du fichier envoyé. Attention aux failles de sécurité.

$_FILES['fichier_source']['size'] : renvoit la taille du fichier en octets. $_FILES['fichier_source']['error'] : renvoit éventuellement un code d'erreur

pendant le transfert.

Se préparer à la réception du fichier :Nous devons en cas de réception d'un fichier utiliser PHP pour le traiter.

Affichons un exemple simple pour savoir si le formulaire a été envoyé :

<?phpif(!empty($_FILES['fichier_source']['tmp_name'])){//Un fichier a été envoyé, nous pouvons le traiter}?>Savoir si le fichier a été uploadé correctement :

196

Page 197: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Pour éviter les erreurs futures, il est utile de savoir si le fichier a été uploadé correctement. On utilise pour cela la fonctionis_uploaded_file().

Exemple :

<?phpif(is_uploaded_file($_FILES['fichier_source']['tmp_name'])){//C'est bon}?>Copier un fichier uploadé sur le serveur dans un répertoire de destination :On utilise pour déplacer le fichier uploadé du répertoire temporaire vers le répertoire de destination la fonction move_uploaded_file().

Exemple :

<?phpif(is_uploaded_file($_FILES['fichier_source']['tmp_name'])){move_uploaded_file($_FILES['fichier_source']['tmp_name'],'repertoire/image.jpg'); //L'image est copiée sous le nom 'image.jpg' dans le répertoire 'repertoire'}?>

Les bases acquises maintenant vont nous permettre de les mettre en pratique avec un exemple qui va consister à recevoir une image (par upload). Cette image doit être de type jpeg obligatoirement (toutes les extensions de fichiers sont acceptées), sa taille ne doit pas excéder 50 Ko. Nous l'enregistrerons sous le nom image.jpeg.

Nous allons tout d'abord reprendre le code XHTML du formulaire de départ :

<form action="upload.php" method="post" enctype="multipart/form-data"><p><input type="file" name="fichier_source" /><input type="submit" value="Envoyer" /></p></form>

Passons ensuite au code PHP de la page upload.php :

<?phpif(!empty($_FILES['fichier_source']['tmp_name']) AND is_uploaded_file($_FILES['fichier_source']['tmp_name'])){

//On va vérifier la taille du fichier en ne passant pas par $_FILES['fichier_source']['size'] pour éviter les failles de sécuritéif(filesize($_FILES['fichier_source']['tmp_name'])<51200){

//On vérifie maintenant le type de l'image à l'aide de la fonction getimagesize()list($largeur, $hauteur, $type, $attr)=getimagesize($_FILES['fichier_source']['tmp_name']);

//Si le Type est JPEG (correspond au chiffre 2) on copie l'imageif($type===2){

197

Page 198: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

//Copie le fichier dans le répertoire de destinationif(move_uploaded_file($_FILES['fichier_source']['tmp_name'], 'repertoire/image.jpg')){//Le fichier a été uploadé correctementecho 'Ok, fichier envoyé correctement';}else{//Erreurecho 'Erreur lors de la copie du fichier';}

}}

}?>

Cet exemple est sécurisé contre les attaques par changement de type de fichier, les extensions n'influençent en rien ce script et la modification des en-têtes HTTP non plus. Il faut par contre faire attention aux noms de fichiers locaux pouvant contenir des caractères spéciaux. Je vous conseille d'utiliser pour cela les expressions régulières.

198

Page 199: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Traiter les exceptions PDOPDO est une couche d'abstraction permettant d'accéder à de nombreuses bases de données depuis PHP. Elle remplace les antédiluviennes fonctions mysql_(), pgsql_() etc. Utiliser PDO offre de meilleures performances et fonctionnalités. De plus, c'est la seule méthode valable qui sera intégrée nativement dans les futures versions de PHP.

PDO génère des erreurs appelées exceptions. Une exception est un message que l'on peut lancer puis attraper, et en faire ensuite ce que l'on veut, comme dans tout langage de programmation qui se respecte.Ces exceptions sont bien souvent mal rédigées, et il est difficile de s'y retrouver, c'est pourquoi j'ai essayé de lister l'ensemble des erreurs que vous pourrez trouver avec PDO ici. Elles commencent toutes par PDOException.

Installer PDO

Dans les versions supérieures ou égales à la 5.3 de PHP, PDO est intégré nativement. Vous n'aurez plus besoin de faire ces fastidieuses manipulations.

Sous Linux

Sous Linux, prenons le cas de Debian, vous devrez exécuter les commandes suivantes : apt-get install pdo.

~# apt-get install pdo

Ouvrez ensuite le fichier php.ini (situé généralement dans le répertoire /etc/php5/apache2/php.ini) puis ajoutez la ligneextension=pdo.so. CTRL+X et ensuite appuyez sur la touche Y (ou O en français) pour sauvegarder.

~# nano /etc/php5/apache2/php.ini

Pour installer ensuite les différents drivers PDO, vous pourrez utiliser la commande suivante (Exemple pour MySQL) : apt-get install pdo_mysql.

~# apt-get install pdo_mysql

Relancez ensuite Apache : /etc/init.d/apache2 restart.

~# /etc/init.d/apache2 restart

Sous Windows

199

Page 200: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Avec un utilitaire tel que WAMP, PDO est déjà inclus dans les dernières versions de PHP. Vous n'avez plus qu'à activer le ou les drivers dont vous avez besoin (voir plus bas). Si vous ne disposez pas d'un tel utilitaire, vous devrez décommenter dans le php.ini la ligne;extension=php_pdo.dll.

Could not find driver

Cette erreur se produit lorsque vous tentez de vous connecter à une base dont le type est encore inconnu par PDO. Cela signifie que le drivernécessaire n'est pas installé, et que PDO ne peut donc pas contrôler ce type de base.

Pour résoudre ce problème, vous devez installer puis activer les extensions manquantes dans le fichier php.ini :

L'extension php_pdo_mysql pour contrôler les bases de données MySQL L'extension php_pdo_pgsql pour contrôler les bases de données PostgreSQL L'extension php_pdo_mssql pour contrôler les bases de données SQL Server L'extension php_pdo_sqlite pour contrôler les bases de données SQLite

Could not find driverSous Windows, repérez les différentes lignes ;extension=php_pdo_X.dll et enlevez le point-virgule se trouvant devant pour les décommenter, et relancez votre serveur Apache.

Sous Linux, repérez les différentes lignes extension=pdo_X.so et enlevez le point-

SQLSTATE[HY000] [1045] Access denied for user ...

Cette erreur survient lorsque le login ou/et le mot de passe utilisés pour vous connecter au serveur sont faux. Exemple de code utilisé pour se connecter à une base MySQL nommée test, sur le serveur localhost, avec PDO :

<?php    $db = new PDO('mysql:host=localhost;dbname=test', 'login', 'passe');?>

200

Page 201: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Dans le cas où l'utilisateur login n'existe pas, ou alors si son mot de passe est différent de passe, le code ci-dessus ne fonctionnera pas et renverra une Exception PDOException.

Access denied for user ...@...

Pour corriger cette erreur, vous devez indiquer un hôte, un login et un mot de passe valides.

SQLSTATE[HY000] [1049] Unknown database ...

Cette erreur survient lorsque la base de données à laquelle vous tentez de vous connecter n'existe pas. Prenons l'exemple suivant où je tente de me connecter à une base MySQL avec PDO. Cette base mabasequinexistepas n'existe pas (comme son nom l'indique).

<?php    $db = new PDO('mysql:host=localhost;dbname=mabasequinexistepas', 'root', '');?>

L'erreur renvoyée sous forme d'exception par PDO sera la suivante :

Unknown database 'mabasequinexistepas'

201

Page 202: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Bufferisation de sortieLa bufferisation de sortie permet d'envoyer les données au navigateur à un moment précis. Elle permet également d'éviter l'erreur des headers already sent et est donc très utile

La fonction ob_start() :

Cette fonction permet d'enclencher la mise en buffer de tout le code html qui sera généré par PHP. La fonction ob_end_flush() permet d'envoyer le contenu du buffer au navigateur.

Exemple :

<?phpob_start();//Votre code PHPob_end_flush();?>

La fonction ob_start() peut également prendre une fonction comme paramètre, cette fonction sera appelée lorsque vous enverrez le buffer à l'aide de la fonction ob_end_flush().

Exemple :

<?phpob_start('fonction_ici');

function fonction_ici($output_buffer){return $output_buffer.'Fin de la page';}

//Votre code PHPob_end_flush();?>

Ici, notre exemple rajoutera à la fin de la page la mention 'Fin de la page'. Cette possibilité peut être très utile pour rajouter des mentions en bas de page sans faire d'include spécifique et sans utiliser la fonction ob_get_contents().

La fonction ob_end_flush() :

Cette fonction envoit les données contenues dans le buffer de sortie et détruit ensuite le contenu du buffer.

La fonction ob_flush() :

Cette fonction envoit les données contenues dans le buffer de sortie.

La fonction ob_clean() :

Cette fonction permet d'effacer le buffer de sortie.

202

Page 203: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

La fonction ob_get_clean() :

Cette fonction lit le contenu du buffer de sortie puis l'efface.

La fonction ob_get_contents() :

Cette fonction retourne le contenu du buffer.

Exemple :

<?phpob_start();echo 'test';$buffer=ob_get_contents(); //La variable $buffer contiendra la valeur 'test'ob_end_flush();?>

La fonction ob_get_length() :

Cette fonction retourne la taille en octets du buffer de sortie.

La fonction ob_gzhandler() :

Cette fonction permet d'être placée à la place de la fonction ob_start(). Elle permet si le serveur le supporte de compresser les pages web pour accélérer le temps de téléchargement pour le visiteur et gaspiller moins de trafic. Malheureusement cette option est souvent désactivée sur la plupart des hébergeurs. Vous pouvez toutefois utiliser cette option qui ne génèrera pas d'erreur, même si la compression n'est pas utilisable sur le serveur web.

203

Page 204: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Failles PHP à éviterLa sécurisation de scripts PHP est une étape importante à prendre en compte lors de toute conception de site ou de script, simple ou complexe.PHP permet déjà si on le configure correctement d'éliminer pas mal de problèmes de sécurité (on parlera à ce sujet notamment desregister_globals). Nous traiterons ensuite quelques exemples pratiques couramment employés dans certains sites web et qu'il ne faut surtout pas faire. Enfin nous parlerons de quelques techniques de dissimulation (Url Rewriting, Force download), pour dissimuler des URL et des fichiers.

Les register_globals :

PHP est enfin configuré avec le paramètre register_globals à off par défaut. Vous pouvez désactiver les register_globals via le fichierphp.ini, recherchez la ligne register_globals et attribuez-lui la valeur Off. Vous pouvez également passer par un fichier .htaccess, vous devrez dans ce cas rajouter la ligne suivante : php_flag register_globals off. Ceci désactivera les register_globals, qui sont une vraie plaie pour la sécurité d'un script.

Nous allons maintenant présenter quelques exemples à ne pas faire et comment corriger les failles potentielles :

La faille include :

Prenons un exemple simple de cette faille : La plupart des sites ayant cette faille utilisent des url du style monsite.com/index.php?page=xxxxx ou xxxxx est une page qui sera inclue comme ceci :

<?phpif(isset($_GET['page'])){include $_GET['page'].'.php';}else{include 'accueil.php';}?>

Maintenant il suffit que le pirate place une page intitulée par exemple page sur son serveur. Il se rend ensuite sur le site concerné par la faille, et rentre l'url suivante : monsite.com/index.php?page=http://autre_site.com/page. La page n'est pas exécutée par PHP sur le site distant, elle sera donc exécutée sur le site possédant la faille. Vous pouvez donc vous imaginer des conséquences que cela peut engendrer... Pour contrer cette faille nous devons simplement utiliser la fonction file_exists() (attention en PHP5 ceci n'est plus forcément valable, assurez-vous d'avoir la directive allow_url_fopen à OFF dans votre fichier php.ini. Voici le code corrigé :

<?phpif(isset($_GET['page']) AND file_exists($_GET['page'].'.php')){include $_GET['page'].'.php';}

204

Page 205: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

else{include 'accueil.php';}?>

Attention maintenant à la faille dans votre site, c'est à dire qu'un visiteur inclue une page de votre site pour laquelle il n'a pas les droits d'accès en remontant d'un répertoire par exemple... Vous pouvez utiliser pour contrer cela les Expressions régulières en enlevant les caractères spéciaux : le slash, le point et l'antislash... qui pourraient prendre place dans l'url.

La faille du code HTML et des formulaires :

Il est courant maintenant de demander aux internautes tout ce qui vous passe par la tête, et d'afficher ensuite ces informations. Un internaute mal intentionné pourrait alors y mettre du code HTML pour défacer votre site (rien à craindre pour les donnés, juste pour la présentation).

Voici un exemple de formulaire courant :

<form action="page.php" method="post"><p><textarea name="message"></textarea><input type="submit" value="Envoyer" /></p></form>Voici maintenant un exemple de code PHP qui récupère la valeur du message tapé et l'affiche sur la page Web :<?phpif(isset($_POST['message'])){echo $_POST['message']; //On aurait très bien pu stocker le message, cela serait revenu au même}?>

Maintenant imaginions que l'internaute rentre du code html quelconque, il fait ce qu'il veut avec la présentation de votre site, et peut même utiliser du javascript pour rediriger l'internaute n'importe où.

Nous allons utiliser la fonction htmlentities() pour corriger la faille :

<?phpif(isset($_POST['message'])){echo htmlentities($_POST['message']); //Les caractères HTML sont désormais affichés et non interprétés}?>

Les failles de type SQL injection :Les failles de type SQL injection consistent à exécuter des requêtes arbitraires sur une base de données. En général ces failles sont utilisées grâce à un formulaire. Imaginions que nous ayons une table membres et que notre requête pour savoir si un membre est bien identifié est la suivante :

205

Page 206: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

mysql_query("SELECT login,passe FROM membres WHERE login='".$_POST['login']."' AND passe='".$_POST['passe']."'");login et passe sont deux champs d'un formulaire. Imaginions maintenant que nous rentriions cette valeur dans le champ login : ' OR 1=1"); #. La requête exécutée par PHP devient la suivante :

mysql_query("SELECT login,passe FROM membres WHERE login='' OR 1=1");Comme la condition OR 1=1 est toujours vraie, la requête est exécutée et le membre peut se connecter sans aucun pseudo.

Pour remédier à cette faille, nous allons échapper les caractères spéciaux en utilisant la fonction mysql_real_escape_string (cela est aussi valable pour une insertion dans une base de données) :

Les magic_quotes si elles sont activées vont automatiquement échapper les caractères, voilà pourquoi on doit toujours regarder si cette fonction est active avant d'échapper quoi que ce soit. Voici le code corrigé :

<?php /** * Si des slashes ont été ajoutés via les magic quotes, on les enlève */ if(get_magic_quotes_gpc()===1) {      $_POST['login'] = stripslashes($_POST['login']);      $_POST['passe'] = stripslashes($_POST['passe']); } 

/** * On protège les chaînes */ 

     $_POST['login'] = mysql_real_escape_string($_POST['login']);      $_POST['passe'] = mysql_real_escape_string($_POST['passe']); 

/** * On effectue la requête */      mysql_query("SELECT login,passe FROM membres WHERE login='".$_POST['login']."' AND passe='".$_POST['passe']."'"); ?>

Les failles utilisant l'upload :Ce genre de faille est de plus en plus courant. Pour y remédier, vous pouvez consulter cet article : Upload sécurisé en PHP.

206

Page 207: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

EXERCICES Complémentaires :

1) Créer un logiciel Zodiac.

- Création d’un formulaire : signe_zodiac.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="fr"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>signe_du_zodiac</title></head><body><h2>Zodiac</h2>Entrez votre année de naissance?<form method="post" action="07_zodiac.php"><input type="text" name="result" size="4" value="" maxlength="4"><input type="submit" name="envoyer" value="envoyer"></form></body>

</html>

- Créer l’action : 07_zodiac.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>Zodiac</title></head><body><?php

if (isset($_POST['result'])){$result=$_POST['result'];

} else $result="";if (empty($_POST['result'])){echo "Attention vous devez encodez une année";exit();}else

switch(($result-4)%12){

case 0: $zodiac="Rat";break;case 1: $zodiac="Boeuf";break;case 2: $zodiac="Tigre";break;case 3: $zodiac="Lapin";break;case 4: $zodiac="Dragon";break;

207

Page 208: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

case 5: $zodiac="Serpent";break;case 6: $zodiac="Cheval";break;case 7: $zodiac="Chèvre";break;case 8: $zodiac="Singe";break;case 9: $zodiac="Poulet";break;case 10: $zodiac="Chien";break;case 11: $zodiac="Cochon";break;

}echo "{$result} est l'année du {$zodiac}.<br/>"

?><a href="signe_zodiac.html"> Entrez une nouvelle année?</a></body>

</html>

2) Comment récupérer un login/password ?

- Création d’un formulaire : form.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>Form</title></head><body>

<form action="form_processing.php" method="post"> Username: <input type="text" name="username" value="" /><br /> Password: <input type="password" name="password" value="" /><br

/><br />

<input type="submit" name="submit" value="Submit" /></form>

</body></html>

- Récupération des données – 2 méthodes : form_processing.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>Form Processing</title></head><body>

<pre><?php

208

Page 209: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

print_r($_POST);?></pre><br /><?php

// détection de l'envoi du formulaireif (isset($_POST['submit'])) {

echo "Le formulaire a bien été envoyé<br />";

// set default valuesif (isset($_POST["username"])) {

$username = $_POST["username"];} else {

$username = "";}if (isset($_POST["password"])) {

$password = $_POST["password"];} else {

$password = "";}

// set default values using ternary operator// boolean_test ? value_if_true : value_if_false//$username = isset($_POST['username']) ?

$_POST['username'] : "";//$password = isset($_POST['password']) ?

$_POST['password'] : "";

} else {$username = "";$password = "";

}?>

<?phpecho "Username:{$username}<br/>";echo "Password:{$password}<br/>";

?>

</body></html>

3) Comment tester et récupérer un email ?- Le formulaire d’envoi : form_verifEmail.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>VerifEmail</title></head><body><form id="form1" name="form1" method="post" action="verifEmail.php">

<p>

209

Page 210: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<label> Votre Email:<input type="text" name="email" id="email"/>

</label></p>

<p><label> Envoyer

<input type="submit" name="valid" id="valid" value="Envoyer"/>

</label></p>

</form>

</body></html>

- La vérification : verifEmail.php<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>verifEmail</title></head><body>

<?php

$email = $_POST['email'];$point = strpos($email, ".");$arob = strpos ($email, "@");

if ($point==''){

echo "Votre email doit comporter un point";}elseif ($arob==''){

echo "Votre email doit comporter un '@'";}

else{

echo "Votre email est: '<a href=\"mailto:"."$email"."\">$email";

}

?></body>

</html>

4) Connexion avec include- Fichier principal : connexion_avec_include.php

<?php include "includes/entete.html";//include de l'entête html?><?php

//Connexion et vérification avec un includeinclude "includes/include_link.php";

210

Page 211: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

//Nom de la table avec un includeinclude "includes/include_nom_table.php";

//Exécution de la requète$resultat=mysqli_query($link, 'SELECT NomSociete, ContactNom FROM

client');if ($resultat==FALSE){

echo "Echecs de l'exécution de la requête.<br/>";}else {

//fetch sur chaque ligne de la requètewhile ($ligne=mysqli_fetch_assoc($resultat)) {

//Affichage du Nom de la société et Nom du contactecho "Nom de la société: ".$ligne['NomSociete']." et Nom du contact: ".$ligne['ContactNom']."<br/>";

}}//Déconnexion avec un includeinclude "includes/include_link_off.php";//Pied de page HTML

?> <?php include "includes/pied.html";//include du pied de page html?>

- Les includes(1) : entete.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>titre</title></head><body>

- Les includes(2) :pied.html</body>

</html>- Les includes(3) :include_link.php

<?php //Connexion

$link = mysqli_connect('localhost', 'root', '', 'db_cra');//vérification de la connexionif(mysqli_connect_errno()){

printf('Echec de la connexion:%s\n', mysqli_connect_error());exit();

}else {

echo"Connexion réussie à la base de donnée"."<br/>";}

?>- Les includes(4) :include_link_off.php

<?php //déconnexion de la base de donnéesif (mysqli_close($link)) {

211

Page 212: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

echo "<br>";echo "<br>";echo 'Déconnexion réussie de la base de données.<br/>';

}else {

echo 'Echecs de la deconnexion.';}

?>- Les includes(5) :include_nom_table.php

<?php //Connexion

if ($result = $link->query("SELECT DATABASE()")) //Retourne le nom de la base de données courante

{$row = $result->fetch_row();echo "<br>";printf("La base de données courante est %s.\n", $row[0]);echo "<br>";echo "<br>";$result->close();

}?>

5) Connexion Mysqli<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>connexion</title></head><body>

<?php //Connexion

$link = mysqli_connect('localhost', 'root', '', 'db_cra');//vérification de la connexionif ($link){

echo 'Connexion réussie.<br />';//Informations sur le serveurecho 'Information sur l\'host: '.mysqli_get_host_info($link);echo "<br/>";echo 'Information sur le serveur: '.mysqli_get_server_info($link);echo "<br/>";echo 'Information sur la version du serveur:

'.mysqli_get_server_version($link);echo "<br/>";echo 'Information sur le client: '.mysqli_get_client_info($link);echo "<br/>";echo 'Information sur la version du client:

'.mysqli_get_client_version($link);echo "<br/>";echo 'Information sur le proto: '.mysqli_get_proto_info($link);echo "<br/>";//Exécution de la requète

212

Page 213: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

$resultat=mysqli_query($link, 'SELECT NomSociete, ContactNom FROM client');

if ($resultat==FALSE){echo "Echecs de l'exécution de la requête.<br/>";

}else {

//affichage du nbr de lignesecho 'Nombre de personnes:

'.mysqli_num_rows($resultat).'<br/>';}if (mysqli_close($link)) {

echo 'Déconnexion réussie.<br/>';}else {

echo 'Echecs de la deconnexion.';}

}else {

printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());

}

?>

</body></html>

6) Requête Mysqli_fetch_assoc :<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>connexion</title></head><body>

<?php //Connexion

$link = mysqli_connect('localhost', 'root', '', 'db_cra');//vérification de la connexionif ($link){

echo 'Connexion réussie.<br />';//Informations sur le serveurecho 'Information sur l\'host: '.mysqli_get_host_info($link);echo "<br/>";echo 'Information sur le serveur: '.mysqli_get_server_info($link);echo "<br/>";echo 'Information sur la version du serveur:

'.mysqli_get_server_version($link);echo "<br/>";echo 'Information sur le client: '.mysqli_get_client_info($link);echo "<br/>";echo 'Information sur la version du client:

'.mysqli_get_client_version($link);

213

Page 214: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

echo "<br/>";echo 'Information sur le proto: '.mysqli_get_proto_info($link);echo "<br/>";//Exécution de la requète$resultat=mysqli_query($link, 'SELECT NomSociete, ContactNom FROM

client');if ($resultat==FALSE){

echo "Echecs de l'exécution de la requête.<br/>";}else {

//fetch sur chaque ligne de la requètewhile ($ligne=mysqli_fetch_assoc($resultat)) {

//Affichage du Nom de la société et Nom du contactecho "Nom de la société: ".$ligne['NomSociete']." et Nom du contact: ".$ligne['ContactNom']."<br/>";

}}if (mysqli_close($link)) {

echo 'Déconnexion réussie.<br/>';}else {

echo 'Echecs de la deconnexion.';}

}else {

printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());

}

?>

</body></html>

7) Requête préparée lire des données :<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>Requête préparée - lire des données</title></head><body>

<?php //Connexion à la base de donnée

$base = mysqli_connect('127.0.0.1', 'root', '', 'db_cra');//vérification de la connexionif ($base){

echo 'Connexion réussie.<br />';echo 'Information sur le serveur:'.mysqli_get_host_info($base).'<br/>';

//Lire les données$sql = "SELECT ClientId, DateCommande from commande WHERE

CommandeId > ?";

214

Page 215: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

// Préparation de la requête$resultat=mysqli_prepare($base,$sql);// Liaison des paramètres$ok = mysqli_stmt_bind_param($resultat, 'i', $CommandeId);//Initialisation de la variable $CommandeId$CommandeId = 10500;$ok= mysqli_stmt_execute($resultat);if ($ok==FALSE){

echo "Echecs de l'exécution de la requête.<br/>";}else {

// Association des variables résultats$ok = mysqli_stmt_bind_result($resultat,$ClientId,

$DateCommande);// lecture des valeursecho "Client Id et Date Commande > 10500<br/>";while (mysqli_stmt_fetch($resultat)) {

echo $ClientId.", ".$DateCommande."<Br/>";}mysqli_stmt_close($resultat);

}

if (mysqli_close($base)) {echo 'Déconnexion réussie.<br/>';

}else {

echo 'Echecs de la deconnexion.';}

}else {

printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());

}

?>

</body></html>

8) Requête préparée écrire des données :<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>Requête préparée - ecrire des données</title></head><body>

<?php //Connexion à la base de donnée

$base = mysqli_connect('127.0.0.1', 'root', '', 'db_cra');//vérification de la connexionif ($base){

echo 'Connexion réussie.<br />';echo 'Information sur le serveur:'.mysqli_get_host_info($base).'<br/>';

215

Page 216: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

//Ecrire des données$sql = "INSERT INTO client (NomSociete, ContactNom, ClientId) VALUES

(?,?,?)";// Préparation de la requête$resultat = mysqli_prepare($base,$sql);// Liaison des paramètres$ok = mysqli_stmt_bind_param($resultat, 'sss', $NomSociete,

$ContactNom, $ClientId);//Initialisation des variables$NomSociete = "Microsoft";$ContactNom= "Bill Gates";$ClientId="BEBE";$ok= mysqli_stmt_execute($resultat);

if ($ok==FALSE){echo "Echecs de l'exécution de la requête.<br/>";echo "Erreur:".mysqli_stmt_errno($resultat).' -

' .mysqli_stmt_error($resultat)."<br/>";}else {

echo "Personne ajoutée.<br/>";}mysqli_stmt_close($resultat);

if (mysqli_close($base)) {echo 'Déconnexion réussie.<br/>';

}else {

echo 'Echecs de la deconnexion.';}

}else {

printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());

}

?>

</body></html>

9) Requête dans un tableau en msql :<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>Requete dans un tableau en mysql</title></head><body><?php

216

Page 217: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

//Ancienne méthode de connexion en mysql

mysql_connect('localhost', 'root', '');mysql_select_db('db_cra');mysql_set_charset('utf8');

//initialisation du fichier .eniini_set('mysql.trace_mode', true);

$sql = 'SELECT * FROM client';

$result = mysql_query($sql); if($result!==FALSE){

if(mysql_num_rows($result) > 0){

echo '<table border="1">';

$row = mysql_fetch_assoc($result);

echo '<tr><th>', implode('</th><th>', array_keys($row)), '</th></tr>';

do{

echo '<tr><td>', implode('</td><td>', $row), '</td></tr>';

}while($row = mysql_fetch_row($result));

echo '</table>';

}

mysql_free_result($result); }

?>

</body></html>

10)Requête dans un tableau en msqli :<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>Requete dans un tableau</title></head><body>

217

Page 218: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

<?php

//Ancienne méthode de connexion en mysql

//mysql_connect('localhost', 'root', '');//mysql_select_db('db_cra');//mysql_set_charset('utf8');

//Connexion en mysqli $link = mysqli_connect('localhost', 'root', '', 'db_cra');//vérification de la connexionif ($link){

echo 'connexion réussie.<br />';echo 'information sur le serveur:'.mysqli_get_host_info($link);

}else {

printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());

}//initialisation du fichier .eniini_set('mysql.trace_mode', true);

$sql = 'SELECT * FROM client';

$result = mysqli_query($link,$sql); if($result!==FALSE){

if(mysqli_num_rows($result) > 0){

echo '<table border="1">';

$row = mysqli_fetch_assoc($result);

echo '<tr><th>', implode('</th><th>', array_keys($row)), '</th></tr>';

do{

echo '<tr><td>', implode('</td><td>', $row), '</td></tr>';

}while($row = mysqli_fetch_row($result));

echo '</table>';

}

mysqli_free_result($result); }if (mysqli_close($link)) {

echo 'Déconnexion réussie.<br/>';}else {

218

Page 219: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

echo 'Echecs de la deconnexion.';}

?>

</body></html>

11)Ajouter des données à une base de données à travers un formulaire : Le formulaire :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtm11/DTD/xhtml1-strict.dtd"><html xmlns=http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">

<head><meta http-equiv="Content-Type" content="text/html; charset=utf-

8"/><title>Formulaire_ajout</title>

</head>

<body><h2>Formulaire d'ajout de contenu à la base info</h2>

<form method="POST" action="addok.php">

Nom: <input type="text" name="nom" size="20" value="" maxlength="35"><br>Prénom: <input type="text" name="prenom" size="20" value="" maxlength="35"><br>Email: <input type="text" name="email" size="20" value="" maxlength="70"><br>ICQ: <input type="text" name="icq" size="20" value="" maxlength="11"><br>Titre URL: <input type="text" name="titre" size="20" value="" maxlength="70"><br>URL: <input type="text" name="url" size="20" value="" maxlength="255"><br><input type="submit" value="Envoyer" name="envoyer">

L’action en php :<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>add.php </title></head><body>

<?php //Titreecho "<h2> Les données saisies sont </h2>";// On commence par récupérer les champs if(isset($_POST['nom'])){

$nom=$_POST['nom'];echo "<br/>";echo htmlentities ($nom);

} else {

$nom="";}

219

Page 220: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

if(isset($_POST['prenom'])){$prenom=$_POST['prenom'];echo "<br/>";echo htmlentities ($prenom);

} else {

$prenom="";}

if(isset($_POST['email'])){$email=$_POST['email'];echo "<br/>";echo htmlentities ($email);

} else {

$email="";}

if(isset($_POST['icq'])){$icq=$_POST['icq'];echo "<br/>";echo htmlentities ($icq);

} else {

$icq="";}

if(isset($_POST['titre'])){$titre=$_POST['titre'];echo "<br/>";echo htmlentities ($titre);

} else {

$titre="";}

if(isset($_POST['url'])){$url=$_POST['url'];echo "<br/>";echo htmlentities ($url);echo "<br/>";

} else {

$url="";}

//On vérifie si les champs sont vides if(empty($nom) OR empty($prenom) OR empty($email) OR empty($titre) OR empty($url)) {

echo '<font color="red">Attention, seul le champs <b>ICQ</b> peut rester vide !</font>'; echo "<br/>";

exit();

220

Page 221: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

} // Aucun champ n'est vide, on peut enregistrer dans la table else {

$link = mysqli_connect('localhost', 'root', '', 'info'); // connexion à la base

/* Vérification de la connexion */if (mysqli_connect_errno())

{printf("Echec de la connexion : %s\n",

mysqli_connect_error());echo "<br/>";exit();

}

if ($result = $link->query("SELECT DATABASE()")) //Retourne le nom de la base de données courante

{$row = $result->fetch_row();printf("La base de donnees courante est %s.\n", $row[0]);echo "<br>";$result->close();

}//On insére les informations du formulaire dans la table$sql="INSERT INTO infos_tbl(id, nom, prenom, email, icq, titre, url)VALUES('','$nom','$prenom','$email','$icq','$titre','$url')";$result = mysqli_query ($link,$sql);if ($result==FALSE){

echo "Echecs de l'exécution de la requête insert.<br/>";}else {

echo "La personne a bien été enregistrée dans la base de données info.<br/>";

}

// exécution de la requete$sql="SELECT nom, prenom, email, titre, icq, url FROM infos_tbl order

by 2,1";$result = mysqli_query ($link,$sql);

if ($result==FALSE){echo "Echecs de l'exécution de la requête select.<br/>";

}else// lecture des ligneswhile ($row=mysqli_fetch_row($result)){

//En indiquant la place du champ dans le tableau//echo "Nom: ".$row[0].//" et Prénom: ".$row[1]."<br/>";

//avec une boucle FORprint ("<pre>");for ($i=0; $i<mysqli_num_fields($result);$i++)

221

Page 222: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

{print ("$row[$i] ");}

}print ("</pre>");

}// déconnectionmysqli_close($link);?>

<a href="form.html">retourner au formulaire d'encodage</a></body>

</html>

222

Page 223: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

La sécurité :

1) XdebugLe Xdebug affine le rapport des erreurs. Il apporte une couche d’information sur ce qui se passe.Télécharger –> xdebug.orgPour vérifier vos informations : info.php< ?phpphpinfo() ;?>Placer le fichier .dll dans le dossier Php_runningversion

Modifier le fichier php.ini et mettre le Xdebug sur 1 ou on.

Comment afficher les erreurs ?

Modifier le fichier php.ini et mettre Display_errors=ON

Dans le code nous pouvons aussi modifier temporairement le .ini

Attention lors d’une modification du php.ini vous devez impérativement redémarer le server.

Error_reporting(E_ALL) ;INI_SET(‘display_errors’,true) ;

Attention en production ne pas afficher les erreurs !

2) Le JAVA SCRIPT Afficher un pop up dans une page à travers un formulaire GET

Le formulaire en HTML -> form.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<title>Form avec Get</title></head><body><form action="info_sans_securite.php" method="GET"><p><input type="text" name="name" value=""/><br /><p><input type="submit" name="submit" value="Envoyer"/><br /></form></body>

</html>

Le code en php -> info_sans_securite.php (non sécurisé)

<?php

//script 1 ?name=alain//<script> alert ('bonjour') </script>//Génération d'un pop up

223

Page 224: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

// script 2 ?name=alain//<script>var link = document.getElementsByTagName('a')[0];link.href="http://www.tata.com";</script>//Le lien http de menu qui renvoit vers google.com est renvoyé vers tata.com

$name = $_GET['name'];

echo '<a href="google.com">menu</a><br />';

echo 'hello ' . $name . '<br />';

?>

A travers le formulaire, nous envoyons des informations dans l’URL du code PHP en JAVA SCRIPT par injection XSS.

Comment se prémunir ? Mise à jour de son navigateur. La plupart des navigateurs modernes stopent l’injection XSS.

Il faut donc en consol désactiver la protection xss

Fermer le navigateur Chrome

Ouvrir la console Windows (ou créer un fichier .bat -> www.batcher.fr) avec la commande ci-dessous.start chrome.exe --args --disable-web-security --disable-xss-auditor

Voici les principales commande DOS :

Commande Fonction

CD Permet de se déplacer d'un répertoire à un autre. (Exemple: c> cd dossier )

CD \ Permet d'acceder à la racine d'un lecteur. (Exemple: c> cd \ )DIR Liste le contenu du répertoire courant. (Exemple: c> dir )

MKDIR Création d'un dossier. (Exemple: c>mkdir dossier )RMDIR Effacer un dossier. (Exemple: c>rmdir dossier)COPY Copie des fichiers. (Exemple: c> copy toto.txt c:\toto.txt )

XCOPY Copie des fichiers et des répertoires. (Exemple: c> xcopy toto.txt c:\toto.txt )

DEL Effacer un fichier (Exemple: c>del c:\temp.txt )REN Renommer des fichier (Exemple: ren toto.txt tata.txt)

MOVE Déplace un fichier. (Exemple: c> move c:\temp.txt d:\)EDIT Lance un éditeur de texte sous MS-DOS.(Exemple: c> edit

toto.txt )

MORE Visualiser le contenu d'un fichier texte (Exemple: c> more toto.txt )

FORMAT Permet d'effacer le contenu d'un lecteur. (Exemple: c> format a: )

CLS Efface l'écran actuel. (Exemple: c> cls )

FIND Recherche dans un fichier la ligne contenant une valeur.(Exemple:

CMD Ouvre la fenêtre de commande DOS. (Exemple: c> cmd )ECHO Affiche un message. (Exemple: c> echo salut )ECHO. Permet de sauter une ligne. (Exemple: c>echo. )

224

Page 225: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

SORT Permet de trier une liste en fonction d'un critère. (Exemple: c> dir | sort reverse )

PRINT Imprime le fichier spécifié. (Exemple: c>print toto.txt )EXIT Ferme la fenêtre MSDOS. (Exemple: c> exit)

TYPE Affiche un fichier texte. (Exemple: c> type list.txt ) même fonction que more

FC Comparaison de fichiers.

ATTRIB Modifie les attributs d'un fichier. (Exemple: c> attrib c:\test +a)

CACLS Modifie les droits utilisateurs sur un fichier.

CHDIR Affiche l'arboréscence actuelle. (Exemple: c:\temp> chdir)

  Commandes réseaux

Commande Fonction

PING Effectue un test de connectivité sur une machine distante à utiliser avec une adresse IP. (exemple: c> ping google.fr)

IPCONFIG Permet de voir votre configuration réseau, adresse IP, DNS, serveur DHCP... (exemple: c> ipconfig ,ipconfig /all)

NETSTAT Affiche leurs connexions active sur votre machine, port et protocole. (exemple: c> NETSTAT)

NET USE Connecte un lecteur réseau. (exemple: c>net use z: \\nompc\nompartage)

TRACERT Affiche les adresses de toutes les passerelles pour accédez à une destination (exemple: c> tracert google.fr)

ARP Permet de voir et de modifier la table ARP, correspondance MAC <-> IP des machines connectées sur le réseau.

TELNET Telnet sur une autre machine (exemple: c> telnet 192.168.0.1)

NET SEND Envoi un message sur une machine sur le réseau.(exemple: c> net send %computername% coucou)

NSLOOKUP Permet de faire une résolution DNS, l'exemple donne les IP de google (exemple: c> nslookup google.fr )

FTP Lance un module FTP permettant de faire des transfert de fichiers. (exemple: c> ftp 01net.com )

REXECExécute des commandes sur des hôtes distants exécutant le service REXEC. Rexec authentifie l'utilisateur sur l'hôte distant avant d'exécuter la commande spécifiée.

TFTP transfère les fichiers depuis et vers un ordinateur distant exécutant le service TFTP.

RUNAS Permet d'éxécuter une commande avec un compte utilisateur différent.

NET TIME Permet de pouvoir synchroniser l'horloge avec un serveur.MODE Permet d'afficher des informations concerant les ports COMNETSH Permet de configurer des interfaces réseaux.ROUTE Permet de gérer la table de routage de la machine

locale(exemple: c> route print )NBTSTAT Affiche les statistiques du protocole TCP/IP actuelles

Commandes utilitaires WindowsCommande Fonction

DEFRAG Permet de défragmenter un lecteur (exemple: c> defrag c:)CHKDSK Permet de lancer un scandisk sur un disque dur

225

Page 226: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

NET START Démarre un service windows (exemple: c> net start sharedaccess)

CLEANMGR Permet de faire un netoyage des disques durs.CONVERT Convertit des volumes FAT en volumes NTFS

SCHTASKSPermet sous Windows XP à un administrateur de créer, supprimer, effectuer des requêtes, modifier, exécuter et mettre fin à des tâches planifiées sur un système local ou distant.

TASKKILL Permet sous Windows XP de mettre fin à une ou plusieurs tâches ou processus. Voir TASKLIST

TASKLISTAffiche la liste des applications et tâches ou processus associés actuellement activés sur un système à distance sous Windows XP

SHUTDOWN Arrête ou redémarre un ordinateur local ou distant.BOOTCFG Configure, interroge ou modifie les paramètres du fichier

boot.ini.DISKPART Gère des disques, des partitions ou des volumes.

SYSTEMINFO Permet d'obtenire une foule d'information sur votre équipement.

TYPEPERFAffiche les données du compteur de performances dans la fenêtre de commande ou dans un format de fichier journal pris en charge.

DRIVERQUERY Recherche une liste de pilotes et de propriétés de pilotes.

MEMAffiche des informations concernant les zones de mémoire allouées, les zones de mémoire libre et les programmes actuellement chargés en mémoire dans le sous-système MS-DOS.

LABEL Les symboles ^ et & peuvent être utilisés dans les noms de volume.

AT planifie l'exécution de commandes

  Commandes Diverse

Commande Fonction

CALL Appelle un fichier batch à partir d'un autre fichier batch.(exemple: c> ping google.fr)

COLORPermet de modifier les couleurs de la fenêtre MS-DOS(exemple:color 0a affiche le texte en vert et le fond en noir)

HOSTNAME Affiche le nom de l'ordinatateur (exemple: c> hostname)REG Permet de faire des interventions dans la base de registre.TITLE Permet de renommer la fenêtre MS-DOS (exemple: c> title

batcher!)

TREE Représente graphiquement une arborescence de répertoires(exemple: c>tree)

BREAK Active ou désactive le contrôle étendu de CTRL+C.PROMPT Modifie l'invite de commande(exemple: c> prompt batcher! )

> Redirection remplacement (exemple: echo batcher! > temp.txt)

>> Redirection ajout (exemple: c> echo batcher! >> temp.txt)

COMPACT Compresse et décompresse un fichier (exemple: c> compact temp.txt /C )

  Commandes dédiées aux scripts

226

Page 227: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Commande Fonction

PAUSE Permet de stopper le traitement en cours en demandant à l'utilisateur de taper une touche pour continuer.

IF Instore une structure conditionnelleFOR permet de créer des bouclesSET défintion d'une variable %variable% pour la rapelée

GOTO Permet d'aller à une étiquette définit dans le script via ":".SET

VARNAME= Crée une variable.SETLOCAL Crée une variable locale.TIMEOUT Permet de créer une temporisation avec un réglage en

secondes. (!!! Valable uniquement sous Vista !!!)

Le code php avec la sécurité : info.php

<?php

$name = htmlentities($_GET['name']);

if (preg_match('/script/', $name)) { header('HTTP/1.1 418 Forbidden');

echo 'Are you a teapot?'; die;}

echo '<a href="http://www.google.com">menu</a><br />';

echo 'hello ' . $name . '<br />';

?>

227

Page 228: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

3) Le token -> méthode sha1L’importance de la méthode : la méthode GET -> les paramètres sont passés dans l’URL<?php

?>

<form> <input type="text" name="param"> <input type="submit"></form>La méthode POST<?php

?>

<form method="post"> <input type="text" name="param"> <input type="submit"></form>

Création d’un jeton de sécurité avec la méthode sha1

<?phpsession_start();//création d'un jeton de sécurité avec la méthode sha1$token = sha1(session_id() . 'ùknsùoih');echo $token."<br/>";//contrôle des données$postedToken = isset($_POST['token']) ? $_POST['token'] : null;

if ($postedToken) { if ($postedToken == $token) { echo 'ok'; } else { echo 'not ok'; }}//régénère l'id donc le token n'est plus == à $postedToken//session_regenerate_id();?>

<form method="post"> <input type="text" name="param"> <!-- nous passons la valeur du token dans un hidden- pas visible de l'utilisateur --> <input type="hidden" name="token" value="<?php echo $token ?>"> <input type="submit"></form>

La sécurisation avec un captcha : https://www.phpcaptcha.org/

<?phpsession_start();include_once 'securimage/securimage.php';

$securimage = new Securimage();

228

Page 229: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

$token = sha1(session_id() . 'ùknsùoih');

$postedToken = isset($_POST['token']) ? $_POST['token'] : null;$captcha = isset($_POST['captcha']) ? $_POST['captcha'] : null;

if ($postedToken) { if ($postedToken === $token) { if ($securimage->check($captcha)) { echo 'ok'; } else { echo 'captcha not valid!'; } } else { echo 'not ok'; }}?>

<form method="post"> <label>your name</label> <input type="text" name="param"> <br />

<img src="securimage/securimage_show.php" /> <br /> <label>captcha</label> <input type="text" name="captcha"> <br />

<input type="hidden" name="token" value="<?php echo $token ?>"> <input type="submit"></form>

4) Les cookies et les sessions

Exemple : se faire voler une session

Comment utiliser la session d’un autre utilisateur ? <?php//session_non_secure

session_start(); //une session utilisateur est un espace temporaire pour stoker des //informations. Par exemple voir si l’utilisateur est identifié ou non$password=isset($_GET['password']) ? $_GET['password']:null;if('gogogo'===$password){

$_SESSION['identified']=true;}

//indique la valeur de la sessionvar_dump(session_id());var_dump($_SESSION);//régénère le session id//session_regenerate_id();

229

Page 230: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

//indique la valeur du cookievar_dump($_COOKIE);//var_dump(session_get_cookie_params());//document.cookie - en mode consol permet d'afficher la valeur du cookie//ouvrir une nouvelle page chrome//surcharger document.cookie="n°de session de l'autre navigateur"

//metre fin à une session//session_destroy();

?>

Comment se protéger ?<?php// session securesession_start();var_dump(session_id());$password=isset($_GET['password']) ? $_GET['password']:null;if('gogogo'===$password){

session_regenerate_id();var_dump(session_id());$_SESSION['identified']=true;$_SESSION['IP']=$_SERVER['REMOTE_ADDR'];

}

//indique la valeur de la session: true égal connectévar_dump($_SESSION);//indique la valeur du cookievar_dump($_COOKIE);

?>

Exemple : vote en utilisant les cookies.

Formulaire d’encodage :<?phpsession_start();

var_dump($_COOKIE);?>

<a href="vote_cookies.php?name=robin">Voter pour Robin</a><a href="vote_cookies.php?name=julien">Voter pour Julien</a><a href="vote_cookies.php?name=jeff">Voter pour Jeff</a>

<!--<img src="vote_cookies.php?name=julien"/>-->

Le code PHP : vote_cookies.php

<?phpsession_start();

if (!isset($_COOKIE['vote'])) {

230

Page 231: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

setcookie('vote', 0); setcookie('jeff', 0); setcookie('julien', 0); setcookie('robin', 0);}

if (isset($_GET['name'])) { $name = $_GET['name']; setcookie('vote', ++$_COOKIE['vote']); setcookie($name, ++$_COOKIE[$name]);}

header('Location: form_cookies.php');

Exemple de code avec des cookies :

<?php// Définit les cookiessetcookie("cookie[three]", "cookiethree");setcookie("cookie[two]", "cookietwo");setcookie("cookie[one]", "cookieone");

// Après le rechargemet de la page, nous les affichonsif (isset($_COOKIE['cookie'])) { foreach ($_COOKIE['cookie'] as $name => $value) { $name = htmlspecialchars($name); $value = htmlspecialchars($value); echo "$name : $value <br />\n"; }}$value = 3600;setcookie("TestCookie", $value, time()+3600); /* expire dans 1 heure *///afficher une cookieecho $_COOKIE["TestCookie"];// afficher tous les cookiesecho "<br/>";print_r($_COOKIE);var_dump($_COOKIE);

?>

231

Page 232: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

5) Login/password

Préparer une nouvelle base de données en Workbench ou phpmyadmin :Nom : info2Table : adminNom des champs : id -> clé primaire, auto-incrementuser-> varchar(50), uniquepassword-> varchar(50), uniqueLes données :User : jerome, lia, jeffPassword : 123, 1234, 12345

Login/password avec faille de sécurité.Comment se prémunir des failles de sécurité ?

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>login_unsecure</title></head><body>

<?php

//Connexion $link = mysqli_connect('localhost', 'root', '', 'info2');

//vérification de la connexionif ($link){

echo 'connexion réussie à la base de données.<br />';echo 'information sur le serveur:'.mysqli_get_host_info($link);echo "<br/>";echo 'Information sur le serveur: '.mysqli_get_server_info($link);echo "<br/>";echo 'Information sur la version du serveur:

'.mysqli_get_server_version($link);echo "<br/>";echo 'Information sur le client: '.mysqli_get_client_info($link);echo "<br/>";echo 'Information sur la version du client:

'.mysqli_get_client_version($link);echo "<br/>";

}else {

printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());

}

//$username = isset($_POST['username']) ? $_POST['username'] : null;//$password = isset($_POST['password']) ? $_POST['password'] : null;

//echapper en utilisant mysqli_real_escape_string

232

Page 233: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

$username = isset($_POST['username']) ? mysqli_real_escape_string($link,$_POST['username']) : null;$password = isset($_POST['password']) ? mysqli_real_escape_string($link,$_POST['password']) : null;

$sql = mysqli_query($link, "SELECT * FROM admin WHERE user = '$username' and password = '$password'");// le hack//dans la requête remplacer le $username et $password par 'OR'1'='1if ($result = mysqli_fetch_assoc($sql)) { var_dump($result);

echo 'Vous êtes identifié';} else { echo 'Vous n\'êtes pas identifié';}?>

<h1>Identification</h1><form method="post"> <label>Username :</label> <input type="text" name="username"> <label>Password :</label> <input type="password" name="password"> <input type="submit"></form>

</body></html>

Login/password avec l’objet pdo

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en"><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>login_pdo</title></head><body>

<?php

$pdo = new PDO('mysql:host=localhost;dbname=info2', 'root', null);

$stmt = $pdo->prepare('SELECT * FROM admin WHERE user = :user and password = :password');$stmt->bindParam(':user', $username);$stmt->bindParam(':password', $password);

$username = $_POST['username'];$password = $_POST['password'];

$stmt->execute();

233

Page 234: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

if ($result = $stmt->fetchObject()) { var_dump($result);echo 'Vous êtes identifié';} else { echo 'Vous n\'êtes pas identifié';}?>

<h1>Identification</h1><form method="post"> <label>Username :</label> <input type="text" name="username"> <label>Password :</label> <input type="password" name="password"> <input type="submit"></form>

</body></html>

6) Comment générer des password forthttp://www.strongpasswordgenerator.com

Strong password definition

A strong password:…has at least 15 characters…has uppercase letters…has lowercase letters…has numbers…is not like your previous passwords…is not your name…is not your login…is not your friend’s name…is not your family member’s name…is not a dictionary word…is not a common name…is not a keyboard pattern, such as qwerty, asdfghjkl, or 12345678…has symbols, such as ` ! " ? $ ? % ^ & * ( ) _ - + = { [ } ] : ; @ ' ~ # | \ < , > . ? /

234

Page 235: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

Exemple de script pour parer aux attaques par dictionnaire et par force brut. – Comment remettre ce script au goût du jour ?

<?php// Démarrage de la sessionsession_start();

// Si on a dépassé le temps de blocage if(isset($_SESSION['nombre']) and $_SESSION['timestamp_limite'] < time()) { // Destruction des variables de session unset($_SESSION['nombre']); unset($_SESSION['timestamp_limite']); }

// Si le cookie n'existe pas if(!isset($_COOKIE['marqueur'])){

// Si le formulaire est correctement rempli if(isset($_POST['connexion']) and !empty($_POST['pseudo']) and !empty($_POST['passe'])) {

// Si la variable de session qui compte le nombre de soumissions n'existe pas

if(!isset($_SESSION['nombre'])){

// Initialisation de la variable $_SESSION['nombre'] = 0;

// Blocage pendant 10 min $_SESSION['timestamp_limite'] = time() + 60*10;

}

// Sécurisation des variables $pseudo = mysql_real_escape_string($_POST['pseudo']); $passe = mysql_real_escape_string(md5($_POST['passe']));

// Formatage de la requête $requete = "SELECT id FROM administrationWHERE pseudo = '$pseudo' AND passe = '$passe'";

// Si on n'essaye pas de nous attaquer par force brute if($_SESSION['nombre'] < 10){

// Connexion à notre base de données mysql_connect("localhost", "root", ""); mysql_select_db("table");

// Envoie de la requête au serveur $query = mysql_query($requete) or exit(mysql_error());

235

Page 236: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

// Ici, vous traitez les résultats de votre requête à votre guise

// Incrémentation de notre variable de session $_SESSION['nombre']++;

}// Si on a dépassé les 10 tentativeselse{

// Si le cookie marqueur n'existe pas on le crée if(!isset($_COOKIE['marqueur'])) {

$timestamp_marque = time() + 60; // On le marque pendant une minute $cookie_vie = time() + 60*60*24; // Durée de vie de 24 heures pour le décalage horaire

setcookie("marqueur", $timestamp_marque, $cookie_vie);

}

// on quitte le scriptexit();

}

}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html> <head> <title>Administration</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form method="post" action="">

<p> <label>Pseudo </label>

<input type="text" name="pseudo" /><br /><label>Passe </label><input type="text" name="passe" /><br /><input type="submit" name="connexion" value="connexion" />

</p> </form> </body></html>

<?php

} // Si le cookie existe else {

236

Page 237: Web viewPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation

Formation PHP/MySQL 3 jours FR Jérôme Selosse

// Si le temps de blocage a été dépassé if($_COOKIE['marqueur'] < time()) { // Destruction du cookie setcookie("marqueur", "", 0); } }

?>

237