Vous êtes sur la page 1sur 191

Notes PHP

Cours PHP

Notes PHP - Circum Net


page 2

Table des matières


1 Introduction

1.1 Définition de PHP 9


1.2 Utilité de PHP 10
1.3 Apprentissage de PHP 11
1.4 Distribution de PHP 12
1.5 Installation de PHP 13
1.6 Documentation, support et assistance 14
1.7 Hébergement/Mise en ligne des scripts PHP 16

2 Description du langage

2.1 Syntaxe
2.1.1 Template PHP 18
2.1.2 Extension PHP 19
2.1.3 Mode PHP 20
2.1.4 Utilisation des minuscules/majuscules 21
2.1.5 Séparateur d'instructions 22
2.1.6 Bloc d'instructions 23
2.1.7 Commentaires 24
2.1.8 Variables
2.1.8.1 Variables PHP 26
2.1.8.2 Variables externes 28
2.1.8.3 Portée des variables 30
2.1.8.4 Contrôle des variables 32
2.1.8.5 Variables dynamiques ou variables variables 33
2.1.9 Types de données
2.1.9.1 Booléens 35
2.1.9.2 Nombres entiers 36
2.1.9.3 Nombres à virgule flottante 37
2.1.9.4 Chaînes de caractères 38
2.1.9.5 Tableaux 41
2.1.9.6 Objets 43
2.1.9.7 Transtypage 45
2.1.10 Constantes
2.1.10.1 Constantes prédéfinies 46
2.1.10.2 Définition de constantes 47
2.1.11 Opérateurs
2.1.11.1 Opérateurs arithmétiques 48
2.1.11.2 Opérateurs de chaînes de caractères 49
2.1.11.3 Opérateurs d'affectation 50
2.1.11.4 Opérateurs de comparaison 51
2.1.11.5 Opérateurs logiques 52
2.1.11.6 Opérateurs d'incrémentation/décrémentation 53
2.1.12 Structures de contrôle
2.1.12.1 Instruction conditionnelle 'if' 54
2.1.12.2 Instruction conditionnelle 'elseif' 56
2.1.12.3 Instruction d'affectation conditionnelle 57
2.1.12.4 Instruction de boucle 'while' 58
2.1.12.5 Instruction de boucle 'do while' 59
2.1.12.6 Instruction de boucle 'for' 60
2.1.12.7 Instruction d'interruption 'break' 61
2.1.12.8 Instruction 'continue' 62
2.1.12.9 Instruction de sélection 'switch' 63
2.1.12.10 Instruction d'inclusion 'include' 65

Notes PHP - Circum Net


page 3

2.1.13 Fonctions
2.1.13.1 Modularité 67
2.1.13.2 Définition et appel de fonctions 68

2.2 Erreurs courantes


2.2.1 Types d'erreurs 71
2.2.2 Questions clés 72

2.3 Frameworks
2.3.1 Utilisation d'un framework 73
2.3.2 Application de l'approche MVC 74

3 Mise en oeuvre et fonctions principales

3.1 Affichage
3.1.1 Introduction
3.1.1.1 Programmation serveur et output 77
3.1.2 Instructions
3.1.2.1 echo 78
3.1.2.2 print 79

3.2 Manipulation de chaînes de caractères


3.2.1 Introduction
3.2.1.1 Développements Web et chaînes de caractères 80
3.2.2 Instructions
3.2.2.1 strlen 81
3.2.2.2 strtolower 82
3.2.2.3 strtoupper 83
3.2.2.4 ucfirst 84
3.2.2.5 substr 85
3.2.2.6 substr_count 86
3.2.2.7 strrchr 87
3.2.2.8 strip_tags 88
3.2.2.9 stripslashes 89
3.2.2.10 nl2br 91
3.2.2.11 urlencode 92
3.2.2.12 urldecode 93
3.2.2.13 htmlspecialchars 94
3.2.2.14 htmlentities 95
3.2.2.15 str_replace 96
3.2.2.16 trim 97
3.2.2.17 explode 98
3.2.2.18 implode 99

3.3 Manipulation de tableaux


3.3.1 Introduction
3.3.1.1 Les incontournables tableaux de programmation 100
3.3.2 Intstructions
3.3.2.1 array 101
3.3.2.2 list 102
3.3.2.3 each 103
3.3.2.4 foreach 104
3.3.2.5 sizeof 105
3.3.2.6 reset 106
3.3.2.7 is_array 107

3.4 Manipulation de répertoires et fichiers


3.4.1 Introduction

Notes PHP - Circum Net


page 4

3.4.1.1 Trouver, lire, écrire, supprimer des fichiers 108


3.4.2 Instructions
3.4.2.1 opendir 109
3.4.2.2 readdir 110
3.4.2.3 rewinddir 111
3.4.2.4 closedir 112
3.4.2.5 touch 113
3.4.2.6 unlink 114
3.4.2.7 fopen 115
3.4.2.8 fclose 116
3.4.2.9 fwrite 117
3.4.2.10 fread 118
3.4.2.11 fgets 119
3.4.2.12 file 120
3.4.2.13 readfile 121
3.4.2.14 filesize 122
3.4.2.15 feof 123
3.4.2.16 file_exists 124
3.4.2.17 copy 126
3.4.2.18 tempnam 127
3.4.2.19 tmpfile 128
3.4.2.20 flock 129

3.5 Expressions régulières


3.5.1 Introduction
3.5.1.1 Exploiter les expressions régulières 130
3.5.2 Instructions
3.5.2.1 preg_match 133
3.5.2.2 preg_replace 135

3.6 Connexions ODBC


3.6.1 Introduction
3.6.1.1 Open DataBase Connectivity 136
3.6.2 Instructions
3.6.2.1 odbc_connect 137
3.6.2.2 odbc_exec 138
3.6.2.3 odbc_fetch_row 139
3.6.2.4 odbc_result 140
3.6.2.5 odbc_result_all 141
3.6.2.6 odbc_fetch_into 142

3.7 Connexions PDO


3.7.1 Introduction
3.7.1.1 PDO - Interface d'abstraction 143
3.7.2 Instructions
3.7.2.1 PDO construct 144
3.7.2.2 PDO request 146
3.7.2.3 PDO->query 147
3.7.2.4 PDO->exec 148
3.7.2.5 PDOStatement->fetch 149
3.7.2.6 PDO->prepare 150

3.8 Gestion de courrier électronique


3.8.1 Introduction
3.8.1.1 Envoi de courriers à partir de PHP 152
3.8.2 Instructions
3.8.2.1 mail 153

Notes PHP - Circum Net


page 5

3.9 Commandes systèmes


3.9.1 Introduction
3.9.1.1 Exécution de programmes externes 156
3.9.2 Instructions
3.9.2.1 system 157
3.9.2.2 passthru 158

3.10 Gestion des cookies


3.10.1 Introduction
3.10.1.1 Utilité des cookies 159
3.10.2 Instructions
3.10.2.1 setcookie 160
3.10.2.2 read cookie 162

3.11 Gestion de sessions


3.11.1 Introduction
3.11.1.1 Applications Web et sessions 163
3.11.2 Instructions
3.11.2.1 session_start 164
3.11.2.2 session_destroy 165
3.11.2.3 session_register 166
3.11.2.4 session_id 168
3.11.2.5 PHPSESSID 169

4 Conseils pratiques

4.1 Sécurité
4.1.1 Tester les variables clients 171

4.2 Programmation
4.2.1 Déboguer un script 173
4.2.2 Erreurs de syntaxe 176

4.3 Base de données


4.3.1 Paramètres de connexion 177

4.4 Web
4.4.1 Nécessité d'échapper des caractères 179
4.4.2 Filtrer les données utilisateur 180
4.4.3 Redirection : Headers already sent by 181

5 Etude de cas

5.1 Annuaire
5.1.1 Annuaire électronique 183
5.1.2 Annuaire d'adresses Web 185

5.2 Editeur
5.2.1 Editeur de texte 188

PHP en quelques questions :


Introduction

Notes PHP - Circum Net


page 6

Qu'est-ce que PHP ? 9


Quelle est l'utilité de PHP ? 10
PHP est-il facile à apprendre ? 11
Comment installer PHP ? 13
Comment mettre en ligne ses projets PHP ? 16

Syntaxe
Comment créer son premier template PHP ? 18
Pourquoi avoir recours aux commentaires dans un script PHP ? 24
Comment insérer des commentaires dans un script PHP ? 24

Variables
A quoi servent les variables ? 26
Comment assigner et appeler des variables ? 26
Comment récupérer les données provenant d'un formulaire HTML ? 28

Types de données
Comment échapper un guillemet ? 38
Comment délimiter une chaîne de caractères ? 38

Structures de contrôle
Comment préciser une condition pour l'exécution d'instructions ? 54
Comment forcer la répétition d'une série d'instructions ? 58
Comment combiner plusieurs scripts PHP ? 65

Fonctions
Comment rendre ses scripts modulaires ? 67
Comment définir une fonction ? 68
Comment appeler une fonction ? 68
Comment retourner une valeur à partir d'une fonction ? 68

Erreurs courantes
Quelles sont les erreurs les plus souvent rencontrées ? 71
Quelles sont les questions à se poser pour corriger un script ? 72

Frameworks
Pourquoi utiliser un framework ? 73
Quelle est l'utilité de l'approche MVC ? 74

Manipulation de chaînes de caractères


Comment connaître la taille d'une chaîne de caractères ? 81
Comment supprimer les balises HTML d'une chaîne ? 88
Comment supprimer le caractère d'échappement d'une chaîne ? 89
Comment effectuer un remplacement dans une chaîne ? 96
Comment supprimer les espaces "blancs" en tête et en queue de chaîne ? 97

Manipulation de tableaux
Comment peupler un tableau de données ? 101
Comment passer en revue tous les éléments d'un tableau ? 104
Comment connaître la taille d'un tableau ? 105
Comment se repositionner sur le début d'un tableau ? 106

Manipulation de répertoires et fichiers


Comment obtenir la liste des fichiers d'un répertoire ? 110
Comment lire et exploiter le contenu d'un fichier ? 118
Comment tester l'existence d'un fichier ? 124

Notes PHP - Circum Net


page 7

Comment copier un fichier ? 126


Comment créer un fichier temporaire ? 128
Comment vérouiller un fichier ? 129

Expressions régulières
A quoi servent les expressions régulières ? 130
A quoi ressemblent les expressions régulières ? 130

Connexions ODBC
Comment se connecter à une base de données (ODBC) ? 137
Comment soumettre une requête SQL (ODBC) ? 138
Comment récupérer le résultat d'une requête SQL (ODBC) ? 139

Gestion de courrier électronique


Comment envoyer un courrier électronique ? 153

Commandes systèmes
Comment exécuter un programme externe ? 157

Gestion des cookies


A quoi servent les cookies ? 159
Comment créer un cookie ? 160
Comment utiliser un cookie ? 162

Gestion de sessions
A quoi servent les sessions ? 163
Comment créer et gérer des sessions ? 164
Comment échanger un identifiant de session ? 169

Notes PHP - Circum Net


page 8

Introduction

Circum Net, 2017


page 9

Définition de PHP

PHP est un langage de programmation. Il est destiné à être interprété sur un serveur web et offre la possibilité
de développer des sites web dynamiques.

Son principe de fonctionnement est particulièrement attractif pour les concepteurs de sites web qui débutent dans le
développement d'applications dynamiques. En effet, ce langage permet d'insérer des instructions de programmation
puissantes directement dans des pages de type HTML; on travaille donc en terrain connu. Voyons ce que cela donne
concrètement à travers un exemple:

Contenu d'un fichier php de base (test.php)

1 - <html>
2 - <head>
3 - <title>Test PHP</title>
4 - </head>
5 - <body>
6 - <?php echo "<h1>Hello World</h1>" ?>
7 - <hr>
8 - <?php
9 - echo "Instructions PHP";
10 - ?>
11 - </body>
12 - </html>

Les codes relevant du langage PHP se trouvent entre les délimiteurs '<?php' et '?>'.

Le fichier présenté ci-dessus est un fichier "texte" contenant des tags HTML classiques ainsi que de la programmation
PHP. Le code inclus entre les tags de début et de fin du "mode php" (<?php et ?>) sont interprétés par le serveur avant
que le document soit envoyé au client qui est à l'origine de la requête. Dans ce cas précis (instruction 'echo'), il en résultera
l'affichage par le navigateur web de la phrase "Hello World".
page 10

Utilité de PHP

Le langage PHP possède les mêmes fonctionnalités que les autres langages permettant d'écrire des scripts
de type CGI (C, Perl, Unix Shell, Python ...) : collecte et analyse de données, génération dynamique de pages web,
envoi et réception de cookies, gestion de sessions etc.

Mais il offre aussi un support pour un grand nombre de bases de données. Il permet en effet d'interfacer les bases suivantes:
Microsoft SQL Server, MySQL, Oracle, PostgreSQL, SQLite, InterBase, DBase, mSQL, Sybase, DB2, Firebird, FilePro,
Unix dbm, Informix.

En outre, le langage PHP permet le dialogue avec des services utilisant les protocoles tels que IMAP (Internet Mail Access
Protocol), SNMP (Simple Network Management Protocol), NNTP (Network News Transfert Protocol), POP (Post Office
Protocol) ou encore HTTP (HyperText Transfer Protocol).

Concrètement, PHP vous aide à réaliser des pages dites dynamiques - construites à la volée. C'est un programme qui
génère le code HTML en fonction d'un template (canevas) prédéfini et d'informations issues du résultat d'une requête au
serveur. L'exemple le plus classique est celui du moteur de recherche : la page résultat est automatiquement composée
sur base des critères de recherche saisis par l'utilisateur et des informations extraites d'une base de données en fonction
de la question posée.

Rôle de PHP

Intervention de PHP dans une application de type "outil de recherche". Il trouve sa place sur le serveur web,
reçoit les requêtes du client et assure l'interface avec la base de données. C'est lui qui soumet la requête
d'information au système de gestion.

D'autre part, PHP peut très bien remplir le rôle de langage de scripting classique afin d'assurer différentes tâches
"systèmes" (tâches récurrentes, opérations sur des fichiers texte, vérification de quotas, sauvegardes ...). Il suffit dans ce
cas d'utiliser PHP directement en ligne de commande - sans faire intervenir de serveur Web.

Enfin, PHP -même si ce n'est pas son domaine de prédilection- peut servir à développer des applications clientes
graphiques. Ceci se fait à travers les librairies PHP-GTK.
page 11

Apprentissage de PHP

Deux questions s'imposent d'entrée de jeu : PHP est-il facile à apprendre et cela prend-il beaucoup de temps?
Dans la littérature sur le sujet, on trouve de nombreux auteurs qui répondent sans préambule OUI à la première
question et NON à la deuxième. Il faut cependant nuancer ces propos.

PHP, pour être bien maîtrisé, nécessite de l'étudiant la même énergie et les mêmes efforts que pour tout langage de
programmation. Si certaines de ses fonctionnalités sont aisées à manipuler d'autres concepts peuvent être plus ardus telle
que l'approche "orienté objet".

Le temps d'apprentissage va grandement dépendre de votre "background" et des objectifs que vous vous êtes fixés: il
est évident qu'une personne ayant déjà pratiqué un langage de programmation découvrira PHP avec un oeil différent
de celui du débutant en programmation. La tâche sera plus difficile pour le débutant, mais certainement pas impossible.
PHP présente sans conteste les avantages d'offrir aux développeurs Web une suite de procédures clairement définies et
d'application directe.
page 12

Distribution de PHP

C'est sous sa version "4" que PHP s'est fait connaître du grand public. Quelques temps plus tard, la version
"5" lui a apporté de nombreuses fonctionnalités supplémentaires notamment la possibilité d'exploiter pleinement
l'approche "orienté objet". A présent, c'est la version "7" qui est en production et largement répandue.

PHP est également décliné de façon particulière afin de fonctionner sur différentes plates-formes et en relation avec
différents serveurs web.

Voici les principales combinaisons possibles :

- Unix/Linux - Apache
- Windows - Apache/IIS
- MacOSX - Apache

www.php.net est le site de référence pour la distribution et l'installation de PHP. Vous y trouverez les fichiers à télécharger
pour pouvoir utiliser PHP sur votre serveur Web.

Il existe également plusieurs sites miroirs, en voici quelques-uns :

- http://be.php.net/
- http://fr.php.net/
- http://nl.php.net/

Pour obtenir de l'aide en français concernant les problèmes que peuvent poser l'installation, l'apprentissage et la
programmation de ce langage, vous disposez, sur le site www.php.net, de la traduction en français du manuel PHP. Si vous
ne trouvez pas ce que vous cherchez dans ce manuel vous pouvez essayer PHPIndex (www.phpindex.com) et PHPInfo
(www.phpinfo.net) : deux sites de référence qu'il est bon de consulter régulièrement.
page 13

Installation de PHP

Afin d'exploiter le langage PHP, il faut disposer d'un compte sur un serveur web équipé du module PHP. Si
ce n'est pas le cas, vous serez peut-être amené à installer cet environnement de développement. Pour cela vous
devrez installer et configurer un serveur web ainsi que le module PHP. A ce niveau les options et choix possibles
étant tellement nombreux, nous ne pouvons ici que formuler les grandes lignes de la procédure (pour les détails
techniques et les dernières mises à jour, nous vous invitons à consulter l'information diffusée sur le site de PHP:
http://www.php.net/manual/installation.php.

Il existe également des "packages" d'installation pour les plateformes de développement Apache/PHP. Ces packages
sont en fait des assistants d'installation graphiques qui vont de façon transparente décompresser et configurer les
différents produits nécessaires : php, apache, mysql, phpmyadmin, mariadb. Ces assistants ne nécessitent pas de
connaissances systèmes particulières et peuvent faire gagner du temps dans le cadre du prototypage, du développement
ou de l'enseignement.

Quelques packages d'installation connus :

- WAMPServer
- XAMPP
- Bitnami
- AMPPS
- MAMP

Par contre pour la mise en production d'un serveur, il faut impétrativement que l'installation se fasse de manière
professionnelle. Il faut dans ce cas s'assurer de bien avoir le contrôle de tous les services mis en route
(configuration, optimisation, sécurisation, sauvegarde/restauration). Ces tâches sont beaucoup plus conséquentes et
relèvent habituellement de la compétence d'un administrateur système.

Documentation technique:

Les guides d'installation correspondant à chaque plate-forme et serveur web sont disponibles sur le site web de PHP à
l'adresse suivante :
http://www.php.net/manual/installation.php
page 14

Documentation, support et assistance

Le premier réflexe à acquérir est -de façon évidente- de toujours avoir à portée de "main" la documentation
technique officielle du langage PHP. Et à ce niveau, l'équipe PHP n'a pas ménagé sa peine : la documentation
est complète, traduite dans de nombreuses langues et toujours accompagnée d'exemples concrets ainsi que de
commentaires fort utiles.

Vous pouvez parcourir cette documentation à l'adresse suivante : www.php.net . A noter que le site propose un outil bien
pratique pour le programmeur : un outil de recherche portant sur les noms des fonctions du langage. Vous trouverez celui-
ci dans la bannière supérieure de toutes les pages du site.

Profil des explications

Etant donné que php est conçu comme une boîte à outil proposant de nombreuses fonctions prédéfinies, il est important
de bien saisir la façon dont celles-ci sont définies dans la documentation. En voici le profil général :

Description d'une fonction PHP

- Les arguments de la fonction ainsi que les valeurs de retour sont toujours précédés de leur type (string, int,
float, bool, array ...).
- Si es arguments de la fonction sont précisés entre crochets c'est qu'ils sont optionnels - vous n'êtes donc
pas obligés de les fournir.
- Si la fonction ne retourne aucune valeur elle est alors précédée du mot-clé "void".
page 15

Exemples et commentaires

La description des différentes fonctions prédéfinies du langage PHP est dans la grande majorité des cas accompagnée de
nombreux exemples et de commentaires d'utilisateurs. Ils illustrent la mise en situation des fonctions mais aussi les cas
particuliers pouvant poser problème. N'hésitez pas à les consulter et à les tester.

Faq et mailing list

Les problèmes les plus souvent rencontrés (et leurs solutions) par les développeurs PHP sont listés dans les PHP FAQ
- http://www.php.net/FAQ.php.

Il est possible de faire connaître les bugs rencontrés dans le module PHP aux personnes assurant le développement du
langage en se connectant à l'adresse suivante : http://www.php.net/bugs.php.

La mailing list PHP est une précieuse source d'informations en cas de difficultés. Les archives de celle-ci sont disponibles
sur la page du support du site Web PHP. Pour s'inscrire à cette mailing list, il suffit d'envoyer un courrier vide à php-
subscribe@lists.php.net.

Ressources externes

De nombreux sites web traitent du langage PHP, offrent des conseils, proposent des solutions. En voici quelques-uns :

Ressources PHP

- http://www.php.net/
- http://www.phpindex.com/
- http://www.phpbuilder.com/
- http://www.phpfrance.com/
- http://www.phpclasses.org/
- http://www.weberdev.com/
- http://phpbuddy.com/
page 16

Hébergement/Mise en ligne des scripts PHP

Lorsque vous aurez développé vos premiers scripts PHP et que ceux-ci fonctionneront à la perfection sur
votre ordinateur, la question de leur mise en ligne va certainement se poser. Si vous disposez déjà d'un accès à
un serveur Web équipé de PHP -pour vous- le problème est réglé, il suffira de transférer les fichiers dans le bon
répertoire. Pour les autres, c'est la recherche d'un hébergeur qui commence. A titre d'information voici quelques
solutions d'hébergement gratuit proposant le support PHP (et souvent MySQL).

Hébergement PHP

De nombreux fournisseurs d'accès internet et hébergeurs de site web proposent +/- gratuitement
des hébergements qui incluent le support PHP:

Free
- PHP et MySQL
- http://www.free.fr/

Le Village
- PHP et MySQL
- http://www.levillage.org/

Infomaniak
- PHP et MySQL
- http://www.infomaniak.com/

OVH
- PHP et MySQL
- http://www.ovh.com/

1and1
- PHP et MySQL
- http://www.1and1.fr/

...

Ceci n'est évidemment pas une liste exhaustive des solutions d'hébergement, il en existe bien d'autres.
page 17

Description du langage

Circum Net, 2017


page 18

Syntaxe

Template PHP

Les instructions PHP sont placées dans un template (fichier texte portant l'extension .php) qui sera interprété
sur le serveur.

Ce template se comporte pratiquement comme un fichier HTML classique, seulement, le code inclus entre les tags de
début et de fin du "mode php" (<?php et ?>) sont interprétés par le serveur avant que le document soit envoyé au client qui
est à l'origine de la requête. Tout ce qui se situe en dehors du mode php est simplement recopié tel quel par l'interpréteur
sur la sortie standard du script.

Code source d'un fichier php de base (template.php)

1 - <html>
2 - <head>
3 - <title>Test PHP</title>
4 - </head>
5 - <body>
6 - <?php echo "Hello World" ?>
7 - </body>
8 - </html>

Dans ce cas précis (instruction 'echo'), il en résultera l'affichage par le navigateur web de la phrase "Hello
World".

Cette façon de procéder présente l'avantage d'offrir au programmeur débutant un point de départ bien connu et relativement
aisé à manipuler (le langage html). Nous verrons par la suite qu'il y a bien évidemment différentes manières d'aborder le
programmation PHP.
page 19

Syntaxe

Extension PHP

Les templates contenant du code php sont placés sur un serveur web équipé du module php capable de les
interpréter. Ces fichiers doivent habituellement avoir une extension .php (ou .php4 pour les fichiers faisant appel
à la version 4 du module php).

Extensions php

1 - list.php3
2 - search.php
3 - dbaccess1.php
4 - guestbook.php4
5 - upload_file.php

On rencontre également des fichiers se terminant par "phtml", une variante des deux premières extensions.
".php" reste néanmoins l'extension la plus largement utilisée.

Pour que les extensions PHP soient automatiquement reconnues par le serveur Web sur lequel tourne le moteur PHP, il
faut s'assurer que le fichier de configuration du serveur Web a été correctement paramétré. En ce qui concerne le serveur
Apache, son fichier de configuration 'httpd.conf' présente une rubrique 'AddHandler' qui permet de préciser le type des
fichiers traités par le serveur. Afin d'utiliser PHP, il faut s'assurer que cette rubrique contient bien l'instruction suivante:
AddHandler application/x-httpd-php .php . Celle-ci fera en sorte que les fichiers ayant l'extension '.php' soient pris en compte
et interprétés par le moteur PHP.
page 20

Syntaxe

Mode PHP

Si la philosophie " template " permet -comme nous l'avons vu- de partir du langage HTML pour mettre en oeuvre
des applications PHP, il faut en contrepartie établir clairement ce qui relève du codage PHP. En d'autres termes,
il doit être possible de passer sans ambiguïté du mode HTML au mode PHP. Il existe pour cela différents moyens.

Passage au mode PHP

1 - 1. <?php echo "output"; ?>


2 -
3 - 2. <? echo "output"; ?>
4 -
5 - 3. <script language="php"> echo "output";</script>
6 -
7 - 4. <% echo "output"; %>

La première possibilité est la solution active par défaut.


La deuxième possibilité n'est valable que si vous l'avez activée -soit en faisant appel à la fonction
short_tags(), soit en utilisant l'option d'exécution "short_tags" dans le fichier de configuration, soit en utilisant
l'option --enable-short-tags lors de la compilation de PHP. A noter qu'elle peut entrer en conflit avec les
entêtes XML.
La deux dernières possibilités sont aujourd'hui dépréciées et n'apportent aucun avantage technique.

La première possibilité est actuellement la méthode privilégiée - c'est la formule optimale en terme de portabilité et de
compatibilité puisque disponible sur toutes les plateformes PHP. Son principe est élémentaire: la programmation PHP
s'inscrit entre les caractères <?php et ?>. Celle-ci peut ainsi être dissociée du code HTML et être traitée en tant qu'instruction
par le moteur PHP installé sur le serveur Web.

Dans un template php, il est possible d'entrer et de sortir du mode php à différents endroits et autant de fois qu'on le juge
utile. Il suffit de bien observer les règles d'ouverture et de fermeture des codes délimitant le mode php.

Passage au mode PHP <?php ... ?>

1 - <html>
2 - <head>
3 - <title>Test PHP</title>
4 - </head>
5 - <body>
6 -
7 - <?php
8 - $name = "Paul";
9 - echo "Hello $name"
10 - ?>
11 -
12 - <hr noshade>
13 -
14 - <?php echo "How are you?" ?>
15 -
16 - </body>
17 - </html>

Il est de plus en plus courant de voir les logiciels de type "Editeurs de texte" et "Editeurs Web" intégrer
des fonctions qui facilitent l'utilisation des codes PHP (citons entre autres: Dreamweaver, Golive, Aranea,
UltraEdit ...).
page 21

Syntaxe

Utilisation des minuscules/majuscules

Le langage PHP fait la distinction entre les caractères minuscules et majuscules. Il faut donc être attentif à
l'orthographe des variables et fonctions. Si ces dernières ne sont pas écrites de la même façon dans le script,
elles seront considérées comme différentes.

Observation des minuscules/majuscules

1 - <html>
2 - <head>
3 - <title>Test PHP</title>
4 - </head>
5 - <body>
6 -
7 - <?php
8 - $name = "Paul";
9 - $Name = "Peter";
10 - echo "Hello $name,<br/>";
11 - echo "Where is $Name ?";
12 - ?>
13 -
14 - </body>
15 - </html>

Dans le code source présenté ci-dessus, les variables $name et $Name ne sont pas envisagées de la
même façon.

Il n'est pas inutile d'insister sur l'attention à apporter à l'utilisation des minuscules/majuscules. En effet, la confusion à
ce niveau est une des principales sources des erreurs dites "syntaxiques". Eviter ce genre de piège vous fera gagner
beaucoup de temps.
page 22

Syntaxe

Séparateur d'instructions

Un script étant composé d'une suite d'ordres, l'interpréteur doit pouvoir clairement les distinguer: on utilise
pour cela un séparateur d'instructions. En PHP, comme en C, en Perl ou en Java, les instructions sont séparées
par un point virgule ";".

Attention, oublier de préciser un séparateur entre deux instructions php entraîne directement une erreur de syntaxe et
l'arrêt de l'exécution du script. A l'inverse, en placer trop à des endroits inappropriés aura le même effet.

A noter que la balise de fermeture (?>) du mode PHP implique la fin d'une instruction.

Le point virgule comme séparateur d'instructions

1 - <?php
2 - // Syntaxe correcte
3 - echo "Hello World<br>";
4 - echo "$date";
5 - ?>
6 -
7 - <?php
8 - // Syntaxe correcte
9 - echo " Hello World<br>";
10 - echo "$date"
11 - ?>
12 -
13 - <?php
14 - // Syntaxe incorrecte
15 - echo " Hello World<br>";
16 - echo "$date"
17 - echo "$message"
18 - ?>

La dernière instrucion avant la fermeture du mode PHP ne doit pas spécialement être clôturée par un point
virgule.
Les deux premiers exemples sont donc corrects.
Le troisième, lui, entraîne une erreur de syntaxe: il faut en effet placer un séparateur d'instructions à la fin de
la seconde instruction.
A noter que la bonne pratique veut que chaque instruction soit terminée par un point virgule (fin du mode
PHP ou non).
page 23

Syntaxe

Bloc d'instructions

En PHP -comme en C, en Perl ou en Java- les accolades sont employées afin de rendre "solidaires" différentes
instructions. L'accolade ouvrante indique le début d'un bloc d'instructions et l'accolade fermante la fin.

La difficulté consiste ici à être particulièrement attentif à la logique d'ouverture et de fermeture des accolades lorsque l'on
traite des blocs d'instructions imbriqués. L'oubli d'une accolade entraîne directement une erreur de syntaxe et l'arrêt de
l'exécution du script.

Les blocs d'instructions

1 - <?php
2 - if (1==1) // toujours vrai
3 - {
4 - echo "Hello World<br>";
5 - echo "Today 1 = 1<br>";
6 - echo "What a World !";
7 - }
8 - ?>

Les accolades rendent "solidaires" les instructions de programmation qu'elles encadrent.


page 24

Syntaxe

Commentaires

Les commentaires sont des lignes de texte qui permettent de documenter et d'expliciter un script. Elles sont
ignorées par le système lors de l'exécution du script. Par contre, du point de vue de la ou les personnes qui
doivent lire le script, elles sont particulièrement appréciées puisqu'elles constituent très souvent la clé pour la
bonne compréhension de la logique et de la syntaxe mises en oeuvre.

Il existe différentes façons de les noter. Dans la plupart des cas, il suffit de les faire précéder d'un signe particulier. Le
langage PHP supporte les conventions de commentaires utilisées en C, C++, Java et Unix Shell.

Commenter un code source

1 - <?php
2 - echo "Hello World"; // sur une ligne (comme en Java)
3 - echo "Hello World"; # sur une ligne (comme en Unix Shell)
4 -
5 - /* Ceci est un commentaire sur plusieurs lignes,
6 - comme en C, C++, Java */
7 - ?>

'#' et '//' sont des signes de commentaires sur une ligne tandis que '/* */' délimitent des commentaires sur
plusieurs lignes.

Le # est un type de commentaires souvent rencontré en PHP; il débute un commentaire allant jusqu'à la fin de ligne. Si l'on
veut préciser des commentaires plus longs, il suffit de placer le signe # (ou //) au début de chaque ligne. Il est également
possible d'utiliser /* et */ pour préciser le début et la fin d'un commentaire réparti sur plusieurs lignes. Attention, il ne faut
pas confondre ces codes de commentaires avec les balises de commentaires du langage HTML (<!-- ... -->).

Si les commentaires sont fort utilisés pour annoter un programme php, ils sont également particulièrement sollicités lorsque
l'on doit débuguer un script. Les commentaires permettent en effet de mettre entre parenthèses (en d'autres termes de
désactiver) une partie du code afin d'identifier plus facilement où se situe le problème.

Déboguer un script

1 -
2 - <?php
3 - ...
4 - $users = array('Paul', 'Pierre', 'Olivier', 'Isabelle');
5 - $i = 0;
6 - /*
7 - while ($i != sizeof($users))
8 - {
9 - echo "$users[$i]<br>\n";
10 - $i++;
11 - }
12 - */
13 - ...
14 - ?>
15 -

Les codes php compris entre les signes de commentaires ne seront pas interprétés sur le serveur.
page 25

On ne saurait trop insister sur le fait qu'inclure des commentaires dans un programme ne peut être que bénéfique. On le
constate d'ailleurs rapidement: une bonne documentation rend beaucoup plus facile le développement, la correction, la
mise à jour et le partage des scripts (quel que soit le langage de programmation utilisé).

Cette précaution vous paraîtra peut être superflue lorsqu'il s'agit de traiter des scripts de petite taille, elle se révèlera
cependant salutaire avec des scripts plus conséquents.
page 26

Syntaxe

Variables - Variables PHP

Les variables sont utilisées pour mémoriser les données manipulées par un programme. Le nom d'une variable
ne varie pas au sein du programme, mais la ou les valeurs qui lui sont associées peuvent changer lors de son
exécution.

En PHP, les noms des variables commencent par le caractère dollar ($) suivi d'une ou plusieurs lettres, chiffres ou signes
de souligné. Le nom est sensible à la casse ($campus est différent de $Campus).

Il n'est pas nécessaire de déclarer le type des variables que l'on utilise.

Pour affecter une valeur à une variable, on utilise une instruction d'assignation : on fait suivre le nom de la variable par le
signe égal suivi d'une expression qui, après calcul, déterminera la valeur à assigner à cette variable.

Variables et assignation

1 - <?php
2 - $a = 1;
3 - $b = 2 + 5;
4 - $a = $c + 2;
5 - $a = "hello";
6 - ?>

Le langage PHP n'exige pas de déclaration de type avant l'assignation et l'utilisation de variables.
On déclare simplement une variable en lui attribuant un identifiant valide (commençant soit par un caractère
alphabétique, soit par le caractère souligné '_') préfixé du signe dollar '$', et en lui assignant une valeur.
Si l'on assigne une autre valeur à une variable existante (par exemple $a), la nouvelle valeur va écraser
l'ancienne.

Assignations multiples

1 - <?php
2 - $a = $b = $c = 1;
3 - echo "$a $b $c"; // Ceci donne : 1 1 1
4 - ?>

Il est également possible, comme illustré plus haut, d'assigner plusieurs variables en ligne.

Excepté lorsqu'elle est déclarée au sein d'une définition de fonction, la portée d'une variable est globale (c'est-à-dire qu'elle
concernera tout le script à partir de la déclaration de la variable).
page 27

Utilisation de variables dans un template PHP

1 - <html>
2 - <head>
3 - <title>Test PHP</title>
4 - </head>
5 - <body>
6 -
7 - <?php
8 - $color1 = "#ff0000";
9 - $color2 = "#00ff00";
10 - $color3 = "#0000ff";
11 - echo "<font color=\"$color1\">red</font><br/>";
12 - echo "<font color=\"$color2\">green</font><br/>";
13 - echo "<font color=\"$color3\">blue</font><br/>";
14 - ?>
15 -
16 - </body>
17 - </html>

Les variables $color1, $color2, $color3 reçoivent respectivement les valeurs #ff0000, #00ff00, #0000ff. Elles
sont ensuite envoyées sur la sortie standard via l'instruction 'echo'.

A noter encore, une variable peut être à tout moment redéclarée dans le script; sa valeur sera à chaque fois écrasée par
la nouvelle valeur qui lui aura été assignée.

Ecrasement de variables

1 - <html>
2 - <head>
3 - <title>Test PHP</title>
4 - </head>
5 - <body>
6 -
7 - <?php
8 - $color1 = "#ff0000";
9 - echo "<font color=\"$color1\">red</font><br/>";
10 - // retourne <font color="#ff0000"> ...
11 -
12 - echo "<br/><br/>";
13 -
14 - $color1 = "#0000ff";
15 - echo "<font color=\"$color1\">blue</font><br/>";
16 - // retourne <font color="#0000ff"> ...
17 - ?>
18 -
19 - </body>
20 - </html>

Les variables $color1, $color2, $color3 reçoivent respectivement les valeurs #ff0000, #00ff00, #0000ff. Elles
sont ensuite envoyées sur la sortie standard via l'instruction 'echo'.

Du point de vue pratique, il faut de préférence rester simple dans le choix des noms de variables. Les caractères spéciaux
et les caractères accentués sont à éviter : ils représentent une source d'erreur non négligeable et peuvent constituer un
sérieux obstacle pour la portabilité du code. Le caractère souligné "_" joue souvent, dans les noms de variables, le rôle
du caractère espace " " (qui, lui, est interdit).
page 28

Syntaxe

Variables - Variables externes

Il est possible de passer aux scripts PHP des valeurs provenant d'éléments extérieurs au langage PHP - par
exemple d'un formulaire web ou d'une adresse URL.

C'est bien évidemment une fonctionnalité qui sera fort sollicitée dans le cadre du développement d'applications Web :
le formulaire HTML servant à récupérer les données encodées par l'utilisateur, le script php effectuant le traitement de
l'information - toutes les variables du formulaire HTML doivent donc être disponibles dans le script PHP.

Comme nous l'avons déjà vu, en PHP, les variables sont représentées par un signe dollar "$" suivi du nom de la
variable. Lorsqu'un formulaire HTML est envoyé à un script PHP, toutes les variables du formulaire sont automatiquement
accessibles à partir du script, il suffit d'appeler une variable portant le même nom que celui du champ de saisie HTML
(par exemple '$critere').

Cette règle était valable pour toutes les versions précédant la version 4.1 de PHP. Aujourd'hui les choses ont un peu changé.
Le groupe de développement du langage PHP privilégie en effet une autre voie : il recommande -pour des raisons de
sécurité- de récupérer les variables externes via les tableaux prédéfinis $_POST et $_GET. Un champ de formulaire HTML
portant donc par exemple le nom "critere" ne doit plus être appelé $critere mais bien $_POST[critere] ou $_GET[critere].

Remarque : même avec les versions récentes de PHP, il est possible de revenir à l'ancien état des choses en modifiant le
fichier de configuration de la distribution de PHP 'php.ini' (il faut mettre le paramètre register_globals à 'on').

Formulaire HTML

1 - <html>
2 - <head>
3 - <title>Formulaire HTML</title>
4 - </head>
5 - <body>
6 - <form action="varext.php" method="post">
7 - Prénom: <input type="text" name="prenom"/>
8 - <input type="submit" value="Envoyer"/>
9 - </form>
10 - </body>
11 - </html>

Lorsque ce formulaire est envoyé, le serveur Web qui le reçoit le redirige vers le script PHP référencé dans
le champ action du formulaire. PHP va automatiquement créer le tableau $_POST (ou $_GET en fonction
de la méthode utilisée) qui contiendra les valeurs saisies dans les différents champs du formulaire. Ce
tableau pourra alors être utilisé dans le script php. Dans notre cas, le script 'varext.php' peut faire référence
au champ 'prenom' du formulaire HTML via l'exression $_POST[prenom].
page 29

Script PHP et formulaire HTML

1 - <html>
2 - <head>
3 - <title>Test PHP - Confirmation</title>
4 - </head>
5 -
6 - <body>
7 -
8 - <?php
9 - $administrator = "Luc";
10 - if ($_POST["prenom"] == $administrator)
11 - {
12 - echo "Accès autorisé, bonne lecture !";
13 - }
14 - else
15 - {
16 - echo "Accès refusé, vérifiez votre compte !";
17 - }
18 - ?>
19 -
20 - </body>
21 - </html>

Les données saisies dans les champs du formulaire HTML peuvent directement être récupérées via des
variables. Les noms de ces dernières correspondent à ceux associés aux champs utilisés dans la page
HTML.

Script PHP et adresse URL

1 - Si l'on envisage l'url suivante :


2 -
3 - http://www.site.be/edit.php?type_action=write&file=22.html
4 -
5 - voici comment les paramètres peuvent être récupérés:
6 -
7 - if ($_GET["type_action"] == "write")
8 - {
9 - echo "Enregistrement du fichier :" . $_GET["file"];
10 - }

Les données saisies dans les champs du formulaire HTML peuvent directement être récupérées via des
variables. Les noms de ces dernières correspondent à ceux associés aux champs utilisés dans la page
HTML.
page 30

Syntaxe

Variables - Portée des variables

La portée d'une variable fait référence à l'endroit où la variable a été définie. Ainsi, une variable définie à
l'intérieur d'une fonction est dite "locale" alors qu'une variable définie à un plus haut niveau est dite "globale".

Cette caractéristique a une influence directe sur la façon dont les variables peuvent être utilisées en PHP. En effet,
l'utilisation d'une variable locale est a priori limitée au contexte de la fonction dans laquelle elle a été définie. Une variable
glogale, elle, pour être utilisée localement (à la différence d'autres langages de programmation) doit être redéfinie dans
chaque fonction concernée.

Variables globales / locales


1 - <?php
2 - $message = "Apprendre le langage PHP";
3 -
4 - function affiche()
5 - {
6 - echo $message;
7 - }
8 -
9 - affiche();
10 - ?>

Le script présenté ci-dessus ne donnera pour résultat qu'une page blanche. La variable '$message' utilisée
dans la fonction 'affiche' n'a qu'une portée locale et n'a pas été initialisée. Elle ne fait donc pas référence à la
variable de plus haut niveau '$message'.

Pour pouvoir utiliser une variable "globale" dans une fonction, il faut la redéclarer explicitement à ce niveau. Il y a deux
façons de réaliser cela : soit en déclarant globale la variable dans la fonction à l'aide du mot-clé 'global', soit en utilisant
le tableau associatif prédéfini '$GLOBALS'.

Utilisation d'une variable globale dans une fonction


1 - <?php
2 - // ------------première partie--------------
3 -
4 - $message = "Apprendre le langage PHP";
5 - $remarque = "c'est amusant<br>";
6 -
7 - function affiche()
8 - {
9 - global $message, $remarque;
10 - echo $message . ", " . $remarque;
11 - }
12 -
13 - affiche();
14 -
15 - // ------------seconde partie--------------
16 -
17 - function affiche2()
18 - {
19 - echo $GLOBALS["message"] . ", " . $GLOBALS["remarque"];
20 - }
21 -
22 - affiche2();
23 - ?>

Cette fois-ci, le script présenté ci-dessus répond à nos attentes. Dans la première partie du script, les
variables '$message' et '$remarque' sont disponibles dans la fonction 'affiche' grâce à l'utilisation du mot-
clé 'global'. Dans la seconde partie du script -pour arriver à un résultat identique-, on utilise dans la fonction
'affiche2' le tableau predéfini '$GLOBALS'.
page 31

Les variables super globales

PHP fournit automatiquement, lors de l'appel d'un script, un ensemble de tableaux prédéfinis qui contiennent les variables
servies par le serveur, les variables d'environnement et d'entrées ($_SERVER, $ENV, $_GET, $_POST, $_SESSION).
Ces éléments sont considérés comme des 'superglobaux' étant donné qu'ils sont disponibles à tous les niveaux d'exécution
du script (visibilité au niveau global et fonction). Pour les exploiter, il ne faut donc pas utiliser le mot réservé 'global' mais
bien les questionner directement.

Appel aux variables super globales

1 - <?php
2 - // -----------niveau global-------------
3 - // affichage du contenu d'une variable super globale
4 - echo $_POST['type'];
5 -
6 - function dump_in()
7 - {
8 - // ----------niveau fonction-----------
9 - // affichage du contenu de variables super globales
10 - echo $_POST['name'];
11 - echo $_GET['id'];
12 - }
13 -
14 - dump_in();
15 - ?>

Dans cet exemple, on remarque que les données envoyées par formulaire ou url sont accessibles de partout
dans le script..
page 32

Syntaxe

Variables - Contrôle des variables

La structure de langage 'isset()' permet de tester si une variable à bien été définie. Il suffit de lui passer en
paramètre le nom de la variable qu'il faut tester. Elle retourne la valeur 'true' si la variable a bien été créée et la
valeur 'false' dans le cas contraire.

Vérification de l'existence d'une variable

1 - <?php
2 - if (isset($_POST["password"]))
3 - {
4 - ... traitement ...
5 - }
6 - else
7 - {
8 - echo "Vous devez vous identifier!";
9 - }
10 - ?>

Dans ce script, on vérifie si le variable $_POST["password"] -provenant théoriquement d'un formulaire


HTML- existe bien avant de se lancer dans le traitement de l'information.

La structure prédéfinie 'unset()' permet de supprimer une variable et de libérer la mémoire que celle-ci occupait.

Destruction d'une variable

1 - <?php
2 - unset($contents);
3 - ?>

La structure prédéfinie 'empty()' fonctionne à l'inverse de 'isset()'. Elle permet également de tester une variable, mais elle
retourne la valeur 'true' si la variable n'existe pas et la valeur 'false' dans le cas contraire.

Vérification de l'existence d'une variable

1 - <?php
2 - if (empty($_POST["password"]))
3 - {
4 - echo "Vous devez vous identifier!";
5 - }
6 - ?>

Dans ce script, 'empty()' teste la non affectation de la variable $_POST["password"].


page 33

Syntaxe

Variables - Variables dynamiques ou variables variables

Une variable dynamique est une variable dont le nom peut être précisé dynamiquement en prenant la valeur
d'une autre variable.

Pour un débutant, les variables dynamiques ne dévoileront certainement pas leur potentiel au premier coup d'oeil.
Cepandant, l'expérience aidant, elles s'avèreront dans certains cas de figure bien utiles. Voyons à travers des exemples
quel en est le mode de fonctionnement.

Appel d'une variable dynamique


1 - <?php
2 - // Affectation de la variable ordinateur
3 - $ordinateur = "linux";
4 -
5 - // Affectation de la variable varx
6 - $varx = "ordinateur";
7 -
8 - // Appel d'une variable dynamique
9 - echo $$varx;
10 - // équivaut à 'echo $ordinateur' et affichera 'linux'
11 - ?>

Cette interprétation est rendue possible du fait que PHP commence le déréférencement par la variable la
plus interne. En effet, lors de l'analyse de '$$varx', PHP s'occupe en premier lieu de '$varx', qui devient par
substitution 'ordinateur'. Ensuite, il passe au signe '$' restant suivi de la valeur 'ordinateur' précédemment
obtenur - ce qui revient à traiter la variable '$ordinateur'.

Affectation d'une variable dynamique


1 - <?php
2 - // Affectation classique
3 - $varx = "ordinateur";
4 -
5 - // Affectation d'une variable dynamique
6 - $$varx = "linux";
7 - // Cette deuxième affectation crée une variable
8 - // $ordinateur qui contient la chaîne 'linux'
9 -
10 - echo $ordinateur;
11 - // Affiche 'linux'
12 - ?>

Utilisation dans une boucle


1 - <?php
2 - $var_1 = 45;
3 - $var_2 = 62;
4 - $var_3 = 69;
5 - $var_4 = 12;
6 -
7 - for($i=1; $i<5; $i++)
8 - {
9 - $varx = "var_" . $i;
10 - echo $$varx . "\n";
11 - }
12 - ?>

Celle boucle affichera successivement la valeur des variables $var_1 jusqu'à $var_4.
page 34

Récupération des éléments d'un tableau sous forme de variables dynamiques

1 - <?php
2 - function get_array_vars($my_array)
3 - {
4 - foreach ($my_array as $key => $value)
5 - {
6 - global $$key;
7 - if (empty($$key))
8 - {
9 - $$key = trim ($value);
10 - }
11 - }
12 - }
13 - ?>

Cette fonction prend chacun des éléments du tableau associatif fourni en argument et les rend accessibles
dans le script (via les variables dynamiques) simplement sur base de leur nom/clé.

Alternative : utilisation des accolades

1 - <?php
2 - $var_1 = "Hello";
3 - $var_2 = "Bonjour";
4 -
5 - $id = 1;
6 - echo ${"var_" . $id}; // Ceci donne : Hello
7 -
8 - $id = 2;
9 - echo ${"var_" . $id}; // Ceci donne : Bonjour
10 -
11 - $id = 2;
12 - $prefix = "var_";
13 - echo ${$prefix . $id}; // Ceci donne : Bonjour
14 -
15 -
16 - $start = "say";
17 - $end = "hello";
18 - ${$start . $end} = "Hello World";
19 - echo $sayhello; // Ceci donne : Hello World
20 - // ou
21 - echo ${$start . $end}; // Ceci donne : Hello World
22 - ?>

Il est également possible, et souvent plus confortable, d'exploiter les variables dynamiques à l'aide
d'expressions utilisant les accolades comme illustré dans le code ci-dessus.
page 35

Syntaxe

Types de données - Booléens

En programmation, le type booléen (boolean) peut avoir deux valeurs, false (faux) ou true (vrai). On le
rencontrera le plus souvent lors de l'évaluation de conditions logiques.

Types - booléens

1 - <?php
2 - // assignation d'une valeur booléenne
3 - $securite = true;
4 - ?>

1 - <?php
2 - // utilisation d'une valeur booléenne dans une condition
3 - if ($securite == true)
4 - {
5 - echo "Site protégé!";
6 - }
7 - else
8 - {
9 - echo "Accès public!";
10 - }
11 - ?>

L'évaluation porte sur la variable $securite. Si cette variable est vide ou consiste en une chaîne d'un
caractère 0 (chiffre 0), l'expression équivaut à false. Toutes les autres possibilités correspondent à true.
page 36

Syntaxe

Types de données - Nombres entiers

Les types entiers représentent les nombres sans partie décimale. Les valeurs négatives sont autorisées. Il est
possible de spécifier les nombres entiers (integers) de la manière suivante :

Types - nombres entiers

1 - <?php
2 - $a = 1234; // nombre entier en base 10
3 - $a = -123; // nombre entier négatif
4 - ?>
page 37

Syntaxe

Types de données - Nombres à virgule flottante

Les types à virgule flottante expriment les nombres réels disposant d'une partie décimale. Les nombres à
virgule flottante peuvent être spécifiés en utilisant la syntaxe suivante :

Types - nombres à virgule flottante

1 - <?php
2 - $a = 1.234;
3 - $a = 1.2e3;
4 - ?>
page 38

Syntaxe

Types de données - Chaînes de caractères

Les chaînes sont des suites de caractères (comme 'bonjour'). La chaîne la plus courte ne contient aucun
caractère (c'est une chaîne vide) et La chaîne la plus longue peut remplir toute la mémoire disponible. A noter que
la manipulation des chaînes de caractères est une des tâches que l'on rencontre le plus souvent dans le cadre
du développement d'applications Web.

En PHP, les chaînes de caractères peuvent être définies en utilisant deux types de délimiteurs : les apostrophes simples
et les apostrophes doubles.

Dans le cas d'une chaîne de caractères limitée par des apostrophes simples (simple-quotes), les variables présentes
dans la chaîne ne seront pas substituées et le caractère anti-slash (caractère d'échappement), n'aura aucun effet (à deux
exceptions près, pour \' et \\ , afin de pouvoir utiliser les caractères simple-quote et anti-slash dans la chaîne de caractères).

Si la chaîne de caractères est délimitée par des apostrophes doubles (double-quotes), les variables à l'intérieur de la
chaîne de caractères seront remplacées par leur valeur. Le caractère anti-slash (\) peut ici être utilisé pour "protéger" un
caractère spécial.

La délimitation par des apostrophes simples est considérée comme plus rapide étant donné qu'elle ne nécessite pas
d'analyse de la part de l'interpréteur PHP. En d'autres mots, PHP ne doit pas repérer et interpréter d'éventuelles variables
comme c'est la cas avec les apostrophes doubles.

Délimiteurs

Délimitation des chaînes de caractères avec des simple-quotes

1 - <?php
2 - // L'expression suivante donnera : <p>Numéro: $num</p>
3 - $num = 9;
4 - $str = '<p>Numéro: $num</p>';
5 - echo "$str<p>";
6 -
7 - // Récupération du premier caractère d'une chaîne
8 - $str = 'Ceci est un test.';
9 - $first = $str[0];
10 - echo $first . '<p>';
11 -
12 - // Récupération du dernier caractère d'une chaîne
13 - $str = 'Ceci est toujours un test.';
14 - $last = $str[strlen($str)-1];
15 - echo $last . '<p>';
16 - ?>

Lorsqu'on utilise les simple-quotes les variables présentes dans la chaîne ne seront pas substituées.
On y a recours pour :
- les chaînes de caractères sans besoin d'analyse
- le texte brut
page 39

Délimitation des chaînes de caractères avec des double-quotes

1 - <?php
2 - // Assignation d'une chaîne de caractères
3 - $phrase = "Bonjour le monde";
4 - echo "$phrase<br>";
5 -
6 - // Ajout d'une nouvelle chaîne de caractères (concaténation)
7 - $phrase = $phrase . " ceci est un test PHP\n";
8 - echo "$phrase<br>";
9 -
10 - // L'expression suivante donnera : <p>Numéro: 9</p>
11 - $num = 9;
12 - $str = "<p>Numéro: $num</p>";
13 - echo "$str<br>";
14 -
15 - // Récupération du premier caractère d'une chaîne
16 - $str = "Ceci est un test.";
17 - $first = $str[0];
18 - echo "$first<p>";
19 -
20 - // Récupération du dernier caractère d'une chaîne
21 - $str = "Ceci est toujours un test.";
22 - $last = $str[strlen($str)-1];
23 - echo "$last<p>";
24 - ?>

Lorsqu'on utilise les double-quotes les variables à l'intérieur de la chaîne de caractères seront remplacées
par leur valeur.
On y a recours pour :
- les chaînes contenant des caractères échappés (\n, \t)
- les chaînes contenant du texte brut plus des variables

Alternatives: syntaxe Nowdoc et Heredoc

1 - <?php
2 - $str = <<<'EOD'
3 - Donec ullamcorper nulla
4 - non metus auctor
5 - fringilla.
6 - EOD;
7 -
8 - // Commence par <<<'EOD'
9 - // Se termine par EOD;
10 - // Se comporte de la même façon que les simple-quotes
11 - // Pratique pour écrire plusieurs lignes
12 -
13 - $str = <<<EOD
14 - Integer posuere erat
15 - a ante venenatis
16 - dapibus posuere velit aliquet.
17 - EOD;
18 -
19 - // Commence par <<<EOD
20 - // Se termine par EOD;
21 - // Se comporte de la même façon que les double-quotes
22 - // Pratique pour écrire plusieurs lignes
23 -
24 - ?>

Accolades

En utilisant des double-quotes, la mention des variables peut parfois être problématique, notamment quand une variable
se retrouve collée à une autre lettre ou mot. Il suffit dans ce cas d'encadrer la variable avec des accolades pour lever
l'ambiguité.
page 40

Double-quotes et accolades

1 - <?php
2 - // Assignation d'une chaîne de caractères
3 - $annee = "2013";
4 - $mois = "02";
5 - $jour = "22";
6 -
7 - echo "Nous sommes le $jour-$mois-$annee, Bienvenue";
8 -
9 - echo "Nous sommes le {$jour}-{$mois}-{$annee}, Bienvenue";
10 - ?>

Caractère d'échappement

En php le caractère anti-slash '\' tient le rôle de caractère d'échappement. Il permet d'insérer dans des expressions des
caractères réservés et évite les substitutions. Il protège un et un seul caractère : celui qui le suit immédiatement.

Caractère d'échappement

1 - \n // traduit une nouvelle ligne


2 - \r // traduit un retour à la ligne
3 - \t // traduit une tabulation horizontale
4 - \\ // traduit un anti-slash
5 - \$ // traduit le caractère $
6 - \" // traduit un guillemet (double-quote)

Dans le cadre d'un développement Web, on rencontre très souvent le besoin d'échapper le caractère ". Il suffit, pour s'en
rendre compte, de prendre l'exemple de l'affichage à partir d'un script PHP d'un lien hypertexte HTML. L'instruction PHP
pour réaliser cela ressemble à ce qui suit :

echo "<a href=\"page2.html\">page suivante</a>";

On remarque qu'à l'intérieur de la chaîne de caractères traitée via l'instruction echo les guillements de l'attribut HTML href
sont protégés par le caractère anti-slash.

Taille des chaînes de caractères

PHP n'a, a priori, pas de limite quant à la taille que peut occuper une variable stockant une chaîne
de caractères. Il est possible que l'on se retrouve limité par les ressources du serveur mais ce cas
de figure se présentera rarement.
page 41

Syntaxe

Types de données - Tableaux

Les tableaux, des listes de valeurs ordonnées, constituent des 'incontournables' lorsqu'il s'agit de manipuler
des données dans un script PHP. Que ce soit pour l'analyse d'un fichier texte ou pour la réception de résultats
venant d'une base de données, leur utilisation s'impose.

Un tableau peut être vu comme une variable qui contient une liste. Chaque élément du tableau est une variable individuelle
associée à un indice/une clé. Pour donner un exemple trivial, vous pouvez créer un tableau de chaînes de caractères,
chacune contenant le nom d'un membre d'un club de sport. C'est un moyen aisé pour manipuler un groupe de valeurs.

PHP supporte deux types de tableaux : les tableaux scalaires et associatifs.

Quand les éléments d'un tableau peuvent être sélectionnés via des indices (ayant pour valeur des entiers positifs), on parle
alors de tableau scalaire : $members[2].

Quand les éléments d'un tableau peuvent être sélectionnés via des clés (représentées par des valeurs quelconques), on
parle alors de tableau associatif : $users[admin].

Tableaux à une dimension

Vous pouvez créer un tableau en utilisant la fonction array(), ou bien en affectant explicitement chacune des valeurs.

Création - assignation de tableaux

1 - <?php
2 - $campus = array("Solbosch", "Plaine", "Treignes", "Anderlecht");
3 - // Ajout d'un élément en 5e position
4 - $campus = "Gosselies";
5 -
6 - $chars[0] = "abc";
7 - $chars[1] = "def";
8 - // Ajout d'un élément au tableau $chars
9 - $chars[] = "ghi";
10 -
11 - ?>

Si aucune clé n'est précisée lors de la création d'un tableau, l'indice '+1' est utilisé comme clé par défaut.
Si aucun indice numérique n'a préalablement été affecté, la clé utilisée sera 0. Si dans une assignation on
précise une clé qui a déjà été affectée, la nouvelle valeur écrasera la précédente.

Tableaux à plusieurs dimensions

Les tableaux à plusieurs dimensions sont assez simples à manipuler. Schématiquement, pour chaque dimension du
tableau, il suffit d'ajouter une nouvelle [clé] d'indexation.
page 42

Tableaux à plusieurs dimensions

1 - <?php
2 - // tableau à une dimension
3 - $login[1]= "froland";
4 - $login["ftpadmin"] = "aline";
5 -
6 - // tableau à deux dimensions
7 - $user["administrator"]["name"] = "Jansens";
8 - $user["administrator"]["passwd"] = "2Rj*4M";
9 -
10 - // combinaison d'indices associatifs et numériques
11 - $members[1]["name"] = "Vargas";
12 - $members[1]["firstname"] = "Jan";
13 - ?>

Le tableau 'user' présente une première dimension qui contient, entre autres, un élément identifié par la clé
'administrator'. Celui-ci stocke un autre tableau dont deux des éléments ont respectivement pour clé 'name'
et 'passwd'.
page 43

Syntaxe
Types de données - Objets

PHP reprend la notion d'objets. Ceux-ci, comme pour les langages dits "orientés objets" (tels que Java, C++,
Python ...), sont censés représentés des éléments du monde réel.

Un objet est caractérisé par des attributs, qui enregistrent des informations sur l'état de l'objet, et par des méthodes, qui
fixent les opérations que l'objet est capable d'exécuter.

- Les attributs sont stockés dans des variables


- Les méthodes sont implémentées de manière similaire à celle des fonctions

Les objets appartiennent à des classes. C'est dans celles-ci que sont définies les structures générales des objets. Ce n'est
qu' à partir d'une classe que sera instancié un objet. De façon plus imagée on peut dire que le lien entre classe et objets
est comparable à celui qui existe entre un moule et les objets que celui-ci permet de fabriquer.

- L'instruction 'class' permet de définir une classe


- Une classe contient les attributs et les méthodes qui seront liés aux objets, c'est-à-dire -pour faire simple- des
définitions de variables et de fonctions

Un objet est instancié et associé à une variable via l'instruction 'new'. Les attributs et les méthodes sont appliqués à un
objet en utilisant l'instruction '->'.

Définition d'une classe


1 - <?php
2 - class dossier
3 - {
4 - private $nom;
5 - private $fichiers;
6 -
7 - function __construct($valeur)
8 - {
9 - $this->nom = $valeur;
10 - $this->fichiers = array();
11 - }
12 -
13 - function ajouter_fichier($nom_fichier)
14 - {
15 - $this->fichiers[] = $nom_fichier;
16 - }
17 - }
18 -
19 - ?>

Création d'un objet


1 - <?php
2 - ... code précédent ...
3 -
4 - $dossier = new dossier("maison");
5 - $dossier->ajouter_fichier("chauffage");
6 -
7 - $dossier = new dossier("vacances");
8 - $dossier->ajouter_fichier("reservation");
9 - $dossier->ajouter_fichier("budget");
10 - ?>

De l'extérieur d'une classe, on accède aux propriétés et aux méthodes d'un objet via l'opérateur '->'. De
l'intérieur d'une classe, on y accède avec l'instruction '$this->'. La variable spéciale '$this' peut être vue
comme ayant la signification "moi-même", ou bien "l'objet courant".
page 44

PHP propose évidemment d'autres fonctionnalités venant compléter l'approche "orienté objet" comme :

- les constructeurs et destructeurs de classes


- la visibilité des méthodes
- l'héritage
- la gestion des exceptions
- les classes et les méthodes abstraites
- les interfaces
- le typage d'objet

Nous n'aborderons cependant pas ces différents aspects car ils dépassent largement le cadre de cette inititiation à la
programmation PHP et nécessiteraient d'y consacrer beaucoup plus de temps. Pour plus d'information :
http://www.php.net/manual/fr/language.oop5.php
page 45

Syntaxe

Types de données - Transtypage

PHP peut être présenté comme un langage "non typé" ou "dynamiquement typé". Cela veut dire qu'en PHP le
type d'une variable est déterminé en fonction de son contexte d'utilisation.

Certains cas nécessitent cependant de s'assurer que les données que l'on va exploiter correspondent sans équivoque à
un type précis mieux adapté au travail à effectuer. On aura alors recours au "type casting" (transtypage), c'est-à-dire le
passage d'une valeur dans un type donné. On réalise cela en PHP comme en C : le nom du type désiré est écrit entre
parenthèses devant la variable à transtyper.

Les conversions possibles :

(int) , (integer) - convertit en un type entier


(bool) , (boolean) - convertit en un type booléen
(double) , (float) , (real) - convertit en un type double
(string) - convertit en un type chaîne de caractère
(array) - convertit en un type tableau
(object) - convertit en un type objet

Exemples de conversion

1 - <?php
2 - $var1 = 10; // $var1 est un entier
3 - $var2 = (double) $var2; // $var2 est un double
4 - ?>
5 -
6 - <?php
7 - $var1 = 10; // $var1 est un entier
8 - $var2 = (string) $var2; // $var2 est un string
9 - ?>
page 46

Syntaxe

Constantes - Constantes prédéfinies

Le langage PHP définit un certain nombre de constantes et propose des mécanismes pour en définir d'autres
durant l'exécution du programme. La valeur affectée à une constante est fixée une seule fois et ne peut être
modifiée par la suite. Par convention, les noms des constantes sont indiqués en majuscules.

Exemples de constantes prédéfinies

__FILE__
Le nom du fichier qui est actuellement exécuté. Si cette constante est utilisée dans le cadre d'un fichier "inclus" (ou require),
alors le nom du fichier inclus est renvoyé, et non le nom du fichier parent.

__LINE__
Le numéro de la ligne qui est actuellement exécutée. Si cette constante est utilisée dans le cadre d'un fichier "inclus" (ou
require) c'est la position dans le fichier inclus qui est renvoyé.

PHP_VERSION
La chaîne de caractères de présentation de la version de PHP qui est actuellement utilisée. Par exemple '3.0.8-dev'.

PHP_OS
Nom du Système d'exploitation qui est utilisé par la machine qui fait tourner le PHP. Par exemple, 'Linux'.

Utilisation des constantes __FILE__ et __LINE__

1 - <?php
2 - function report_error($file, $line, $message)
3 - {
4 - echo "Erreur dans le fichier $file à la ligne $line:
5 - $message.";
6 - }
7 -
8 - report_error(__FILE__, __LINE__, "utilisateur inconnu");
9 - ?>

Ces deux constantes sont utilisées pour préciser un contexte lorsqu'une erreur survient dans l'exécution
d'un script .
page 47

Syntaxe

Constantes - Définition de constantes

Il est possible de définir ses propres constantes en utilisant la fonction define(). Celles-ci peuvent contenir des
données relevant des types booléens, nombres entiers, nombres à virgules flottantes et chaînes de caractères.

Syntaxe : define(name, value)

Le premier paramètre de cette commande est le nom de la constante que l'on veut créer. Par convention ce nom est
indiqué en majuscules. Le deuxième paramètre correspond à la valeur qui doit être associée à la constante.

Une fois définies, les constantes peuvent être utilisées dans les scripts à peu près de la même manière que les variables.
Il suffit de les appeler par leur nom (sans le signe '$', à la différence des variables).

Définition de constantes

1 - <?php
2 - define ("HOME", "http://www.monsite.be/");
3 - define ("EMAIL", "webmaster@monsite.be");
4 -
5 - echo "Adresse de la page d'accueil :" . HOME . "<br>";
6 - echo "Adresse de contact :" . EMAIL;
7 - ?>

Les constantes sont accessibles globalement (on peut donc y faire référence à partir de n'importe quel
endroit du script). On y accède en précisant simplement leur nom.
page 48

Syntaxe

Opérateurs - Opérateurs arithmétiques

Les opérateurs sont utilisés pour combiner un ou plusieurs opérandes au sein d'une expression. Un opérateur
produit une nouvelle valeur (résultat) à partir d'une ou plusieurs autres valeurs (opérandes). Par exemple, + est un
opérateur car il prend deux nombres (les opérandes, comme 4 et 3), et produit une nouvelle valeur (7, le résultat).

Expressions et opérateurs

1 - 5 // expression réduite à un opérande


2 - a // expression réduite à un opérande
3 - 2 + 8 // 2 plus 8, soit 10
4 - 3 * 3 // 3 fois 3, soit 9

Les opérateurs arithmétiques sont au nombre de 5: le signe '+' pour l'addition de deux nombres, le signe '-' pour la
soustraction, le signe '*' pour la multiplication, le signe '/' pour la division et le signe '%' pour le modulo.

Utilisation des opérateurs arithmétiques

1 - <?php
2 - $a = 42;
3 - $b = 5;
4 -
5 - $c = $a + $b;
6 - echo "résultat de l'addition : $c<br/>";
7 - $c = $a - $b;
8 - echo "résultat de la soustraction : $c<br/>";
9 - $c = $a * $b;
10 - echo "résultat de la multiplication : $c<br/>";
11 - $c = $a / $b;
12 - echo "résultat de la division : $c<br/>";
13 - $c = $a % $b;
14 - echo "résultat du modulo : $c<br/>";
15 - ?>

L'opérateur modulo fournit pour résultat le reste de la division d'un entier par un entier.
page 49

Syntaxe

Opérateurs - Opérateurs de chaînes de caractères

Les opérateurs de chaînes de caractères sont au nombre de deux: l'opérateur de concaténation (.) (c'est-à-dire
l'enchaînement de plusieurs éléments) et l'opérateur d'assignation avec concaténation (.=).

Le caractère point '.' permet de concaténer variables et chaînes de caractères.

Concaténation '.'

1 - <?php
2 - $partie1 = "Bonjour";
3 - $partie2 = " tout le monde";
4 - $partie3 = $partie1 . $partie2;
5 -
6 - echo $partie1;
7 - // retourne "Bonjour"
8 -
9 - echo $partie1 . " à tous";
10 - // retourne "Bonjour à tous"
11 -
12 - echo $partie1 . $partie2;
13 - // retourne "Bonjour tout le monde"
14 -
15 - echo $partie3;
16 - // retourne "Bonjour tout le monde"
17 - ?>

Une variante de cette formule est envisageable lorsque l'on fait appel à la commande 'echo'. Dans ce cas, le caractère
virgule ',' donne lieu également à une opération de concaténation.

Concaténation avec une virgule pour la commande 'echo'

1 - <?php
2 - $partie1 = "Bonjour";
3 - echo $partie1, " et bienvenue";
4 - // retourne "Bonjour et bienvenue"
5 - ?>

Attention : uniquement possible avec la fonction 'echo'.

L'opération d'assignation avec concaténation est effectuée -elle- via la suite de caractères '.=' .

Assignation avec concaténation

1 - <?php
2 - $message = "Bienvenue";
3 - $message2 = " sur notre site";
4 -
5 - $message .= $message2;
6 - echo "<p>$message";
7 - // retourne "Bienvenue sur notre site";
8 - ?>
page 50

Syntaxe

Opérateurs - Opérateurs d'affectation

L'opérateur d'affectation permet d'assigner une valeur à une variable (opérande de gauche) à partir d'une
expression donnée par l'opérande de droite. L'opération d'affectation se traduit par le signe '='. Dans un souci
d'économie d'écriture, celui-ci peut être combiné aux opérateurs arithmétiques et de concaténation (à titre
d'exemple, la suite de caractères '+=' va alors impliquer une addition plus une assignation).

Utilisation des opérateurs d'affectation

1 - <?php
2 - $a = 42;
3 - $b = 5;
4 - $c = 10;
5 -
6 - $a -= $b;
7 - echo "<p>le résultat de (\$a-=\$b) est : $a";
8 - $b += 5;
9 - echo "<p>le résultat de (\$a+=\$b) est : $b";
10 - $c *= $c;
11 - echo "<p>le résultat de l'opération (\$c*=\$c) est : $c";
12 - ?>

Le caractère anti-slash (\) est ici utilisé pour "protéger" le caractère spécial $ dans l'instruction 'echo': $a
n'est donc pas considéré comme une référence à une variable mais bien comme une simple chaîne de
caractères.
page 51

Syntaxe

Opérateurs - Opérateurs de comparaison

Ces opérateurs permettent de comparer deux opérandes de même nature. Ils retournent une valeur booléenne
(true ou false) si l'expression de comparaison est vérifiée. On peut tester si une valeur est égale à une autre (==),
différente d'une autre (!=), plus petite (<), plus grande (>) ...

Utilisation des opérateurs de comparaison

1 - <?php
2 - $a = 42;
3 - $b = 5;
4 - $c = 10;
5 -
6 - if ($a == $b)
7 - {
8 - echo "<p>\$a est égal à \$b";
9 - }
10 - else
11 - {
12 - echo "<p>\$a n'est pas égal à \$b";
13 - }
14 -
15 - if ($a > $b)
16 - {
17 - echo "<p>\$a est plus grand que \$b";
18 - }
19 - else
20 - {
21 - echo "<p>\$a n'est pas plus grand que \$b";
22 - }
23 - ?>

Attention, le test d'égalité se fait via l'opérateur '==' et non '=' (ce dernier impliquant une affectation).
page 52

Syntaxe

Opérateurs - Opérateurs logiques

Ces opérateurs permettent la combinaison de valeurs booléennes dans une expression. La suite de caractères
'&&' est utilisée pour exprimer le ET logique, tandis que la suite '||' est utilisée pour exprimer le OU logique.

Utilisation des opérateurs logiques

1 - <?php
2 - $a = 42;
3 - $b = 42;
4 - $c = 10;
5 -
6 - if (($a == $b) and ($a == $c))
7 - {
8 - echo "<p>\$a est égal à \$b et \$c";
9 - }
10 -
11 - if (($a == $b) || ($a == $c))
12 - {
13 - echo "<p>\$a est égal à \$b ou \$c";
14 - }
15 - else
16 - {
17 - echo "<p>\$a est différent de \$b et \$c";
18 - }
19 - ?>

Dans le cas d'une combinaison d'opérateurs logiques dans une expression, les opérateurs '&&' et '||' ont une
priorité plus grande que les opérateurs 'and' et 'or'.
page 53

Syntaxe

Opérateurs - Opérateurs d'incrémentation/décrémentation

Les opérateurs d'incrémentation/décrémentation ('++' et '--') ajoutent ou soustraient 1 à une variable.

Post-incrémentation/decrémentation

variable++

variable--

La forme de post-incrémentation de l'opérateur (variable++) ajoute 1 à l'expression et renvoie la valeur initiale de la variable
(la valeur avant l'addition).

Valeur retournée par l'opérateur de post-incrémentation

1 - $x = 1;
2 - $y = $x++;
3 - // $y vaut 1 et $x est égal à 2

Utilisation de l'opérateur de post-incrémentation dans une boucle

1 - $i = 0;
2 - while($i++ < 5)
3 - {
4 - echo "ceci est l'exécution " . $i;
5 - }
6 -
7 - /*
8 - ce script retourne le résultat suivant:
9 - ceci est l'exécution 1
10 - ceci est l'exécution 2
11 - ceci est l'exécution 3
12 - ceci est l'exécution 4
13 - ceci est l'exécution 5
14 - */

Les passages dans la boucle while sont conditionnés par l'incrémentation de la variable $i. Dans cet
exemple 5 passages vont être réalisés.

Pré-incrémentation/decrémentation

++variable

--variable

La forme de pré-incrémentation de l'opérateur (++variable) ajoute 1 à la variable et renvoie le résultat.

Valeur retournée par l'opérateur de pré-incrémentation

1 - $x = 1;
2 - $y = ++$x;
3 - // $y vaut 2 et $x est égal à 2
page 54

Syntaxe

Structures de contrôle - Instruction conditionnelle 'if'

L'instruction if permet l'exécution conditionnelle d'une partie de code. En d'autres mots, l'exécution d'une
action ou d'une séquence d'actions se fait à partir du moment où une condition est vérifiée.

Syntaxe : if (expr) {instruction(s)}

Si l'expression 'expr' est "vraie" (true), PHP exécute l'instruction; si elle est fausse (false), l'instruction est ignorée.

Utilisation de l'instruction 'if'

1 - <?php
2 - $a = 42;
3 - $b = 42;
4 -
5 - if ($a == $b)
6 - echo "<p>\$a est égal à \$b";
7 - ?>

Le script ci-dessus affiche la phrase 'a est égal à b' si $a est plus grand que $b.

Si plusieurs instructions doivent être exécutées après un branchement conditionnel, il faut rassembler toutes les instructions
en un seul bloc compris entre accolades.

Bloc d'instructions

1 - <?php
2 - $a = 42;
3 - $b = 42;
4 - $c = 0;
5 -
6 - if ($a == $b)
7 - {
8 - echo "<p>\$a est égal à \$b";
9 - $c = 1;
10 - }
11 - ?>

Le script ci-dessus affiche '$a est égal à $b', et assigne la valeur '1' à la variable $c.

Si la condition n'est pas remplie, il est possible de faire exécuter une deuxième instruction ou un deuxième groupe
d'instructions en utilisant le mot clé 'else'.

Syntaxe : if (expr) {instruction(s)} else {instruction(s)}


page 55

'if' et 'else'

1 - <?php
2 - $a = 42;
3 - $b = 33;
4 - $c = 0;
5 -
6 - if ($a == $b)
7 - {
8 - echo "<p>\$a est égal à \$b";
9 - $c = 1;
10 - }
11 - else
12 - {
13 - echo "<p>\$a est différent de \$b";
14 - }
15 - ?>

Le script ci-dessus affiche '$a est différent de $b' si la condition n'est pas remplie.

PHP autorise l'imbrication de nombreuses instructions "if" les unes dans les autres.
page 56

Syntaxe

Structures de contrôle - Instruction conditionnelle 'elseif'

Dans le cas où une première condition -introduite par 'if'- n'est pas remplie, l'expression 'elseif' permet
d'exécuter une deuxième instruction (ou un deuxième ensemble d'instructions) en fonction d'une deuxième
condition.

Syntaxe : elseif (expr) {instruction(s)}

Utilisation de l'instruction 'elseif'

1 - <?php
2 - $privilege = "user";
3 -
4 - if ($privilege == "admin")
5 - {
6 - print "Interface d'administration";
7 - }
8 - elseif ($privilege == "user")
9 - {
10 - print "Interface de consultation";
11 - }
12 - else
13 - {
14 - print "Accès limité";
15 - }
16 - ?>

Si la première condition est évaluée à 'false', la seconde est prise en compte. Si aucune des deux conditions
n'est remplie, c'est l'instruction 'else' qui intervient.
Plusieurs instructions 'elseif' peuvent se suivrent dans une séquence 'if'.
page 57

Syntaxe

Structures de contrôle - Instruction d'affectation conditionnelle

L'opérateur ternaire est utilisé en tant que syntaxe réduite permettant de traduire une affectation conditionnelle.

Syntaxe : (A) ? B : C

Dans cette structure, le caractère "?" teste si la condition qui le précède (A) est vrai ou fausse. Si elle est vérifiée,
l'interpréteur retourne la valeur précisée directement après le caractère "?"; si elle est fausse, l'interpréteur retourne ce
qui suit le caractère ":".

Syntaxe : Si A alors le résultat retourné est B sinon c'est C

Voyons un exemple d'utilisation de l'opérateur ternaire dans une instruction PHP :

Affectation conditionnelle en PHP

1 - <?php
2 - $text = ($action=="insert") ? "Insert into DB" : "default";
3 - ?>

Si la variable $action vaut "insert" alors la chaîne de caractères "Insert into DB" est affectée à la variable
$text; sinon c'est "default" qui est affecté.

Ce qui correspond, en fait, à la structure plus commune :

1 - <?php
2 - if($action=="insert")
3 - {
4 - $message="Insert into the DB";
5 - }
6 - else
7 - {
8 - $message ="default";
9 - }
10 - ?>

Cette syntaxe fournit un moyen compact d'écrire une affectation conditionnée, entre autres, pour récupérer les valeurs
d'un formulaire web.

Récupération des champs d'un formulaire

1 - <?php
2 - $city=(!empty($_POST["city"])) ? $_POST["city"] : "unknown";
3 - $date=(!empty($_POST["date"])) ? $_POST["date"] : date('Y.m.d');
4 - $lang=(!empty($_POST["lang"])) ? $_POST["lang"] : "english";
5 - ?>
page 58

Syntaxe

Structures de contrôle - Instruction de boucle 'while'

'while' permet de répéter une instruction ou un groupe d'instructions (placé entre accolades) tant qu'une
condition est remplie.

Syntaxe : while (expression) {instruction(s)}

La condition -placée entre parenthèses- prend la forme d'une expression qui doit retourner une valeur booléenne (true
ou false).

Utilisation de l'instruction 'while'

1 - <?php
2 - $i = 0;
3 - while ($i != 10)
4 - {
5 - print $i;
6 - $i++;
7 - }
8 - ?>

Ce script donne pour résultat l'affichage des nombres de 0 à 9.


page 59

Syntaxe

Structures de contrôle - Instruction de boucle 'do while'

La structure 'do - while' est semblable à la structure 'while', avec la différence suivante : dans une boucle 'do -
while' l'instruction ou le groupe d'instructions est exécuté au moins une fois, la condition n'étant évaluée qu'après
la première itération.

Syntaxe : do {instruction(s)} while (condition)

Ainsi, le groupe d'instructions est exécuté au moins une fois et aussi longtemps que la condition est remplie.

Utilisation de l'instruction 'do while'

1 - <?php
2 - $i = 0;
3 - do
4 - {
5 - print $i;
6 - }
7 - while ($i != 0);
8 - ?>

Dans ce script l'instruction 'print $i' sera exécutée au moins une fois car la condition n'est évaluée qu'après
le bloc d'instructions.

En pratique, la structure "do - while" n'est pas aussi fréquente que la structure "while".
page 60

Syntaxe

Structures de contrôle - Instruction de boucle 'for'

'for' permet de répéter une instruction ou un groupe d'instructions (à placer entre accolades) en faisant
progresser la valeur d'une ou plusieurs variables.

Elle est composée du mot clé 'for' suivi de trois expressions séparées par des points-virgules et placées entre parenthèses,
suivies des instructions à répéter.

Syntaxe : for (expr1; expr2; expr3) {instruction(s)}

- La première expression 'expr1' est d'office prise en compte avant le passage de la boucle. Elle est utilisée pour
initialiser les données de la boucle.
- L'expression 'expr2' est évaluée avant chaque passage de la boucle. Si le résultat de cette évaluation vaut 'true', la
boucle est parcourue et l'instruction (ou le groupe d'instructions) est exécutée. Par contre, si le résultat vaut 'false',
l'exécution de la boucle est interrompue.
- L'expression 'expr3' est évaluée à la fin de chaque passage de la boucle. Elle est utilisée pour réinitialiser les
données de la boucle.

Utilisation de l'instruction 'for'

1 - <?php
2 - for ($i = 0; $i != 10; $i++)
3 - {
4 - print $i;
5 - }
6 - ?>

Ce script donne pour résultat l'affichage des nombres de 0 à 9.

Si l'on fait la comparaison avec la structure 'while', la structure 'for' est équivalente à ce qui suit :

Comparaison 'for'/'while'

1 - <?php
2 - expr1;
3 - while ( expr2 )
4 - {
5 - instruction(s);
6 - expr3;
7 - }
8 - ?>

Dans cette structure, tant que l'expression 'expr2' fournit une valeur différente de zéro, le bloc d'instructions
est exécuté et l'expression 'expr3' est évaluée.
Le choix entre les structures 'for' et 'while' n'est la plupart du temps qu'une question de préférence ou
d'habitudes.
page 61

Syntaxe

Structures de contrôle - Instruction d'interruption 'break'

Cette instruction permet de sortir d'une structure for, while, ou switch et ainsi de stopper le traitement en cours.

Syntaxe : break

La sortie de la boucle se fait sans considération des conditions de la boucle.

Utilisation de 'break' dans une structure 'while'

1 - <?php
2 - $order = array('write', 'read', 'stop', 'delete');
3 - $i = 0;
4 - while ($i != 4)
5 - {
6 - if ($order[$i] == "stop")
7 - {
8 - break;
9 - }
10 - print "$order[$i]<br>" ;
11 - $i++;
12 - }
13 - ?>

Si le test ($order[$i] == "stop") est évalué à 'true' alors on sort de la boucle.

Utilisation de 'break' dans une structure 'for'

1 - <?php
2 - $order = array('write', 'read', 'stop', 'delete');
3 - for ($i = 0; $i != 4; $i++)
4 - {
5 - if ($order[$i] == 'stop')
6 - {
7 - break;
8 - }
9 - print "$order[$i]<br>";
10 - }
11 - ?>

Ce script affiche les valeurs 'write' et 'read'.


page 62

Syntaxe

Structures de contrôle - Instruction 'continue'

L'instruction 'continue' a pour effet dans une boucle de " désactiver " les instructions de l'itération courante
et de passer directement à l'itération suivante.

Syntaxe : continue

Utilisation de 'continue' dans une structure 'while'

1 - <?php
2 - $order = array('write', 'read', 'stop', 'delete');
3 - $i = 0;
4 - while ($i != 4)
5 - {
6 - if ($order[$i] == 'stop')
7 - {
8 - $i++;
9 - continue;
10 - }
11 - print $order[$i] . '<br>';
12 - $i++;
13 - }
14 - ?>

Si le test ($order[$i] == "stop") est évalué à 'true' l'instruction (ou le groupe d'instructions) de la boucle est
ignoré et l'on passe à l'itération suivante.

Utilisation de 'continue' dans une structure 'for'

1 - <?php
2 - $order = array('write', 'read', 'stop', 'delete');
3 - for ($i = 0; $i != 4; $i++)
4 - {
5 - if ($order[$i] == 'stop')
6 - {
7 - continue;
8 - }
9 - print $order[$i] . '<br>' ;
10 - }
11 - ?>

Ce script affiche les valeurs 'write' 'read' 'delete' et 'insert'.


page 63

Syntaxe

Structures de contrôle - Instruction de sélection 'switch'

'switch' est une structure de choix. Elle évalue l'expression précisée entre parenthèses et en compare le résultat
aux valeurs indiquées dans les différents éléments 'case' présents dans le bloc 'switch'. Dès qu'une valeur est
égale au résultat de l'expression, l'instruction ou le bloc d'instructions qui suit le signe deux-points est exécuté.
L'instruction 'switch' exécute chacune des clauses selon leur ordre d'apparition, excepté s'il rencontre l'instruction
break.

Syntaxe : switch (expression)


{
case value1 : instruction(s) ;
case value2 : instruction(s) ;
case value3 : instruction(s) ;
}

Utilisation de l'instruction 'switch'

1 - <?php
2 - $i= 2;
3 - switch ($i)
4 - {
5 - case 0:
6 - print "i égal 0";
7 - break;
8 - case 1:
9 - print "i égal 1";
10 - break;
11 - case 2:
12 - print "i égal 2";
13 - break;
14 - default:
15 - print "i n'est pas égal à 0, 1 ou 2";
16 - }
17 - ?>

L'exécution des instructions commence au case dont la valeur correspond à la valeur de sélection (en
l'occurrence 'case 2'). Cette exécution se poursuit jusqu'à une instruction 'break' ou jusqu'à la fin du bloc
'switch'. Si aucun 'case' n'est vérifié, la clause default est prise en compte.

Une structure de choix comme celle présentée ci-dessus peut également être traduite en programmation via les instructions
'if - elseif', mais cette écriture est généralement considérée comme plus lourde et moins explicite. Lorsque l'on doit comparer
la valeur d'une variable à un certain nombre de valeurs constantes on utilise donc de préférence 'switch'.
page 64

Comparaison switch/if - elseif

1 - <?php
2 - $i= 2;
3 - if ($i == 0)
4 - {
5 - print "i égal 0";
6 - }
7 - elseif ($i == 1)
8 - {
9 - print "i égal 1";
10 - }
11 - elseif ($i == 2)
12 - {
13 - print "i égal 2";
14 - }
15 - else
16 - {
17 - print "i n'est pas égal à 0, 1 ou 2";
18 - }
19 - ?>

Ce script affiche "i égal 2".


page 65

Syntaxe

Structures de contrôle - Instruction d'inclusion 'include'

L'instruction 'include' inclut et évalue le fichier php spécifié en argument. Cela se produit à chaque fois que
la fonction 'include' est rencontrée dans le script. Le fichier inclus fera partie intégrante du code du script où se
trouve la fonction include (page ou script hôte).

Syntaxe : include('filename')

Opération d'include de fichiers php

La fonction 'include' inclut le contenu d'un script PHP dans un autre script PHP. Elle permet ainsi de rendre
les scripts plus modulaires.

Cette instruction peut d'ailleurs être vue comme une façon d'appeler et de rendre disponibles dans un script des
"bibliothèques" d'outils.
page 66

Appel à des bibliothèques externes

1 - <?php
2 - include('tools/db_access.inc.php');
3 - include('tools/web_logs.inc.php');
4 - include('tools/security.inc.php');
5 - include('tools/design.inc.php');
6 -
7 - // ... suite du code ...
8 -
9 -
10 - ?>

Le code PHP contenu dans les fichiers externes est ainsi exécuté et mis à disposition du script appelant.
Ces codes externes peuvent consister en des définitions de variables, des définitions de fonctions ou de
classes, des gestions de sessions, des instructions de logging ...

Il est également possible d'utiliser la fonction 'include' dans une structure de boucle pour inclure et évaluer un nombre
indéfini de fichiers.

Utilisation de l'instruction 'include' dans une boucle

1 - <?php
2 - $files=array('first.inc.php','second.inc.php','third.inc.php');
3 - for ($i = 0; $i != count($files); $i++)
4 - {
5 - include $files[$i];
6 - }
7 - ?>

A chaque passage dans la boucle, l'opération d'inclusion est effectuée.


page 67

Syntaxe

Fonctions - Modularité

Afin de garder son code source clair et afin d'éviter trop de redondances dans un programme, c'est-à-dire la
répétition inutile de groupes d'instructions, on s'attache toujours à donner une structure modulaire au programme.

Dans cette optique, on décompose le problème en une série de sous-procédures auxquelles on confie un aspect particulier
de la résolution du problème. Le programme global peut ensuite accéder librement, à plusieurs reprises et de n'importe
quel endroit de son code, aux modules ainsi constitués.

En PHP, ces sous-programmes sont appelés des fonctions. Ce sont des structures de programmation autonomes qui
peuvent être insérées dans n'importe quel script. L'utilisateur qui crée une fonction peut y inclure toutes les instructions
qu'il juge utiles pour atteindre son objectif. La définition d'une fonction peut se situer à n'importe quel endroit du code du
programme. Les fonctions peuvent recevoir des arguments, traiter l'information et retourner un résultat.

Si le langage PHP permet au programmeur de définir ses propres fonctions, il comprend également un grand nombre
de fonctions prédéfinies portant sur les systèmes de fichiers, les accès bases de données, les dates, les protocoles de
communication, le cryptage ...
page 68

Syntaxe

Fonctions - Définition et appel de fonctions

Une fonction est une procédure (ou un ensemble d'instructions) utilisée pour effectuer une tâche particulière;
elle doit toujours être déclarée avant de pouvoir être appelée et exécutée (à l'aide d'une instruction d'appel de
fonction).

Définition de fonction

La définition d'une fonction enregistre le nom, la liste des paramètres et le contenu de la fonction en vue de son exécution
ultérieure, qui se fera grâce à une instruction d'appel de fonction.

Syntaxe : function name ([arguments])


{
instruction(s)
}

Définition d'une fonction

1 - <?php
2 - function header_page($title, $bgcolor)
3 - {
4 - echo "<html>
5 - <head><title>$title</title></head>
6 - <body bgcolor=\"$bgcolor\">";
7 - }
8 -
9 - function footer_page()
10 - {
11 - echo "<hr>
12 - </body>
13 - </html>";
14 - }
15 - ?>

Les fonctions PHP peuvent utiliser un, plusieurs ou aucun paramètres. Attention, même si une fonction ne
prend aucun paramètre il faut toujours toutefois employer des parenthèses vides (comme dans la deuxième
définition de fonction présentée ci-dessus).

Appel de fonction

L'appel d'une fonction consiste à donner une valeur à chacun de ses paramètres et à exécuter les instructions qu'elle
contient.

Syntaxe : function_name(arguments)
page 69

Utilisation d'une fonction

1 - <?php
2 - // Définition d'une fonction
3 - function header_page($title, $bgcolor)
4 - {
5 - echo "<html>
6 - <head><title>$title</title></head>
7 - <body bgcolor=\"$bgcolor\">";
8 - }
9 -
10 - // Définition d'une fonction
11 - function footer_page($email)
12 - {
13 - echo "<hr>
14 - Email: $email
15 - </body>
16 - </html>";
17 - }
18 -
19 - // Appel d'une fonction
20 - header_page("Cours PHP", "#cccccc");
21 -
22 - echo "<h1>Utilisation des fonctions</h1>";
23 -
24 - // Appel d'une fonction
25 - footer_page("info@sky.net");
26 - ?>

Cette instruction peut être considérée comme un moyen de rendre modulaire un script php.
Appliquée au problème de la génération du code HTML dans une application de type intranet, cette
façon de faire se révèle fort utile: vous rejeter sur une fonction, ou plutôt sur un ensemble de fonctions,
la responsabilité d'afficher les codes HTML adéquats. Les erreurs d'encodage sont ainsi réduites, les
répititions inutiles se font plus rares et la mise à jour de vos scripts s'en trouve facilitée.

Retour de fonction

Une fonction peut optionnellement retourner une valeur, à l'aide de l'instruction return. Dans ce cas, elle peut être utilisée
comme un opérande au sein d'une expression.

L'instruction return peut en effet être mise en oeuvre afin de renvoyer une valeur en tant que résultat de l'appel d'une
fonction. A noter que dès que le mot-clé 'return' est rencontré l'exécution de la fonction est interrompue.

Sortie d'une fonction

1 - <?php
2 - function valplus($a, $b)
3 - {
4 - $c = $a + $b:
5 - return $c;
6 - }
7 -
8 - $result = valplus(8, 6);
9 - ?>

Cette fonction additionne deux valeurs et retourne le résultat.


page 70

Retour de plusieurs valeurs

1 - <?php
2 - function calceval($a, $b)
3 - {
4 - $add = $a + $b;
5 - $min = $a - $b;
6 - return array($add, $min);
7 - }
8 -
9 - $result = calceval(8, 6);
10 - echo "Addition : " . $result[1] . "<br/>";
11 - echo "Soustraction : " . $result[2] . "<br/>";
12 - ?>

Via l'utilisation d'un tableau (array), cette fonction est capable de retourner plusieurs valeurs.

Valeurs par défaut des arguments

Il est possible de fixer des valeurs par défaut pour les arguments pris en compte par une fonction. Ces valeurs doivent
être précisées en tant que constantes.

Cette utilisation de valeurs par défaut permet que certains arguments soient omis lors de l'appel d'une fonction. Par contre
si des valeurs sont précisées dans l'instruction d'appel alors celles-ci "écraseront" les valeurs par défaut.

Valeurs par défaut

1 - <?php
2 - function header_page($title, $bgcolor = "red")
3 - {
4 - echo "<html>
5 - <head><title>$title</title></head>
6 - <body bgcolor=\"$bgcolor\">";
7 - }
8 -
9 - function footer_page($email = "info@cicrumnet.be")
10 - {
11 - echo "<hr>
12 - Email: $email
13 - </body>
14 - </html>";
15 - }
16 -
17 - header_page("Cours PHP");
18 -
19 - echo "<h1>Utilisation des fonctions</h1>";
20 -
21 - footer_page();
22 - ?>

A l'affichage le document html aura bien une couleur de fond "red" et le bas de page reprendra l'adresse
email 'info@cicrumnet.be'.

Attention, pour que ce système fonctionne correctement il faut impérativement que les éléments avec des valeurs par
défaut soient placés en fin de liste des arguments de la fonction.
page 71

Erreurs courantes

Types d'erreurs

Lors du développement de scripts PHP on rencontre inévitablement un certain nombre d'erreurs. Celles-ci
peuvent entraîner l'arrêt de l'exécution des scripts, des résultats erronés ainsi que des faiblesses au niveau de la
sécurité. Ce n'est pourtant certainement pas à prendre comme une catastrophe, on peut même dire que cela fait
partie du processus normal de construction d'un script. Il faut cependant apprendre à les détecter, les analyser et
les corriger afin d'éviter que ces erreurs ne mettent en danger tout votre travail. A travers ce chapitre, nous allons
essayer de mettre en évidence les erreurs les plus courantes.

Erreurs syntaxiques

Les erreurs syntaxiques (ou grammaticales) empêchent le moteur PHP d'exécuter le script - il est mis dans l'impossibilité
de comprendre et d'interpréter les commandes qui lui sont fournies via le script. Dans ce cas PHP affiche un message
d'erreur du type 'Parse error: ... on line x'. La signification de ce message n'est pas toujours évidente mais reste néanmoins
une aide certaine afin de localiser le problème. Voici quelques erreurs 'typiques':

- non-respect des minuscules/majuscules dans les noms de variables et de fonctions


- faute de frappe dans les noms de variables et de fonctions
- oubli du séparateur d'instructions
- délimitation incorrecte des chaînes de caractères
- fermeture incorrecte des structures de contrôle

Erreurs de logique

Les erreurs de logique sont plus difficiles à traiter. Elles n'entraînent pas nécessairement l'interruption de l'exécution du
script; elles génèrent souvent des résultats erronés par rapport aux buts du programme ou pas de résultat du tout. On peut
donc passer pas mal de temps à essayer de les repérer. Voici quelques erreurs 'typiques':

- analyse et postulats erronés


- exécution infinie d'une boucle
- division par zéro
- opérateur d'assignation utilisé à la place d'un test d'égalité

Erreurs d'exécution

La syntaxe du script est correcte. La logique du script est bonne. Pourtant des erreurs surviennent lors de l'exécution.
Différentes sources peuvent en être la cause:

- lecture d'un fichier qui n'existe pas


- manipulation d'un fichier sans respecter les droits d'accès
- référence à une fonction qui n'existe pas
- interaction avec une base de données (problème d'identification, sql incorrect)
page 72

Erreurs courantes

Questions clés

Voici une liste de questions qu'il est bon de se poser lorsque l'on est confronté à un script qui ne fonctionne
pas ou qui ne fournit pas la solution prévue. Les développeurs débutants en PHP devrait s'en servir comme d'un
pense-bête.

- Les séparateurs d'instructions (;) sont-ils placés correctement ? N'en avez-vous pas oublié un ? N'en avez-vous pas
placé un en trop ?
- Etes-vous certain de ne pas avoir utilisé l'opérateur d'assignation (=) en lieu et place de l'opérateur de comparaison
(==) ?
- Vos blocs d'instructions sont-ils correctement délimités par des accolades ?
- Ne confondez-vous pas l'opérateur logique OU (||) avec l'opérateur logique ET (&&) ?
- N'avez-vous pas oublier que les indices de tableaux commencent à 0 ?
- Le conditionnement de vos boucles est-il correct ? Est-ce que vos conditions de boucles ne terminent pas trop tôt ou
trop tard le traitement ?
- Tous les blocs d'instructions d'une structure de choix SWITCH devraient se terminer par l'instruction break. Est-ce le
cas ?
- Si vous faites référence à des scripts externes (include, require), ou si vous travaillez sur des ressources externes
(fichier, url, base de données), disposez-vous des bons chemins et droits d'accès ?
page 73

Frameworks

Utilisation d'un framework

Un framework (qui pourrait être traduit par "espace de travail modulaire") est constitué d'un ensemble de
bibliothèques et de conventions servant à la réalisation d'applications informatiques. En imposant un certain
nombre de règles et de briques logicielles, un framework vise à fournir un cadre de travail rigoureux permettant
de produire rapidement des applications cohérentes, fiables et aisées à maintenir.

Les frameworks ofrent, aux développeurs désireux de ne pas re-programmer des éléments existants, des outils prenant
en charge les procédures de bas niveau et fournissant des interfaces pour remplir les tâches les plus communes.

Au nombre des avantages des frameworks on peut citer :


- la formalisation des procédures;
- la standardisation des procédures;
- la convergence des procédures;
- la modularité du code;
- la réutilisation du code.

A contrario, en ce qui concerne les inconvénients d'un recours à un framework, on pourra trouver :
- la rigidité de l'architecture;
- l'inadaptation à certains contextes (lourdeur);
- une courbe d'apprentissage parfois longue.

A noter qu'il n'est pas nécessaire de faire appel systématiquement à un framework pour le développement d'une
applications. Il faut contextualiser et évaluer la pertinence d'un framework en fonction des objectifs, ressources et
compétences disponibles. Le recours au PHP brut se révèle parfois l'option la plus oportune.

Il existe aujourd'hui de nombreux frameworks pour le langage PHP. En voici les plus évidents :

Frameworks PHP

- Zend Framework
- Symfony
- Laravel
- Phalcon
- Yii
- CakePHP
- CodeIgniter
- Smarty
- Slim
- Aura
- FuelPHP
- ...
page 74

Frameworks

Application de l'approche MVC

Les frameworks, peu importe le langage de programmation, proposent une architecture/organisation de façon
à gérer au mieux l'interface homme-machine d'une application. La plupart de ces frameworks s'appuyent pour
cela sur une approche MVC.

L'approche MVC, pour Model-View-Controler ou en français Modèle-Vue-Contrôleur, privilégie la séparation du traitement


des données de leur présentation. Elle préconise l'organisation du code d'interface utilisateur en trois composants distincts :

- Modèle : en charge de la gestion des données d'une application (partie logique de l'application / règles métiers).
- Vue : en charge du dialogue avec les utilisateurs (partie habillage de l'application / dessin des écrans).
- Contrôleur : en charge de l'orchestration des requêtes des utilisateurs et de leur relais vers les modèles (partie liaison
modèles-vues / aiguillage).

Cette approche permet aux développeurs de profiter des avantages suivants :


- séparation entre les données, la présentation et les traitements;
- souplesse;
- maintenance allégée;
- possibilité d'évolution renforcée;
- spécialisation des tâches et division claire du travail.

Approche MVC

Tout appel passe par le contrôleur. Le traitement de l'information est assuré par un modèle et l'habillage est
confié à une vue.
page 75

Le contrôleur

Le contrôleur n'effectue pas ou très peu de traitement (éventuellement un travail de préparation et/ou de redirection).
Il réceptionne et gère les événements provenant de l'utilisateur, enclenche les actions à effectuer sur les données en
sollicitant le modèle adéquat et renvoie la vue correspondant à la demande. On n'y retrouvera donc pas d'instruction
d'habillage proprement dit.
page 76

Mise en oeuvre et fonctions principales

Circum Net, 2017


page 77

Affichage

Introduction - Programmation serveur et output

Dans les développements Web l'élément clé est certainement le dialogue avec l'utilisateur. Pour mettre en
oeuvre ce dialogue, il faut bien évidemment être capable de récupérer l'information venant d'une url ou d'un
formulaire HTML mais aussi d'afficher des messages sur le poste client.

Le langage PHP propose plusieurs instructions d'output (echo, print, printf, sprintf). Les instructions les plus souvent
rencontrées sont 'echo' et 'print': leur utilisation a pour résultat l'affichage sur l'écran du client d'une suite de caractères
(texte, codes html, codes xml, codes javascript).
page 78

Affichage

Instructions - echo

'echo' affiche à l'écran une ou plusieurs chaînes de caractères.

Dans le contexte du développement d'applications Web, cette fonction a pour résultat l'affichage -sur l'écran du client- des
informations passées en argument.

Syntaxe : echo(string)

Utilisation de 'echo'

1 - <?php
2 - $firstname = "paul";
3 - echo "Hello World<br>\n";
4 -
5 - echo "Hello, " . ucfirst($firstname) . "<br>\n";
6 -
7 - echo "<a href=\"http://www.linux.org/\">Linux</a>";
8 - ?>

echo() n'est pas une fonction à proprement parler, ce qui rend l'usage des parenthèses facultatif.
page 79

Affichage

Instructions - print

'print' présente les mêmes caractéristiques que la fonction 'echo'. Elle affiche à l'écran une ou plusieurs chaînes
de caractères.

Syntaxe : print(string)

Utilisation de 'print'

1 - <?php
2 - $firstname = "paul";
3 - print "Hello, World<br>\n";
4 -
5 - print "Hello, " . ucfirst($firstname) . "<br>\n";
6 -
7 - print "<a href=\"http://www.linux.org/\">Linux</a>";
8 - ?>

L'utilisation de 'print' est similaire à 'echo'.

Utilisation de 'print' à la mode Perl

1 - <?php
2 - print <<<EOF
3 -
4 - <a href="http://www.lesoir.be/">Le Soir</a><br>
5 - <a href="http://www.liberation.fr/">Libération</a><br>
6 -
7 - EOF;
8 - ?>
page 80

Manipulation de chaînes de caractères

Introduction - Développements Web et chaînes de caractères

Les développements Web actuels tendent tous à multiplier les échanges d'informations clients/serveurs, à
améliorer l'interactivité, à pousser en avant les applications dynamiques. Ceci implique inévitablement un besoin
accru en terme de contrôle de l'information échangée. A ce niveau la manipulation des chaînes de caractères
va jouer un rôle crucial. Dès qu'il s'agira de traiter un formulaire HTML, de questionner une base de données,
de mettre au point un outil de recherche, d'analyser un fichier XML, d'envoyer un courrier électronique il sera
nécessaire de manipuler des chaînes de caractères.
page 81

Manipulation de chaînes de caractères

Instructions - strlen

Cette fonction fournit la taille (en caractères) d'une chaîne de caractères.

Syntaxe : strlen(string)

Utilisation de 'strlen'

1 - <?php
2 - $phrase = "Etude du Langage PHP";
3 - echo strlen($phrase); // Retourne "20"
4 - ?>

On peut l'utiliser, entre autres choses, afin de vérifier si la valeur d'une variable que l'on désire enregistrer dans une DB
ou un fichier texte délimité ne dépasse pas un certain nombre de caractères.

Test sur la taille d'une chaîne

1 - <?php
2 - $login = "jbdarnil";
3 -
4 - if(strlen($login) > 8)
5 - {
6 - echo "Erreur, le login contient plus de 8 caractères";
7 - }
8 - else
9 - {
10 - echo "Login enregistré ...";
11 - }
12 - ?>

Dans cet exemple, la longueur de la variable '$login' conditionne le traitement des données (le login ne peut
pas faire plus de 8 caractères).
page 82

Manipulation de chaînes de caractères

Instructions - strtolower

'strtolower' met en minuscules tous les caractères d'une chaîne.

Syntaxe : strtolower(string)

Cet outil se révèle fort utile dans le cas où l'on doit s'assurer de la basse casse d'une chaîne de caractères avant son
enregistrement dans une base de données, dans un fichier de login, d'index, de configuration ou dans des en-têtes de
courrier électronique.

Utilisation de 'strtolower'

1 - <?php
2 - $str = "Hello World";
3 - echo strtolower($str); // Retourne "hello world"
4 - ?>
page 83

Manipulation de chaînes de caractères

Instructions - strtoupper

'strtoupper' met en majuscules tous les caractères d'une chaîne.

Syntaxe : strtoupper(string)

Utilisation de 'strtoupper'

1 - <?php
2 - $str = "Hello World";
3 - echo strtoupper($str); // Retourne "HELLO WORLD"
4 - ?>
page 84

Manipulation de chaînes de caractères

Instructions - ucfirst

'ucfirst' met en majuscule le premier caractère d'une chaîne.

Syntaxe : ucfirst(string)

Utilisation de 'ucfirst'

1 - <?php
2 - $str = "hello world";
3 - echo ucfirst($str); // Retourne "Hello world"
4 - ?>
page 85

Manipulation de chaînes de caractères

Instructions - substr

'substr' permet d'extraire une partie d'une chaîne de caractères.

Syntaxe : substr (string, start, length)

L'extraction porte sur la chaîne 'string', débute à partir du repère 'start' pour une longueur précisée via l'argument 'length'.

Utilisation de 'substr'

1 - <?php
2 - $phrase = "Hello World";
3 - $extract = substr($phrase, -5);
4 - echo "$extract<br>"; // Retourne "World"
5 - $extract2 = substr($phrase, -5, 1);
6 - echo "$extract2<br>"; // Retourne "W"
7 - ?>

Le premier appel à 'substr' donne pour résultat la récupération des 5 derniers caractères de la chaîne
'$phrase'.
Le second appel à 'substr' donne pour résultat la récupération du premier des 5 derniers caractères de la
chaîne '$phrase'.

Test sur une adresse url

1 - <?php
2 - $url = "http://www.linux.org/";
3 - if(substr($url,0,7) != "http://")
4 - {
5 - echo "L'adresse n'est pas complète !";
6 - }
7 - else
8 - {
9 - echo "Enregistrement de l'adresse : $url";
10 - }
11 - ?>

La fonction 'substr' récupère les 7 premiers caractères de la chaîne '$url'. Ce résultat est comparé à la
chaîne 'http://'.
page 86

Manipulation de chaînes de caractères

Instructions - substr_count

Cette fonction fournit comme résultat le nombre de fois qu'une sous-chaîne apparaît dans une chaîne de
caractères.

Syntaxe : substr_count(source, pattern)

'substr_count' retourne le nombre de fois que 'pattern' est présent dans 'source'. Cette fonctionnalité peut être par exemple
exploitée dans le cas ou l'on désire compter le nombre de fois qu'apparaît un mot dans un fichier texte.

Utilisation de 'substr_count'

1 - <?php
2 - $str = "Hello world";
3 - print substr_count($str, "l");
4 - ?>

La fonction 'substr_count' va compter le nombre de fois que le caractère 'l' est rencontré dans la chaîne
'$str'. Dans ce cas-ci cela donnera '3'.

Compter le nombre d'occurrences d'un mot dans un fichier

1 - <?php
2 - $fp = fopen("./livres.txt", "r");
3 - $contents = fread ($fp, filesize("./livres.txt"));
4 - print substr_count($contents, "Hugo");
5 - fclose($fp);
6 - ?>

Dans ce script, on commence par ouvrir en lecture un fichier html (fopen), on le lit (fread) et ensuite on
compte le nombre de fois que le mot "Hugo" apparaît dans ce qui a été lu.

Attention, la fonction substr_count est sensible à la casse : compter le nombre d'occurrences de la chaîne "Hugo" ne revient
donc pas à compter le nombre d'occurrences de la chaîne "hugo", elles sont considérées comme étant différentes.
page 87

Manipulation de chaînes de caractères


Instructions - strrchr

'strrchr' extrait d'une chaîne la suite des caractères rencontrée à partir de la dernière apparition d'un repère
fournit en paramètre. Le repère utilisé consiste en un caractère.

Syntaxe : strrchr(string, pattern)

Cette fonction est très régulièrement utilisée afin, entre autres, de vérifier des informations fournies par les utilisateurs, pour
décoder les chemins d'accès de fichiers, pour tester la cohérence d'une adresse email, pour exploiter un partie significative
d'une url ou d'un nom de fichier. En voici quelques exemples :

Utilisation de 'strrchr'
1 - <?php
2 - $filepath = "/usr/local/http/htdocs/index.html";
3 -
4 - $filename = strrchr($filepath, "/");
5 - echo "$filename<br>"; // Retourne /index.html
6 -
7 - $filename2 = substr(strrchr($filepath, "/"), 1);
8 - echo "$filename2<br>"; // Retourne index.html
9 - ?>

Le premier appel à 'strrchr' donne pour résultat la récupération des caractères de la chaîne '$filename' à
partir du repère '/' (ce caractère est donc compris dans la récupération).
Le second appel à 'strrchr' a le même résultat que le précédent. Seulement, cette fois-ci, il est accompagné
de la fonction 'substr' qui permet de supprimer le repère '/' (puisque cette fonction récupère ce qui suit le
premier caractère). On dispose ainsi, à partir du chemin d'accès du fichier, du nom du fichier.

Test sur une adresse email


1 - <?php
2 - $email = "john@sky.net";
3 - if(strrchr($email, "@") )
4 - {
5 - echo "Enregistrement de l'adresse : $email";
6 - }
7 - else
8 - {
9 - echo "L'adresse n'est pas correcte !";
10 - }
11 - ?>

La fonction 'strrchr' est ici utilisée pour tester la présence du caractère '@' dans une adresse email.

Exploitation d'un nom de fichier


1 - <?php
2 - $fichierxml = "paper-0902.xml";
3 - $periode = substr(substr(strrchr($fichierxml, "-"), 1),0,4);
4 - echo $periode;
5 - // Retourne "0902"
6 - ?>

Si l'on décompose cette instruction on obtient la procédure suivante:


1. la fonction 'strrchr' récupère tous les caractères à partir du caractère "-" (résultat: '-0902.xml');
2. la première fonction 'substr' (c'est-à-dire la plus "intérieure") extrait du résultat précédent tout ce qui suit le
premier caractère - en d'autres termes on se débarasse du caractère "-" (résultat: '0902.xml');
3. la deuxième fonction 'substr' (c'est-à-dire la plus "extérieure") extrait les 4 premiers caractères du résultat
précédent (résultat: '0902').
page 88

Manipulation de chaînes de caractères

Instructions - strip_tags

'strip_tags' supprime toutes les balises HTML et PHP présentes dans une chaîne de caractères.

C'est une fonction particulièrement utile lorsque l'on ne désire pas enregistrer dans ses bases de données des codes
HTML, PHP, Javascript saisis par des utilisateurs via des formulaires HTML. Cela représenterait un trou de sécurité dans
le système et pourrait sérieusement perturber l'exploitation de données de la base.

Syntaxe : strip_tags(string [,allowable_tags])

L'option allowable_tags peut être utilisée pour préciser les balises qui seront conservées.

Utilisation de 'strip_tags'

1 - <?php
2 - $str = "<b>Wello World</b>,<br> <i>How are you?</i>";
3 - $str = strip_tags($str,"<b>,<i>");
4 - echo $str;
5 - // Retourne "<b>Wello World</b>, <i>How are you?</i>
6 - ?>

Toutes les balises sont donc supprimées, sauf les balises passées en paramètres (<b>,<i>).
page 89

Manipulation de chaînes de caractères

Instructions - stripslashes

'stripslashes' a pour effet de supprimer les anti-slash (\) dans une chaîne de caractères.

Si dans certaines procédures, comme nous l'avons vu précédemment, les anti-slash (\) sont utilisés afin de protéger des
caractères spéciaux (ex : $, ", ', \), dans d'autres procédures, il se peut que l'on rencontre le besoin de faire disparaître
ces anti-slash; on utilise alors la fonction 'stripslashes'.

C'est notamment le cas lorsque l'on désire récupérer des données à partir d'un formulaire html (champs de type 'text' et
'textarea') et les envoyer, par exemple, directement vers une base de données ou les enregistrer dans un fichier texte.

Syntaxe : stripslashes(string)

Utilisation de 'stripslashes'
1 - <?php
2 - $str = "L\'XML est un langage de \" structuration \"";
3 - $str = stripslashes($str);
4 - echo $str;
5 - // Retourne L'XML est un langage de "structuration"
6 - ?>

La fonction 'stripslashes' va faire disparaître le caractère d'échappement (\) à l'affichage sur le poste
utilisateur

Traitement en bloc
1 - <?php
2 - function stripslashes_array($arg = array())
3 - {
4 - $result = array();
5 - while (list($key,$val) = each($arg))
6 - {
7 - $result[$key] = stripslashes($val);
8 - }
9 - return $result;
10 - }
11 -
12 - $titres = array("C\'est pas la mer à boire",
13 - "L\'univers sans \"faim\"",
14 - "Le \$, \"une monnaie de singe\"?");
15 -
16 - $newtitres = stripslashes_array($titres);
17 -
18 - echo "$newtitres[1]<br>";
19 - echo "$newtitres[2]<br>";
20 - ?>

Cette fonction est particulièrement utile si l'on veut traiter en bloc -par exemple- tous les éléments du tableau
'HTTP_POST_VARS' ou les éléments de réponse renvoyés par une base de données.

Option de configuration 'magic_quotes_gpc'

Cette option de configuration de php (précisée dans le fichier php.ini installé sur votre système) provoque l'ajout ou non
d'un anti-slash (\) devant les quotes simples (') et doubles (") qui peuvent transiter via les méthodes GET, POST (ou par
les Cookies).
page 90

La fonction 'phpinfo()' vous permettra de connaître sa valeur. Par défaut, l'option 'magic_quotes_gpc' est initialisée à 1 (On).
page 91

Manipulation de chaînes de caractères

Instructions - nl2br

'nl2br' convertit les caractères de nouvelle ligne en retour de chariot HTML <br>.

Imaginons qu'un script php gère (ou participe à la gestion) d'un forum de discussion. Les questions et commentaires sont
postés par les utilisateurs via des formulaires HTML et plus particulièrement via des champs de type 'textarea'. On désire,
à un moment donné, publier les commentaires qui ont été envoyés au forum. L'utilisation de la fonction 'nl2br' lors de
l'affichage des informations permettra de traduire directement tous les passages à la ligne en HTML (<br>).

Syntaxe : nl2br(string)

Utilisation de 'nl2br'

1 - <?php
2 - $str = "Hello World,\n How are you?";
3 - echo nl2br($str);
4 - // Retourne "Hello World,<br/> How are you?"
5 - ?>

La fonction 'nl2br()' est compatible avec la norme XHTML : elle retourne le code <br/> au lieu de <br>.
page 92

Manipulation de chaînes de caractères

Instructions - urlencode

Cette fonction encode une chaîne de caractères selon la règle de la "Localisation Universelle de Ressource",
ou "URL".

Dans ce système, les caractères non-ascii sont automatiquement remplacés par leur code URL. Celui-ci est défini par une
chaîne de caractères du type %xx (où xx représente le code du caractère au format hexadécimal).
Les caractères réservés < > " # % ! $ ^ & ( ) + = ... sont également remplacés par leur code URL. Le caractère espace
_ est remplacé par le signe +.

Syntaxe : urlencode(string)

L'utilisation d'urlencode permet d'assurer la cohérence des informations lors des transferts de données entre clients/
serveurs via URLs. En effet, une adresse "URL" a une syntaxe très stricte dans laquelle certains caractères (; / ? : @ & =
+ $ ,) sont dédiés à des usages particuliers. Lorsque l'on veut faire passer des variables d'un script php à un autre on a
donc tout intérêt à vérifier si elles ne vont pas perturber l'interprétation de l'URL.

Utilisation de 'urlencode'

1 - <?php
2 - $str = "Université de Liège";
3 - echo urlencode($str);
4 - // Retourne "Universit%E9%20de%20Li%E8ge"
5 -
6 - $str2 = "info@sky.net";
7 - echo urlencode($str2);
8 - // Retourne "info%40sky.net"
9 - ?>

rawurlencode

'rawurlencode' a le même rôle que la fonction 'urlencode'. Ici cependant, l'encodage se fait selon la règle définie par l'IETF
dans le document de référence [RFC1738] (http://www.ietf.org/rfc.html). Différence significative: le caractère espace _ n'est
pas remplacé par le signe + mais bien par le code hexadécimal %20. Ceci s'impose lorsque par exemple on désire utiliser
un password dans une adresse url ftp ou que l'on veut transmettre un chemin d'accès.
page 93

Manipulation de chaînes de caractères

Instructions - urldecode

Cette fonction décode une chaîne URL. Les séquences de caractères %xx sont remplacées par les caractères
correspondants.

Syntaxe : urldecode(string)

A titre d'exemple, imaginez le cas où votre application utilise des informations fournies par une autre procédure, une base
de données, ou encore un fichier texte, et que ces informations ont été préalablement 'urlencodées'. La fonction 'urldecode'
vous aidera alors à les rendre lisibles dans votre script.

Utilisation de 'urldecode'

1 - <?php
2 - $str = "Universit%E9%20de%20Li%E8ge";
3 - echo urldecode($str);
4 - // Retourne "Université de Liège"
5 - ?>
page 94

Manipulation de chaînes de caractères

Instructions - htmlspecialchars

Cette fonction convertit les caractères spéciaux (réservés) en leur équivalent HTML. Certains caractères ont
en effet une signification particulière en HTML et doivent être encodés pour conserver leur valeur et éviter qu'ils
soient mal interprétés.

Syntaxe : htmlspecialchars(string)

Les caractères suivants sont remplacés :

- - '&' (et commercial) devient '&amp;'


- - '"' (guillement double) devient '&quot;'
- - '<' (inférieur à) devient '&lt;'
- - '>' (supérieur à) devient '&gt;'

Utilisation de 'htmlspecialchars'

1 - <?php
2 - $str = 'Découvrir PHP,<br> c\'est "passionnant!"';
3 - echo htmlspecialchars($str);
4 - // Retourne :
5 - // "Découvrir PHP,&lt;br&gt; c'est &quot;passionnant!&quot;"
6 - ?>
page 95

Manipulation de chaînes de caractères

Instructions - htmlentities

'htmlentities' convertit tous les caractères ayant une signification particulière dans le langage HTML (jeu de
caractères par défaut : ISO-8859-1).

Syntaxe : htmlentities(string [, charset])

'htmlentities' rend bien des services, notamment lorsqu'il s'agit d'afficher des chaînes de caractères dans l'attribut 'value'
d'une balise html '<input>'. Ce cas de figure peut en effet poser problème si la chaîne que l'on désire afficher contient
des caractères réservés (par exemple le signe "). La fonction 'htmlentities' règle tout cela en convertissant les caractères
problématiques (dans le cas du signe " elle va le remplacer par la chaîne &quot;).

Plus généralement, l'utilisation de cette transformation peut éviter que le comportement d'un script soit perturbé lors de
l'affichage d'informations dont on ne contrôle pas la teneur ou la provenance (envoi par formulaire de codes javascript ou
de codes html erronés).

Utilisation de 'htmlentities'

1 - <?php
2 - $str = 'Découvrir PHP,<br> et apprendre à "programmer"';
3 - echo htmlentities($str);
4 - // Retourne :
5 - // D&eacute;couvrir PHP,&lt;br&gt; et
6 - // apprendre &agrave; &quot;programmer&quot;
7 - ?>

'htmlentities' et les formulaires html

1 - <?php
2 - $titre = 'Découvrir PHP, et apprendre à "programmer"';
3 - echo "<form method=\"post\" action=\"insert.php\">";
4 - echo "Titre : ";
5 - echo "<input type=\"text\" name=\"titre\" size=\"60\"
6 - value=\"" . htmlentities($titre) . "\">";
7 - echo "</form>";
8 - ?>

Dans ce formulaire, le champ de saisie va recevoir une chaîne de caractères qui contient des guillements.
L'utilisation de la fonction 'htmlentities' va rendre possible l'affichage correct de ces caractères dans un
navigateur web.

La fonction 'htmlentities()' a un comportement fort proche de la fonction 'htmlspecialchars()', mais agit plus en profondeur,
puisqu'elle convertit tous les caractères ayant un équivalent en code HTML. Notamment, tous les caractères accentués.
page 96

Manipulation de chaînes de caractères

Instructions - str_replace

Cette fonction est utilisée afin de remplacer toutes les occurrences d'une chaîne par une autre chaîne.

Syntaxe : str_replace(pattern, replacement, source)

Elle remplace toutes les occurrences de 'pattern' trouvées dans 'source' par la chaîne de caractères 'replacement'.

Utilisation de 'str_replace'

1 - <?php
2 - $text = "HTML est un langage de description de contenu";
3 - $newtext = str_replace ("HTML", "XML", $text);
4 - echo $newtext;
5 - // Retourne "XML est un langage de description de contenu"
6 - ?>

Pour des remplacements de chaînes plus sophistiqués, voir le chapitre sur les expressions régulières et la
fonction prédéfinie 'ereg_replace'.

'str_replace' similaire à 'nl2br'...

1 - <?php
2 - $text = "XML\n est un langage de description\n de contenu";
3 - $newtext = str_replace ("\n", "<br/>", $text);
4 - echo $newtext;
5 - // Retourne "XML<br/> est un langage de
6 - // description<br/> de contenu"
7 - ?>

Comme la fonction 'nl2br', 'str_replace' est capable de convertir les caractères de nouvelle ligne en retour de
chariot HTML.

Les arguments 'pattern' et 'replacement' peuvent également recevoir pour valeurs des tableaux (array). Dans ce cas
l'opération de remplacement se fera sur base de chaque élément de ceux-ci.

Plusieurs valeurs à remplacer

1 - <?php
2 - $exchars = array('\\','/',':','*','?','"','<','>','|');
3 - echo $filename = str_replace($exchars, "", "pho<>ne*book?.txt");
4 -
5 - // Génère : phonebook.txt
6 - ?>

Cette opération "nettoie" une chaîne de caractères en supprimant un ensemble de caractères non valides
(par exemple dans le cas des noms de fichiers sous Windows).
page 97

Manipulation de chaînes de caractères

Instructions - trim

Cette fonction retourne une copie d'une chaîne de caractères sans les espaces " blancs " de début et de fin de
chaîne. Les espaces blancs sont : "\n", "\r", "\t", "\v", "\0", et " " (espace).

Syntaxe : trim(string)

Dans la pratique, 'trim' permet, par exemple, de "nettoyer" les début et fin de chaîne des requêtes saisies par des utilisateurs
dans un formulaire HTML. De la même façon, cette fonction facilite grandement la tâche du programmeur lorsque celui-ci
est amené à devoir "nettoyer" les informations qui sortent d'une base de données.

Utilisation de 'trim'
1 - <?php
2 - $text = " \nXML est un langage de description\n\n\n";
3 - $newtext = trim($text);
4 - echo $newtext;
5 - // Retourne "XML est un langage de description de contenu"
6 - ?>

Si l'on veut supprimer les espaces blancs présents au milieu d'une chaîne de caractères, il faut plutôt utiliser
la fonction 'str_replace': str_replace(" ", "", $text)

ltrim

'ltrim' supprime les espaces " blancs " de début de chaîne de caractères.

Syntaxe : ltrim(string)

Utilisation de 'ltrim'
1 - <?php
2 - $text = " \nXML est un langage de description\n\n\n";
3 - $newtext = ltrim($text);
4 - echo $newtext;
5 - // Retourne "XML est un langage de description de contenu\n\n\n"
6 - ?>

rtrim

'rtrim' supprime les espaces " blancs " de fin de chaîne de caractères.

Syntaxe : rtrim(string)

Utilisation de 'rtrim'
1 - <?php
2 - $text = " \nXML est un langage de description\n\n\n";
3 - $newtext = rtrim($text);
4 - echo $newtext;
5 - // Retourne " \nXML est un langage de description de contenu"
6 - ?>
page 98

Manipulation de chaînes de caractères

Instructions - explode

'explode' scinde une chaîne de caractères sur base d'un délimiteur et retourne un tableau contenant les
éléments résultant de la division.

'explode' est un outil dont on se sert souvent afin de manipuler et exploiter des fichiers texte délimité (stockage dans un
fichier texte de données séparées par un délimiteur : listes d'utilisateurs, fichiers de configuration ou d'exportation de db -
on parle également de fichiers csv). Cette fonction permet d'en récupérer de façon structurée les données.

Syntaxe : explode(separator, string)

Utilisation de 'explode'

1 - <?php
2 - $text = "John Bill Paul Henri Margaret";
3 - $members = explode(" ", $text);
4 - echo $members[2];
5 - // Retourne "Paul"
6 -
7 - $url = "Journal Le Soir|http://www.lesoir.be/";
8 - $parts = explode("|", $url);
9 - echo "<p><a href=\"$parts[1]\">$parts[0]</a></p>";
10 - /* Retourne le lien html suivant :
11 - <p><a href="http://www.lesoir.be">Journal Le Soir</a></p>
12 - */
13 - ?>

La fonction 'explode' sera particulièrement appréciée pour traiter entres autres les fichiers produits à partir
d'un logiciel tableur comme Excel.
page 99

Manipulation de chaînes de caractères

Instructions - implode

'implode' retourne une chaîne de caractères constituée de tous les éléments d'un tableau séparés par une
chaîne de jointure. Cette instruction fonctionne donc à l'inverse de 'explode'.

Syntaxe : implode(join, array)

Si le tableau utilisé avec la fonction 'implode' ne contient qu'un seul élément la chaîne de jointure est simplement ignorée
dans le résultat qui est fournit.

Utilisation de 'implode'

1 - <?php
2 - $campus = array("Paris", "Londres", "Amsterdam", "Bruxelles");
3 - $listecampus = implode("-",$campus);
4 - echo $listecampus;
5 - // Retourne "Paris-Londres-Amsterdam-Bruxelles"
6 -
7 - $site = array("Le Soir", "http://www.lesoir.be", "quotidien");
8 - $info_site = implode("|",$site);
9 - echo $info_site;
10 - // Retourne "Le Soir|http://www.lesoir.be|quotidien"
11 - ?>

Les éléments du tableau passé en paramètre sont assemblés en une chaîne de caractères (la chaîne de
jointure séparant les différents éléments).

Le langage PHP propose également la fonction 'join', qui est un alias de la fonction 'implode' et se comporte exactement
de la même manière.

Utilisation de 'join'

1 - <?php
2 - $campus = array("Paris", "Londres", "Amsterdam", "Bruxelles");
3 - $listecampus = join("-",$campus);
4 - echo $listecampus;
5 - // Retourne "Paris-Londres-Amsterdam-Bruxelles"
6 -
7 - $site = array("Le Soir", "http://www.lesoir.be", "quotidien");
8 - $info_site = join("|",$site);
9 - echo $info_site;
10 - // Retourne "Le Soir|http://www.lesoir.be|quotidien"
11 - ?>
page 100

Manipulation de tableaux

Introduction - Les incontournables tableaux de programmation

Les tableaux constituent des 'incontournables' lorsqu'il s'agit de manipuler des données dans un script PHP.
Que ce soit pour l'analyse d'un fichier texte ou pour la réception de résultats venant d'une base de données, leur
utilisation s'impose.

PHP propose différentes fonctions de manipulation de tableaux: création de tableaux, lecture et parcours de tableaux,
obtention des propriétés ...
page 101

Manipulation de tableaux
Intstructions - array

'array' permet de créer un tableau sur base des éléments qui lui sont fournis en paramètres. Cette instruction
peut être utilisée pour "peupler" autant les tableaux à une dimension qu'à plusieurs dimensions.

Syntaxe : array(var1, var2, ...)

Dans la cas d'un tableau scalaire, il suffit de préciser entre parenthèses -à la suite de l'instruction 'array'- les valeurs qui
doivent être stockées. Elles seront indexées à partir de zéro.

Tableaus scalaires
1 - <?php
2 - // création et peuplement d'un tableau
3 - $countries = array("Paris", "Londres", "Berlin");
4 -
5 - // ajout d'un élément à un tableau
6 - $countries[] = "Rome";
7 - ?>

Le tableau '$countries' est, à la ligne 3, construit sur base de 3 éléments. L'appel à l'élément $countries[2]
retournera ainsi la valeur 'Berlin'.
A la ligne 6, le tableau est augmenté d'un élément. Cette opération se fait via l'assignation d'une valeur au
tableau. Ce dernier est précisé par son nom et son identifiant d'indice '[]'. Dans la cas qui nous occupe, le
nouvel élément héritera de l'indice 3 étant donné que PHP assure automatiquement l'attribution d'un nouvel
indice si celui-ci n'est pas fourni explicitement.

Dans la cas d'un tableau associatif, il faut à la fois préciser la clé et la valeur de chaque élément. Cette association se fait
via l'opérateur '=>', comme présenté ci-dessous.

Tableaux associatifs
1 - <?php
2 - // Tableau à une dimension:
3 - $utilisateur = array(
4 - "prenom" => "stephane",
5 - "nom" => "Dumont",
6 - "privilege" => "admin",
7 - "email" => "sdumont@sky.blue"
8 - );
9 -
10 - // Tableau à deux dimensions:
11 -
12 - $utilisateurs = array(
13 - "sdumont" => array(
14 - "prenom" => "stephane",
15 - "nom" => "Dumont",
16 - "privilege" => "admin",
17 - "email" => "sdumont@sky.blue"
18 - ),
19 -
20 - "pdampierre" => array(
21 - "prenom" => "Pierre",
22 - "nom" => "Dampierre",
23 - "privilege" => "guest",
24 - "email" => "pdampierre@tree.green"
25 - )
26 - );
27 - ?>

En ce qui concerne notre tableau à une dimension, la récupération du nom de l'utilisateur se fera de la façon
suivante: $utilisateur[nom].
En ce qui concerne notre tableau à deux dimensions, la récupération de l'email de l'utilisateur 'pdampierre'
se fera de la façon suivante: $utilisateurs[pdampierre][email].
page 102

Manipulation de tableaux

Intstructions - list

'list' permet à partir d'un tableau d'assigner une série de variables en une seule ligne.

Syntaxe : list(var1, var2, ...)

Utilisation de 'list'

1 - <?php
2 - $profile = array(42, "Dupont", "Robert", "admin");
3 - list ($id, $nom, $prenom, $privilege) = $profile ;
4 - echo "Monsieur $nom a le privilège $privilege";
5 - // "Retourne "Monsieur Dupont a le privilège admin"
6 - ?>

Combiné avec l'instruction 'each', 'list' permet d'exploiter tous les éléments d'un tableau.
page 103

Manipulation de tableaux

Intstructions - each

'each' retourne un tableau de 4 éléments reprenant la clé et la valeur de l'élément courant d'une table. Il avance
ensuite le pointeur de tableau de sorte que l'on puisse itérer sur celui-ci.

Syntaxe : each(array)

Les 4 éléments retournés par 'each' ont les clés suivantes : 0, 1, key, et value.
Les éléments '0' et 'key' contiennent le nom de la clé de l'élément courant.
Les éléments '1' et 'value' contiennent la valeur de l'élément courant.

Utilisation de 'each'

1 - <?php
2 - $utilisateurs = array("Martin", "Dupont", "Aloin");
3 - $item = each($utilisateurs);
4 -
5 - // Information retournée par each
6 - // $item est une liste composée des éléments suivants:
7 - // 0 = 0
8 - // 1 = Martin
9 - // key = 0
10 - // value = Martin
11 -
12 - echo $item["value"]; // Retourne "Martin"
13 - ?>

Combiné avec l'instruction 'list', 'each' permet d'exploiter tous les éléments d'un tableau.

Parcours d'un tableau à l'aide de 'each'

1 - <?php
2 - $countries = array("Paris", "Londres", "Berlin");
3 - while (list($key, $val) = each($countries))
4 - {
5 - echo "$val<br>\n";
6 - }
7 - ?>
page 104

Manipulation de tableaux

Intstructions - foreach

La structure de contrôle 'foreach' permet de parcourir aisément tous les éléments d'un tableau scalaire ou
associatif et d'en traiter les composants.

Syntaxe : foreach(array as variable) {instructions}

Le premier paramètre attendu par foreach est la référence au tableau qui doit être pris en compte. Le deuxième paramètre
est une variable qui stockera la valeur d'un élément particulier du tableau. Cette variable sera mise à jour à chaque passage
dans la boucle et prendra donc successivement la valeur des différents éléments que contient le tableau.

Utilisation de 'foreach'
1 - <?php
2 - $utilisateurs = array("Martin", "Dupont", "Aloin");
3 - foreach($utilisateurs as $value)
4 - {
5 - echo "$value<br>";
6 - }
7 - ?>

Grâce à cette boucle, toutes les valeurs du tableau sont affichées.


Pour chaque élément de '$utilisateurs', la variable '$value' est créée et contiendra la valeur de l'élément
courant.

Comparaison de foreach et while pour le parcours d'un tableau


1 - <?php
2 - $countries = array("Paris", "Londres", "Berlin");
3 -
4 - while (list($key, $val) = each($countries))
5 - {
6 - echo "$val<br>";
7 - }
8 -
9 - foreach($countries as $value)
10 - {
11 - echo "$value<br>";
12 - }
13 - ?>

Ces deux procédures sont équivalentes quant au résultat obtenu.

'foreach' est une instruction également très pratique lorsqu'il s'agit de travailler avec les clés/indices des éléments contenu
dans un tableau. On en utilise alors une variante:

Syntaxe : foreach(array as key => value) {instructions}

Exploitation des clés/indices


1 - <?php
2 - $utilisateurs = array("Martin", "Dupont", "Aloin");
3 - foreach($utilisateurs as $key => $value)
4 - {
5 - echo "$key - $value<br>";
6 - }
7 - ?>

La valeur de l'élément est cette fois-ci affichée en regard de sa clé.


page 105

Manipulation de tableaux

Intstructions - sizeof

Cette fonction fournit le nombre d'éléments que contient un tableau.

Syntaxe : sizeof(array)

Utilisation de 'sizeof'

1 - <?php
2 - $users = array("Paul", "Pierre", "Olivier");
3 - $i = 0 ;
4 - while ($i != sizeof($users))
5 - {
6 - echo "$users[$i]<br>\n";
7 - $i++ ;
8 - }
9 - ?>

Les instructions présentes dans la structure 'while' seront répétées autant de fois qu'il y a d'éléments dans le
tableau '$users'.

La fonction 'sizeof' peut par exemple être exploitée dans une structure de boucle 'while' (script précédent) comme dans
une structure conditionnelle 'if' (script suivant).

Condition sur base de 'sizeof'

1 - <?php
2 - // Test sur base de la taille du tableau
3 - if (sizeof($in_categories)>0)
4 - {
5 - // Parcours de tous les éléments du tableau
6 - while (list($key, $val) = each($in_categories))
7 - {
8 - // Composition d'une requête SQL
9 - $querya = "INSERT INTO pub_cat (id, id_pub, id_cat)";
10 - $querya .= "VALUES (0, '$serial_value', '$val')";
11 - // Exécution d'une requête SQL
12 - $exerequesta = execrequest ($querya, $connexion);
13 - }
14 - }
15 - ?>

Dans ce script, la boucle while ne sera prise en compte que si la taille du tableau '$in_categories' est
supérieure à 0. Cette précaution évite que la fonction 'each' ne renvoie un message d'erreur ("Variable
passed to each() is not an array or object") si le tableau '$in_categories' fournit en argument est vide.
page 106

Manipulation de tableaux

Intstructions - reset

'reset' remet le pointeur de tableau à zéro. Le pointeur est ainsi repositionné sur le premier élément du tableau
concerné

Syntaxe : reset(array)

Utilisation de 'reset'

1 - <?php
2 - $countries = array("Paris", "Londres", "Berlin");
3 - while (list($key, $val) = each($countries))
4 - {
5 - echo "$val<br>\n";
6 - }
7 -
8 - reset($countries);
9 - ...
10 - ?>

Dans cet exemple, à la sortie de la boucle 'while', le pointeur est positionné sur la fin du tableau. L'instruction
'reset', en réinitialisant le pointeur, permet de parcourir à nouveau le tableau '$countries'.
page 107

Manipulation de tableaux

Intstructions - is_array

Cette fonction identifie si une variable est de type 'tableau'. Elle retourne la valeur 'true' si c'est le cas et la
valeur 'false' pour le contraire.

Syntaxe : is_array(var)

Utilisation de 'is_array'

1 - <?php
2 - $users = array("Paul", "Pierre", "Olivier", "Isabelle");
3 - $user = "Paul";
4 -
5 - if (!is_array($users))
6 - {
7 - echo "Cette variable n'est pas un tableau!<br>\n";
8 - }
9 - else
10 - {
11 - echo "variable ok<br>\n";
12 - }
13 -
14 - if (!is_array($user))
15 - {
16 - echo "Cette variable n'est pas un tableau!<br>\n";
17 - }
18 - else
19 - {
20 - echo "variable ok<br>\n";
21 - }
22 - ?>
page 108

Manipulation de répertoires et fichiers

Introduction - Trouver, lire, écrire, supprimer des fichiers

Un programme n'a d'intérêt que dans la mesure où il est capable de communiquer avec son environnement.
Un des axes fondamentaux de ce dialogue est sans conteste la lecture d'informations stockées dans un fichier
et, à l'inverse, l'enregistrement de données dans un fichier. En conséquence, le langage PHP se doit d'offrir aux
développeurs les moyens d'accomplir ces tâches.

PHP, à travers ses fonctions prédéfinies propose différents outils.

Pour la manipulation de fichiers et de répertoires :

- opendir
- readdir
- rewinddir
- closedir
- touch
- unlink
- fopen
- fclose
- file_exists
- copy
- tempnam
- tmpfile
- flock

Pour la lecture d'informations dans un fichier :

- fread
- fgets
- file
- readfile

Pour l'écriture d'informations dans un fichier :

- fwrite
- fputs
page 109

Manipulation de répertoires et fichiers

Instructions - opendir

'opendir' ouvre un répertoire, et récupère un pointeur. Cette fonction est utilisée en combinaison avec les
fonctions 'closedir()', 'readdir()' et 'rewinddir()'.

Syntaxe : opendir(dir)

Après avoir obtenu un pointeur de répertoire, il est possible -via la fonction 'readdir'- d'en parcourir le contenu. La fermeture
d'un répertoire se fait, elle, en passant le pointeur concerné à la fonction 'closedir'.

Utilisation de 'opendir'

1 - <?php
2 - if ($dir = opendir("."))
3 - {
4 - while($file = readdir($dir))
5 - {
6 - echo "$file<br>\n";
7 - }
8 - closedir($dir);
9 - }
10 - ?>

Le script ci-dessus va fournir la liste des fichiers contenus dans le répertoire courant.
page 110

Manipulation de répertoires et fichiers

Instructions - readdir

'readdir' retourne le nom du fichier suivant dans le répertoire ouvert via 'opendir' et identifié par 'dir_handle'.
Cette fonction est utilisée en combinaison avec les fonctions 'opendir()', 'closedir()' et 'rewinddir()'.

Syntaxe : readdir(dir_handle)

Utilisation de 'readdir' - listing d'un répertoire

1 - <?php
2 - if ($dir = opendir("."))
3 - {
4 - while($file = readdir($dir))
5 - {
6 - echo "<a href=\"$file\">$file<a><br>\n";
7 - }
8 - closedir($dir);
9 - }
10 - ?>

Le script ci-dessus va fournir la liste des fichiers contenus dans le répertoire courant. Ceux-ci sont présentés
sous la forme de liens hypertextes.

Utilisation de 'readdir' - listing d'un répertoire

1 - <?php
2 - if ($dir = opendir("."))
3 - {
4 - while($file = readdir($dir))
5 - {
6 - if ($file != "." and $file != "..")
7 - {
8 - echo "<a href=\"$file\">$file<a><br>\n";
9 - }
10 - }
11 - closedir($dir);
12 - }
13 - ?>

Si 'readdir' est censée retourner les noms des fichiers d'un répertoire, elle retourne également "." et ".." qui
représentent respectivement le répertoire courant et le répertoire supérieur. Il est aisé de se débarrasser de
ceux-ci, il suffit de le préciser comme montré dans l'exemple ci-dessus.
page 111

Manipulation de répertoires et fichiers

Instructions - rewinddir

'rewinddir' remet le pointeur de répertoire (ouvert via 'opendir') à zéro. Le pointeur est ainsi repositionné sur
la première entrée du répertoire concerné

Syntaxe : rewinddir(dir_handle)

Son effet est similaire à celui décrit pour la fonction de fichier 'rewind' et la fonction de tableau 'reset'.

Utilisation de 'rewinddir'

1 - <?php
2 - $dir = opendir(".");
3 -
4 - while($file = readdir($dir))
5 - {
6 - if ($file == "data.txt")
7 - copy("./data.txt", "data.bak");
8 - }
9 -
10 - rewinddir($dir);
11 -
12 - while($file = readdir($dir))
13 - {
14 - echo "$file<br>\n";
15 - }
16 - closedir($dir);
17 -
18 - ?>

Le premier parcours du répertoire nous permet de repérer si le fichier 'data.txt' existe et, dans ce cas, d'en
faire une copie de sauvegarde. Lors du deuxième parcours du répertoire on affiche à l'écran la liste des
fichiers rencontrés. Sans l'exécution de la commande 'rewinddir' entre les deux parcours, l'affichage du
contenu du répertoire est impossible. Le pointeur de répertoire serait en effet resté positionné sur la fin du
répertoire.
page 112

Manipulation de répertoires et fichiers

Instructions - closedir

'closedir' ferme le pointeur sur le répertoire ouvert via 'opendir'.

Syntaxe : closedir(dir_handle)

Utilisation de 'closedir'

1 - <?php
2 - if ($dir = opendir("."))
3 - {
4 - while($file = readdir($dir))
5 - {
6 - echo "$file<br>\n";
7 - }
8 - closedir($dir);
9 - }
10 - ?>

Le script ci-dessus va fournir la liste des fichiers contenus dans le répertoire courant. Le pointeur sur le
répertoire ouvert est fermé via 'closedir'.
page 113

Manipulation de répertoires et fichiers

Instructions - touch

Il est possible d'obtenir un nouveau fichier à l'aide de la fonction 'touch'. Celle-ci, à partir d'une chaîne de
caractères représentant un chemin d'accès, va essayer de créer un fichier vide sur disque. Si le fichier existe déjà,
son contenu n'est pas modifié, seule la date de dernière mise à jour du fichier est actualisée.

Syntaxe : touch(filename)

Utilisation de 'touch'

1 - if ($status == "activation")
2 - {
3 - touch("/tmp/lock.txt");
4 - ...
5 - }

'touch' convient par exemple parfaitement lorsqu'il s'agit de créer un fichier "sémaphore" en vue de bloquer/
débloquer l'une ou l'autre action dans une application.

Afin de supprimer un fichier existant, on utilise la fonction 'unlink'.


page 114

Manipulation de répertoires et fichiers

Instructions - unlink

Cette fonction supprime un fichier dans le système de fichiers du serveur courant.

Syntaxe : unlink(filename)

Utilisation de 'unlink'

1 - <?php
2 - if (!unlink("./data.bak"))
3 - {
4 - echo "Le fichier de backup n'a pu être supprimé";
5 - }
6 - else
7 - {
8 - echo "Le fichier de backup a été supprimé";
9 - }
10 - ?>

'unlink' est bien évidemment dépendante des droits en écriture qui sont associés aux fichiers que l'on veut
supprimer.
page 115

Manipulation de répertoires et fichiers

Instructions - fopen

Avant de pouvoir travailler avec un fichier, il est nécessaire de le rendre accessible au script, c'est-à-dire de
l'ouvrir pour une opération de lecture ou d'écriture. C'est la fonction 'fopen' qui est dans ce cas utilisée.

'fopen' ouvre un fichier (ou une URL) et retourne un pointeur sur ce fichier. Cette fonction peut être utilisée en combinaison
avec les fonctions 'fclose()', 'fread()', 'fgets()', 'fwrite()' et 'fputs()'.

Syntaxe : fopen(filename, mode)

Différents modes d'ouverture peuvent être utilisés :

- 'r' : Ouverture en lecture seule - le pointeur est placé au début du fichier


- 'r+' : Ouverture en lecture et écriture - le pointeur est placé au début du fichier
- 'w' : Ouverture en écriture seule - le pointeur est placé au début du fichier. La taille du fichier est réduite à 0. Si le
fichier n'existe pas, il est créé.
- 'w+' : Ouverture en lecture et écriture - le pointeur est placé au début du fichier. La taille du fichier est réduite à 0. Si
le fichier n'existe pas, il est créé.
- 'a' : Ouverture en écriture seule - le pointeur est placé à la fin du fichier. Si le fichier n'existe pas, il est créé.
- 'a+' : Ouverture en lecture et écriture - le pointeur est placé à la fin du fichier. Si le fichier n'existe pas, il est créé.

Utilisation de 'fopen'

1 - $fp = fopen("/docs/data.txt", "w");


2 - $fp = fopen("http://www.monsite.be/", "r");

Si la ressource qui est précisée (filename) commence par 'http', une connexion avec le serveur hébergeant
la ressource est établie et 'fopen' retourne un pointeur sur la réponse obtenue. 'fopen ' ne permet pas
cependant d'accéder aux en-têtes http de la réponse.

'fopen' et 'die'

1 - ($fp = fopen("/docs/data.txt", "r")) or die ("Impossible d'ouvrir le fichier");

Dans cette ligne d'instruction, l'utilisation de l'opérateur logique 'or' permet, dans la cas d'une tentative
d'ouverture infructueuse, d'exécuter la commande 'die' (commande qui affiche un message sur la sortie
standard et termine le script).
page 116

Manipulation de répertoires et fichiers

Instructions - fclose

Ferme le pointeur sur le fichier ouvert via la fonction 'fopen'.

Syntaxe : fclose(file_handle)

Utilisation de 'fclose'

1 - <?php
2 - $fp = fopen("/docs/data.txt", "w");
3 - ...
4 - fclose ($fp);
5 - ?>
page 117

Manipulation de répertoires et fichiers

Instructions - fwrite

'fwrite' permet d'écrire dans un fichier (précédemment ouvert en mode écriture via la fonction 'fopen').

Syntaxe : fwrite(file_handle, string [, length])

fwrite() écrit dans le fichier représenté par 'file_handle' le contenu de la chaîne string passée en paramètre.

Utilisation de 'fwrite'

1 - <?php
2 - $data = "Stern - John - jstern@sky.net
3 - Lantin - Luc - Luc.Lantin@bluesky.net
4 - Jamison - Michael - MJamison@sky.net
5 - Artman - Mark - Marc.Artman@ulb.ac.be@sky.net
6 - Carnes - Ann - Ann.Carnes@forest.net";
7 - $fp = fopen("./data.txt", "w");
8 - if(fwrite($fp, $data))
9 - {
10 - echo "Ecriture du fichier OK";
11 - }
12 - else
13 - {
14 - echo "Impossible d'écrire!";
15 - }
16 - fclose($fp);
17 - ?>

Il est possible de spécifier le nombre d'octets qui seront écrits en précisant le paramètre 'length' (optionnel).
page 118

Manipulation de répertoires et fichiers

Instructions - fread

'fread' permet de lire un fichier (précédemment ouvert en mode lecture via la fonction 'fopen').

Syntaxe : fread(file_handle, length)

Cette fonction lit un certain nombre d'octets dans le fichier représenté par 'file_handle'. La lecture s'arrête lorsque le
paramètre 'length' (précisé en octets) est atteint, ou que l'on a atteint la fin du fichier.

Utilisation de 'fread'

1 - <?php
2 - $fp = fopen("./data.txt", "r");
3 - $contents = fread ($fp, 1024);
4 - echo nl2br($contents);
5 - fclose($fp);
6 - ?>

Le résultat de la lecture du fichier est placé dans une variable de type 'string' qui peut être manipulée en vue
de différents traitements (ici la conversion des caractères de nouvelle ligne en retour de chariot HTML et
l'affichage du contenu à l'écran).

Combinaison de 'fread' et 'filesize'

1 - <?php
2 - $fp = fopen("./data.txt", "r");
3 - $contents = fread ($fp, filesize("./data.txt"));
4 - echo nl2br($contents);
5 - fclose($fp);
6 - ?>

Au lieu de spécifier directement le nombre d'octets qui devront être lus, on passe par l'intermédiaire de la
fonction 'filesize' qui retourne la taille (en octets) du fichier précisé en paramètre.

Intégration de la procédure de lecture dans une fonction

1 - <?php
2 - // définition de la fonction
3 - function print_data ($file_path)
4 - {
5 - $fp = fopen("$file_path", "r");
6 - $contents = fread ($fp, filesize("$file_path"));
7 - echo nl2br($contents);
8 - fclose($fp);
9 - }
10 -
11 - // appels de la fonction
12 - print_data("data/intro.txt");
13 - print_data("data/alert.txt");
14 - ?>

En intégrant cette procédure de lecture dans une fonction on se dote d'un outil qui peut être réutilisé très
simplement. On "économise" ainsi du code et on améliore la modularité des scripts.
page 119

Manipulation de répertoires et fichiers

Instructions - fgets

Cette fonction permet de lire ce qui se trouve sur la ligne courante d'un fichier (précédemment ouvert en mode
lecture via la fonction 'fopen').

Syntaxe : fgets(file_handle, length)

'fgets()' renvoie la chaîne de caractères qui a pu être lue en fonction de la longueur en octets precisée via le paramètre
'length' ou jusqu'à ce qu'un carctère de nouvelle ligne (retour de chariot) soit rencontré.

Utilisation de 'fgets'

1 - <?php
2 - $fp = fopen ("./data.txt", "r");
3 - while (!feof($fp))
4 - {
5 - $buffer = fgets($fp, 1024);
6 - echo nl2br($buffer);
7 - }
8 - fclose($fp);
9 - ?>

Afin de lire le contenu d'un fichier ligne par ligne, on utilise ici une boucle 'while'. La condition de boucle
fait référence à la fonction 'feof' qui teste la fin du fichier ('feof' retourne TRUE si le pointeur est à la fin du
fichier).
page 120

Manipulation de répertoires et fichiers

Instructions - file

Cette fonction renvoie sous forme de tableau le contenu d'un fichier passé en paramètre. Le caractère de
nouvelle ligne est utilisé comme séparateur de données.

Syntaxe : file(filename)

'file()' ouvre, lit et ferme automatiquement le fichier que l'on désire exploiter. La lecture du fichier se fait ligne par ligne,
chaque ligne étant stockée dans un élément d'un tableau. Les données ainsi récupérées sont prêtes à être manipulées dans
le script - il suffira d'avoir recours aux fonctions de traitement des tableaux (comme présenté dans l'exemple ci-dessous).

Utilisation de 'file'

1 - <?php
2 - $lines = file ("./data.txt");
3 - foreach($lines as $line)
4 - {
5 - echo nl2br($line);
6 - }
7 - ?>

Le fichier 'data.txt' est passé à la fonction 'file'. Celle-ci stocke toutes les lignes du fichier dans une variable
de type 'array'. Ensuite une structure de boucle 'foreach' parcourt le tableau '$lines' et en affiche toutes les
valeurs (la fonction 'nl2br' est utilisée afin de traduire les caractères de nouvelle ligne en retour de chariot
HTML).
page 121

Manipulation de répertoires et fichiers

Instructions - readfile

'readfile' récupère le contenu d'un fichier passé en paramètre et l'envoie sur la sortie standard. Il n'est ici pas
nécessaire d'obtenir préalablement un pointeur de fichier.

Syntaxe : readfile(filename)

Utilisation de 'readfile'

1 - <?php
2 - readfile ("./data.txt");
3 - ?>

Le fichier 'data.txt' est passé à la fonction 'readfile'. Le rôle de celle-ci est d'en retourner le contenu complet.
Dans notre cas, on obtient l'affichage 'brut' dans la fenêtre du navigateur du contenu du fichier 'data.txt'.
page 122

Manipulation de répertoires et fichiers

Instructions - filesize

Cette fonction retourne la taille (en octets) du fichier précisé en paramètre.

Syntaxe : filesize(filename)

Utilisation de 'filesize'

1 - <?php
2 - $fp = fopen("./data.txt", "r");
3 - $contents = fread ($fp, filesize("./data.txt"));
4 - echo nl2br($contents);
5 - fclose($fp);
6 - ?>

Le script ci-dessus affiche à l'écran tout le contenu du fichier 'data.txt'. La fonction 'filesize' est utilisée afin
d'obtenir la taille du fichier et de l'exploiter comme paramètre de la fonction 'fread'.
page 123

Manipulation de répertoires et fichiers

Instructions - feof

Cette fonction teste la fin d'un fichier (précédemment ouvert via la fonction 'fopen').

Syntaxe : feof(file_handle)

Utilisation de 'feof'

1 - <?php
2 - $fp = fopen ("./data.txt", "r");
3 - while (!feof($fp))
4 - {
5 - $buffer = fgets($fp, 1024);
6 - echo nl2br($buffer);
7 - }
8 - fclose($fp);
9 - ?>

Dans cette procédure de lecture d'un fichier ligne par ligne, la condition de boucle fait référence à la fonction
'feof' qui teste la fin du fichier ('feof' retourne TRUE si le pointeur est à la fin du fichier et la boucle est en
conséquence stoppée).
page 124

Manipulation de répertoires et fichiers

Instructions - file_exists

Cette fonction teste si un fichier existe bien dans le système de fichiers du serveur courant. Elle prend pour
argument le chemin d'accès d'un fichier.

Syntaxe : file_exists(filename)

L'utilisation de 'file_exists' avant l'ouverture d'un fichier est certainement une bonne précaution à prendre si l'on veut éviter
de voir apparaître à l'écran, dans le cas où le fichier visé est absent, des messages d'erreurs indésirables. Ces derniers
pourraient en effet troubler l'utilisateur ou dévoiler les chemins d'accès de vos fichiers (ce qui engendre un problème de
sécurité).

Utilisation de 'file_exists'

1 - <?php
2 - if (file_exists("./data.txt"))
3 - {
4 - $fp = fopen ("./data.txt", "r");
5 - while (!feof($fp))
6 - {
7 - $buffer = fgets($fp, 1024);
8 - echo nl2br($buffer);
9 - }
10 - fclose($fp);
11 - }
12 - else
13 - {
14 - echo "Erreur: le fichier data.txt n'est pas disponible";
15 - }
16 - ?>

Grâce à l'utilisation de la fonction 'file_exists' la lecture du fichier 'data.txt' est conditionnée par sa présence
sur le système.

Utilisation d'un sémaphore

1 - <?php
2 - if (file_exists("./data.sem"))
3 - {
4 - echo "Erreur: le fichier data est en cours d'édition";
5 - }
6 - else
7 - {
8 - $fp = fopen ("./data.txt", "r");
9 - while (!feof($fp))
10 - {
11 - $buffer = fgets($fp, 1024);
12 - echo nl2br($buffer);
13 - }
14 - fclose($fp);
15 - }
16 - ?>

Si le fichier data.sem est présent sur le système un message d'erreur est envoyé (on se sert du fichier
data.sem comme d'un sémaphore - nous considérons dans cet exemple que l'existence du fichier 'data.sem'
indique que le fichier 'data.txt' est utilisé par un autre utilisateur). Dans le cas contraire, le fichier 'data.txt' est
ouvert en lecture et pourra être manipulé.
page 125

'file_exists' ne peut être utilisée sur des fichiers distants. Afin de tester l'existence d'un fichier distant on peut avoir recours
à 'fopen'.

Tester un fichier distant

1 - <?php
2 - $fp = @fopen("http://www.monsite.be/arch/045.html","r");
3 - if ($fp)
4 - {
5 - echo "Ce document existe.";
6 - }
7 - else
8 - {
9 - echo "Ce document n'existe pas.";
10 - }
11 - ?>

A noter le signe '@' devant la fonction 'fopen'. Celui-ci empêche l'affichage de messages d'erreurs (envoyés
par le serveur) dans le cas où le fichier n'aurait pu être ouvert.
page 126

Manipulation de répertoires et fichiers

Instructions - copy

Cette fonction permet de copier un fichier 'source' vers un fichier 'destination'. Si le fichier de destination existe
déjà son contenu sera écrasé par celui du fichier source. Si le fichier de destination n'existe pas, il est créé en lui
associant le nom et le contenu du fichier source.

Syntaxe : copy(source, destination)

Les familiers des systèmes Unix/Linux feront naturellement le parallèle avec la commande 'cp <source> <destination>'.

Utilisation de 'copy'

1 - <?php
2 - $data = "Stern - John - jstern@sky.net
3 - Lantin - Luc - Luc.Lantin@bluesky.net
4 - Jamison - Michael - MJamison@sky.net
5 - Artman - Mark - Marc.Artman@ulb.ac.be@sky.net
6 - Carnes - Ann - Ann.Carnes@forest.net
7 - ";
8 - if (!copy("./data.txt", "data.bak"))
9 - {
10 - echo "Le fichier de backup n'a pu être créé";
11 - }
12 - else
13 - {
14 - $fp = fopen("./data.txt", "w");
15 - fwrite($fp, $data);
16 - fclose($fp);
17 - echo "Ecriture du fichier data.txt OK<br>\n";
18 - echo "Fichier de backup : data.bak";
19 - }
20 - ?>

Le script ci-dessus effectue une copie de sauvegarde du fichier 'data.txt'. Si l'opération s'est bien passée
alors de nouvelles données sont enregistrées dans le fichier 'data.txt'.
page 127

Manipulation de répertoires et fichiers

Instructions - tempnam

Cette fonction crée un fichier et lui donne un nom unique.

Syntaxe : tempnam(dir, prefix)

'tempnam' utilise le paramètre 'dir' afin de déterminer dans quel répertoire il doit créer le fichier. Si le paramètre 'dir' ne peut
être observé, le fichier sera créé dans le répertoire temporaire définit par défaut sur le système de fichiers courant.

'tempnam', pour donner un nom au fichier créé, utilise comme préfixe les caractères précisés via le paramètre 'prefix'.

Utilisation de 'tempnam'

1 - <?php
2 - $data = "Stern - John - jstern@sky.net
3 - Lantin - Luc - Luc.Lantin@bluesky.net
4 - Jamison - Michael - MJamison@sky.net
5 - Artman - Mark - Marc.Artman@ulb.ac.be@sky.net
6 - Carnes - Ann - Ann.Carnes@forest.net
7 - ";
8 - // Création du fichier temporaire
9 - $file = tempnam(".","demo");
10 - $fp = fopen("$file", "w");
11 - if(fwrite($fp, $data))
12 - {
13 - echo "Ecriture du fichier OK<br>";
14 - echo "Le fichier temporaire a pour nom : $file";
15 - }
16 - else
17 - {
18 - echo "Impossible d'écrire!";
19 - }
20 - fclose($fp);
21 - // Suppression du fichier temporaire
22 - unlink("$file");
23 - ?>

Sur les systèmes Windows, 'tempnam' n'utilise que les trois premiers caractères du paramètre 'prefix'.
page 128

Manipulation de répertoires et fichiers

Instructions - tmpfile

Cette fonction crée un fichier temporaire et l'ouvre en mode écriture.

Syntaxe : tmpfile()

'tmpfile' crée un fichier dans le répertoire temporaire définit par défaut sur le système de fichiers courant et lui donne un nom
unique. Ce fichier sera automatiquement supprimé à la fin de l'exécution du script (ou si la fonction 'fclose' est rencontrée).

La création de ce fichier temporaire retourne un pointeur de fichier directement disponible en mode écriture.

Les fichiers temporaires sont bien utiles dans de nombreux cas de figure: ils peuvent être utilisés afin de stocker des
paramètres et variables de configuration, de servir de support pour certaines manipulations (xml/xsl), d'enregistrer des
variables de sessions ...

Utilisation de 'tmpfile'

1 - <?php
2 - $data = "Stern - John - jstern@sky.net
3 - Lantin - Luc - Luc.Lantin@bluesky.net
4 - Jamison - Michael - MJamison@sky.net
5 - Artman - Mark - Marc.Artman@ulb.ac.be@sky.net
6 - Carnes - Ann - Ann.Carnes@forest.net
7 - ";
8 -
9 - // Création du fichier temporaire
10 - $fp = tmpfile();
11 -
12 - // Ecriture dans le fichier temporaire
13 - fwrite($fp, $data);
14 -
15 - // Placement du pointeur de fichier au début
16 - rewind ($fp);
17 -
18 - // Lecture du contenu du fichier temporaire
19 - while (!feof($fp))
20 - {
21 - $buffer = fgets($fp, 1024);
22 - echo nl2br($buffer);
23 - }
24 -
25 - // Fermeture du pointeur de fichier
26 - fclose($fp);
27 - ?>

Dans ce script, la fonction 'rewind()' est utilisée -juste après l'action d'écriture- afin de replacer le pointeur de
fichier en début de fichier. Ceci permet en effet de passer à la phase de lecture du fichier temporaire.
page 129

Manipulation de répertoires et fichiers

Instructions - flock

'flock' permet d'obtenir un verrou sur un fichier. Ce verrou va prévenir les collisions lors d'accès concurrents
au fichier concerné.

Dans le cadre d'un développement informatique, il est en effet toujours important de gérer correctement les risques d'accès
concurrentiel au même fichier; pour cela il faut instaurer un mécanisme d'accès exclusif aux données du fichier. Le problème
est identique à celui qui se pose pour les bases de données quand plusieurs utilisateurs veulent interroger ou modifier
simultanément le contenu d'un champ. Le principe du verrouillage de fichiers permet de résoudre ce problème.

Syntaxe : flock(file_handle, operation_type)

Cette fonction prend pour arguments le pointeur de fichier sur lequel va porter le verrou ainsi que le type d'opérations à
mener.

Trois types d'opérations avec un verrou sont possibles :

- '1' : obtention d'un accès partagé en mode lecture. Ce verrou empêche l'écriture dans le fichier alors qu'une lecture
est en cours - plusieurs personnes peuvent cependant accéder en parallèle au fichier en lecture.
- '2' : obtention d'un accès exclusif en écriture.
- '3' : désactivation d'un verrou (partagé ou exclusif)

Lorsqu'un processus/script désire écrire dans un fichier, il demande un verrouillage du fichier concerné. Tant que le
processus/script conservera le verrou, aucun autre processus ne pourra obtenir de verrou sur le fichier en question. De
même, avant de lire le contenu d'un fichier, un processus/script demande un verrou, ce qui prévient toute modification
durant la consultation.

Utilisation de 'flock'

1 - <?php
2 - $fdr = fopen("acces.dat", "r");
3 - if (flock($fdr,1))
4 - {
5 - $content = fread ($fdr, filesize("acces.dat") );
6 - }
7 - fclose($fdr);
8 -
9 - $fd = fopen("acces.dat", "a+");
10 - if(flock($fd,2))
11 - {
12 - $fdsafe = fopen('acces.dat', 'w');
13 - fwrite($fdsafe,$contentnew);
14 - fclose($fdsafe);
15 - }
16 - fclose($fd);
17 - ?>

Dans ce script, la fonction 'rewind()' est utilisée -juste après l'action d'écriture- afin de replacer le pointeur de
fichier en début de fichier. Ceci permet en effet de passer à la phase de lecture du fichier temporaire.
page 130

Expressions régulières
Introduction - Exploiter les expressions régulières

Les expressions régulières permettent de définir des modèles à comparer à une chaîne de caractères.
En pratique, elles facilitent grandement la manipulation de textes et de données: recherche, comparaison,
substitution, tri de caractères. Elles sont utilisées par de nombreux programmes et leur exploitation constitue pour
certains langages de programmation un atout principal (Perl, sed, shell Unix, Python ...). PHP propose une série de
fonctions donnant accès à la "puissance" des expressions régulières; mais encore faut-il maîtriser ces dernières!
Attention, ce chapitre n'a qu'une valeur d'introduction, il n'a pas l'ambition de vouloir couvrir la technique des expressions
régulières : c'est un aperçu destiné à donner une idée d'ensemble de ce domaine.

Qu'est-ce qu'une expression régulière

Une expression régulière définit un "modèle"; celui-ci pourra être comparé à un ensemble de chaînes de caractères. Le
modèle détermine les critères d'appartenance d'une chaîne à un ensemble (les mots commençant par la lettre 's', les mots
contenant la suite de caractères 'http' ou se terminant par '.com' ...).

Exemples de modèles
On codera l'ensemble des caractères alphabétiques (en minuscules) avec l'expression régulière :
[a-z]

On codera l'ensemble des caractères alphabétiques (en majuscules) avec l'expression régulière :
[A-Z]

On codera une chaîne de caractères qui commence par 'http' avec l'expression régulière :
^http

On codera une chaîne de caractères qui se termine par 'be' avec l'expression régulière :
be$

Comment constituer une expression régulière ?

Une expression régulière, comme on peut le constater dans les exemples ci-dessus, se limite à une suite de caractères.
Cette suite est composée de deux types de caractères: les caractères dits "spéciaux" et les caractères dits "normaux". Les
caractères spéciaux (ou caractères "réservés") ont une signification particulière pour le moteur/programme qui interprètera
l'expression régulière. Les caractères normaux (ou standards) représentent, eux, les caractères alphanumériques habituels
(abc ..., 123 ...).

L'exemple le plus basic d'expression régulière est certainement un suite de caractères standards (l'expression "ville"
représente simplement le mot "ville"). Mais, en utilisant des caractères spéciaux on peut rendre cet exemple plus
sophistiqué (l'expression "villes?" représente les mots "ville" et "villes").

Analysons à présent la signification de quelques caractères spéciaux :

Le caractère "^" indique le début d'une chaîne de caractères


^u : représente les chaînes qui commencent par la lettre "u"
page 131

Le caractère "$" indique la fin d'une chaîne de caractères


s$ : représente les chaînes qui se terminent par la lettre "s"

Les caractères "+", "*" et "?" expriment le nombre d'occurences d'un caractère ou d'une séquence
a+ : représente les chaînes contenant au moins une fois la lettre "a"
e*: représente 0,1, ou plusieurs occurences de la lettre "e"
s? : représente 0 ou 1 occurence de la lettre "s"

Le caractère "." représente n'importe quel caractère unique


a.+ : représente les chaînes contenant la lettre "a" suivie d'au moins un caractère

La barre verticale "|" traduit une alternative


du|des : représente les chaînes "du" ou "des"

Les crochets [ ] précisent une liste de caractères à envisager


[abc] : représente les lettres "a", "b" ou "c"
[^abc] : représente n'importe quel caractère sauf les lettres "a", "b" et "c"
^[abc] : représente les mots qui commencent par la lettre "a", "b" ou "c"
^[a-z] : représente les mots qui commencent par une lettre minuscule

Exemples de composition d'expressions régulières

villes?
représente l'ensemble { "ville" , "villes" }

Mme|Melle
représente l'ensemble { "Mme" , "Melle" }

arti(san|iste)
représente l'ensemble { "artisan" , "artiste" }

[Oo]livier
représente l'ensemble { "Olivier" , "olivier" }

Il existe bien évidemment différentes façons de formuler une expression régulière pour obtenir un même
résultat. Certaines sont plus faciles à comprendre, d'autres sont plus puissantes ou plus élégantes.
page 132

Quelques expressions utiles

[0-9] ou \s
correspond à un chiffre de 0 à 9

[^0-9] ou \S
correspond à tout sauf à un chiffre de 0 à 9

^[0-9]+$
correspond aux nombres entiers

[a-zA-Z0-9_] ou \w
correspond à un caractère mot

[ \t\n\r] ou \s
correspond à un caractère d'espace (espace simple, tabulation, nouvelle ligne, retour à la ligne)

^[^@ ]+@[^@ ]+\.[^@ \.]+$


correspond à une adresse de courrier électronique

^[a-zA-Z0-9]+://[^ ]+$
correspond à une adresse url

Qui interprète les expressions régulières ?

Les expressions régulières pour être d'une quelconque utilité ne peuvent se limiter à n'être que formulées, elles doivent être
interprétées. C'est à ce stade qu'interviennent classiquement des langages tels que Perl, Python ou des outils Unix comme
sed et vi. PHP n'est pas en reste: il propose un certain nombre de fonctions prédéfinies telles que 'ereg' et 'ereg_replace'
qui permettent respectivement de retrouver et de remplacer une chaîne de caractères sur base d'une expression régulière.
page 133

Expressions régulières

Instructions - preg_match

'preg_match' permet de rechercher une séquence de caractères en utilisant la puissance des expressions
régulières.

Syntaxe : preg_match(pattern, subject)

'preg_match' recherche dans la chaîne 'subject' les séquences de caractères représentées par l'expression régulière
'pattern'. Elle retourne un booléen - soit true (vrai) si elle a trouvé la chaîne recherchée, soit false (faux) dans le cas contraire.

Utilisation de 'preg_match'

1 - <?php
2 - if ($dir = opendir("."))
3 - {
4 - while($file = readdir($dir))
5 - {
6 - if (preg_match("/htm/", $file))
7 - {
8 - echo "<a href=\"$file\">$file</a><br>\n";
9 - }
10 - }
11 - closedir($dir);
12 - }
13 - ?>

Le script ci-dessus va fournir la liste des fichiers (du répertoire courant) dont le nom contient la séquence
'htm'.
La recherche est sensible à la casse.

L'expression régulière est précisée entre délimiteur - ici le caractère '/' mais vous pouvez toujours en choisir un autre comme
'#'. Ceux-ci permettent d'isoler l'espression de ses options. On peut citer par exemple l'option 'i' qui rend la recherche
insensible à la casse.

Précision d'une option pour une expression régulière

1 - <?php
2 - if ($dir = opendir("."))
3 - {
4 - while($file = readdir($dir))
5 - {
6 - if (preg_match("/htm/i", $file))
7 - {
8 - echo "<a href=\"$file\">$file</a><br>\n";
9 - }
10 - }
11 - closedir($dir);
12 - }
13 - ?>

Le script ci-dessus va fournir la liste des fichiers (du répertoire courant) dont le nom contient la séquence
'htm' sans se soucier des majuscules/minuscules.

Stockage des résultats obtenus

Il est également possible de préciser un troisième argument (de type array) destiné à stocker les résultats obtenus.
page 134

Syntaxe : preg_match(pattern, subject, matches)

Ceci est particulièrement utile lorsque l'on conjuge cette possibilité avec les parenthèses capturantes des expressions
régulières. Les séquences trouvées sont alors enregistrées dans une structure en tableau et peuvent donc être exploitées
dans la suite du script à travers des variables.

Utilisation de 'preg_match' - parenthèses capturantes

1 - <?php
2 - $filehandle = fopen("data.txt", "r");
3 - while (!feof($filehandle))
4 - {
5 - $line = fgets($filehandle, 2024);
6 - preg_match("/(.*)-(.*)-(.*)/", $line, $matches);
7 - echo "
8 - <p>
9 - Nom : $matches[1]<br/>
10 - Prénom : $matches[2]<br/>
11 - Email : $matches[3]<br/>
12 - </p>
13 - ";
14 - }
15 - fclose($filehandle);
16 - ?>

$matches[1] contiendra la première parenthèse capturante, $matches[2] contiendra la deuxième parenthèse


capturante, et ainsi de suite. $matches[0] contient une copie de la chaîne.

Utilisation de 'preg_match' - parenthèses capturantes

1 - <?php
2 - // Transformation d'une date au format DD.MM.YYYY
3 - // en une date au format YYYY-MM-DD
4 - $date = "26-12-2001";
5 - if (preg_match("/([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})/", $date, $regs))
6 - {
7 - echo "$regs[3]-$regs[2]-$regs[1]";
8 - }
9 - ?>

$regs[1] contiendra la valeur du jour, $regs[2] le mois et $regs[3] l'année.

Utilisation de 'preg_match' - parenthèses capturantes

1 - <?php
2 - $fp = fopen("./varext.html", "r");
3 - $contents = fread ($fp, 2048);
4 - if (preg_match("/<title>(.+)<\/title>/",$contents,$res))
5 - {
6 - echo "Le titre du fichier varext.html est : <b>$res[1]</b>";
7 - }
8 - fclose($fp);
9 - ?>

Le script ci-dessus va repérer le titre HTML d'un document et l'afficher à l'écran. Les parenthèses
capturantes récupèrent ce qui est placé entre les balises <title></title>.
page 135

Expressions régulières

Instructions - preg_replace

Cette fonction permet d'effectuer des remplacements de chaînes de caractères sur base d'expressions
régulières.

Syntaxe : preg_replace(pattern, replacement, subject)

'preg_replace' recherche la séquence de caractère 'pattern' dans la chaîne 'subject' et en remplace les occurrences par
la chaîne 'replacement'.

Utilisation de 'preg_replace'

1 - <?php
2 - $fp = fopen("./data.txt", "r");
3 - $contents = fread ($fp, 2048);
4 - $contents = preg_replace("/\n/","<br>",$contents);
5 - echo $contents;
6 - fclose($fp);
7 - ?>

Le script ci-dessus va convertir les caractères de nouvelle ligne en retour de chariot HTML <br> (voir
également la fonction 'nl2br').

On peut par exemple utiliser 'preg_replace' afin de convertir en liens cliquables toutes les adresses url (http://...) qui
apparaîtraient dans un texte.

Conversion d'adresses url

1 - <?php
2 - function url_resolver ($text)
3 - {
4 - $ntext = preg_replace("/[[:alpha:]]+:\/\/[^<>>[:space:]]+[[:alnum:]\/]/",
5 - "<a href=\"\\0\">\\0</a>", $text);
6 - return $ntext;
7 - }
8 -
9 - $text = "http://www.lesoir.be/ et http://www.lemonde.fr/";
10 - echo url_resolver($text);
11 - ?>

Cette fonction reçoit une chaîne de caractères en paramètre ($text) et la transforme via 'preg_replace'. La
nouvelle chaîne ($ntext), c'est-à-dire celle dont toutes les urls ont été converties en liens cliquables, est
ensuite retournée à l'instruction appelante.
page 136

Connexions ODBC

Introduction - Open DataBase Connectivity

ODBC signifie Open DataBase Connectivity; A l'origine conçue comme une technologie 'middleware' d'accès
aux données de type Microsoft et compatible SQL, elle est rapidement devenue un standard de fait en ce qui
concerne l'accès aux systèmes de gestion de bases de données.

La technologie ODBC permet en effet d'interfacer une application à n'importe quel serveur de bases de données, pour peu
que celui-ci possède un driver ODBC (la quasi-totalité des SGBD possèdent un tel pilote).
page 137

Connexions ODBC

Instructions - odbc_connect

'odbc_connect' permet d'établir une connexion à une base de données ODBC. Cette fonction retourne, en cas
de succès, un identifiant de connexion ODBC. L'identifiant retourné sera utilisé afin d'identifier la connexion lors
des accès ultérieurs. Il est indispensable pour l'exploitation des autres fonctions ODBC.

Syntaxe : odbc_connect(datasource, user, password)

'odbc_connect' est utilisé en combinaison avec les fonctions 'odbc_exec()', 'odbc_fetch_row()', 'odbc_result()' et
'odbc_fetch_into()'.

Utilisation de 'odbc_connect'

1 - <?php
2 - if (odbc_connect("webusers", "", ""))
3 - {
4 - echo "Connexion établie";
5 - }
6 - else
7 - {
8 - echo "Problème de connexion";
9 - }
10 - ?>

Le script ci-dessus établit la connexion avec la datasource ODBC qui porte le nom "webusers". Dans ce
cas-ci le login et le password ne sont pas utilisés.
page 138

Connexions ODBC

Instructions - odbc_exec

'odbc_exec' exécute une requête SQL. Cette fonction retourne, en cas de succès, un identifiant de résultat
ODBC.

Syntaxe : odbc_exec(connection_id, query_string)

odbc_exec() envoie une commande SQL 'query_string' en utilisant la connexion à la datasource représentée par
'connection_id'.

Utilisation de 'odbc_exec'

1 - <?php
2 - $query = "SELECT * FROM users";
3 - $dbc = odbc_connect("webusers", "", "");
4 - if (odbc_exec($dbc, $query))
5 - {
6 - echo "query OK";
7 - }
8 - ?>

Le script ci-dessus établit une connexion ODBC et exécute une requête SQL.
page 139

Connexions ODBC

Instructions - odbc_fetch_row

Cette fonction lit une ligne résultat de l'exécution d'une requête SQL.

Syntaxe : odbc_fetch_row(result_id)

Le paramètre 'result_id' fait référence à l'identifiant de résultat retourné par la fonction 'odbc_exec()'. 'odbc_fetch_row' lit
la ligne courante et positionne le curseur sur la ligne suivante.

Une fois odbc_fetch_row() utilisé, les champs de réponse seront accessibles via la fonction odbc_result().

Utilisation de 'odbc_fetch_row'

1 - <?php
2 - $dbc=odbc_connect("webusers", "", "");
3 - $cur=odbc_exec($dbc,"SELECT * FROM users");
4 - while(odbc_fetch_row($cur))
5 - {
6 - echo "<p>";
7 - echo "Nom: " . odbc_result($cur, 2) . "<br>";
8 - echo "Prénom: " . odbc_result($cur, "prenom") . "<br>";
9 - echo "Email: " . odbc_result($cur, 4) . "<br>";
10 - echo "</p>";
11 - }
12 - ?>

Le script ci-dessus établit une connexion ODBC, exécute une requête SQL, récupère et présente le résultat.
page 140

Connexions ODBC

Instructions - odbc_result

'odbc_result' permet de récupérer le contenu d'un champ réponse. Cette récupération se fait à partir de la ligne
résultat renvoyée par la fonction 'odbc_fetch_row'.

Syntaxe : odbc_result(result_id, field)

Le paramètre 'result_id' precise l'identifiant de résultat sur lequel va porter 'odbc_result'. Le paramètre 'field' précise quel
champ doit être récupéré (cette précision peut se faire soit via un entier, représentant le numéro de colonne du champ,
soit via une chaîne de caractères, représentant le nom du champ.

Utilisation de 'odbc_result'

1 - <?php
2 - $dbc=odbc_connect("webusers", "", "");
3 - $cur=odbc_exec($dbc,"SELECT * FROM users");
4 - while(odbc_fetch_row($cur))
5 - {
6 - echo "<p>";
7 - echo "Nom: " . odbc_result($cur, 2) . "<br>";
8 - echo "Prénom: " . odbc_result($cur, "prenom") . "<br>";
9 - echo "Email: " . odbc_result($cur, 4) . "<br>";
10 - echo "</p>";
11 - }
12 - ?>

Le script ci-dessus établit une connexion ODBC, exécute une requête SQL, récupère et présente le résultat.
page 141

Connexions ODBC

Instructions - odbc_result_all

'odbc_result_all' affiche - dans une table HTML - toutes les lignes du résultat de l'exécution d'une requête SQL
via la fonction 'odbc_exec'.

Syntaxe : odbc_result_all(result_id)

Utilisation de 'odbc_result_all'

1 - <?php
2 - $dbc=odbc_connect("webusers", "", "");
3 - $cur=odbc_exec($dbc,"SELECT * FROM users");
4 - odbc_result_all($cur);
5 - ?>

Le script ci-dessus établit une connexion ODBC, exécute une requête SQL, récupère et présente les lignes
de résultat dans une table HTML. Cette fonction est essentiellement utile dans la phase de debuging.
page 142

Connexions ODBC

Instructions - odbc_fetch_into

'odbc_fetch_into' lit une ligne résultat de l'exécution d'une requête SQL et en place les éléments dans un
tableau.

Syntaxe : odbc_fetch_into(result_id, rownumber, result)

Le paramètre 'result_id' précise l'identifiant de résultat sur lequel va porter 'odbc_fetch_into'. Le paramètre
'rownumber' (optionnel) permet d'indiquer un numéro de ligne. Le paramètre 'result' indique le tableau destiné à recevoir
les éléments de réponse (les champs sont indicés à partir de 0).

Utilisation de 'odbc_fetch_into'

1 - <?php
2 - $dbc=odbc_connect("webusers", "", "");
3 - $cur=odbc_exec($dbc,"SELECT * FROM users");
4 - while(odbc_fetch_into($cur, $result))
5 - {
6 - echo "<p>";
7 - echo "ID: $result[0]<br>";
8 - echo "Nom: $result[1]<br>";
9 - echo "Prénom: $result[2]<br>";
10 - echo "Email: $result[3]<br>";
11 - echo "</p>";
12 - }
13 - ?>

Le script ci-dessus établit une connexion ODBC, exécute une requête SQL, récupère les lignes de résultat
et les place dans un tableau. Le tableau est ensuite sollicité afin d'afficher les resultats à l'écran.

Combinaison de 'odbc_fetch_into' et 'list'

1 - <?php
2 - $dbc=odbc_connect("webusers", "", "");
3 - $cur=odbc_exec($dbc,"SELECT * FROM users");
4 - while(odbc_fetch_into($cur, $result))
5 - {
6 - echo "<p>";
7 - list($id, $nom, $prenom, $email, $priv)=$result;
8 - echo "ID: $id<br>";
9 - echo "Nom: $nom<br>";
10 - echo "Prénom: $prenom<br>";
11 - echo "Email: $email<br>";
12 - echo "</p>";
13 - }
14 - ?>

Le script ci-dessus établit une connexion ODBC, exécute une requête SQL, récupère les lignes de résultat
et les place dans un tableau. La commande 'list' permet - à partir de ce tableau - d'assigner une série de
variables avec les valeurs des champs issus de la base de données.
page 143

Connexions PDO

Introduction - PDO - Interface d'abstraction

Dans le domaine de l'exploitation des bases de données par programmation, PHP intègre en standard
l'extension PDO (PHP Data Objects). Celle-ci offre une interface uniforme d'accès aux bases de données : la façon
de coder en PHP ne dépend donc plus du logiciel de gestion de bases de données choisi (MySQL, MariaDB, SQLite,
Oracle etc.).

Pour le programmeur, les avantages d'une telle "couche d'abstraction" sont :

- la portabilité du code PHP;


- la possibilité prendre en compte des sources de données différentes;
- l'assouplissement de la migration d'un système de base de données à un autre.

Limitation

PDO ne constitue pas une couche d'abstraction complète pour l'interfaçage bases de données. En
effet, si les procédures sont les mêmes, le code SQL lui demeure spécifique à chaque moteur de
DB. On peut repousser cette limitation de différentes manières. On peut par exemple s'astreindre
à limiter le code SQL utilisé au sous-ensemble SQL ANSI 92 (relativement bien supporté par les
SGBD) ou encore utiliser des fichiers de configuration spécifiques pour stocker les requêtes.

Concrètement, l'accès à une base de données avec PDO, comme pour les extension précédentes, va se réaliser en 4
étapes :

- la connexion;
- la requête SQL;
- le traitement du résultat;
- la déconnexion.

Voici les principaaux éléments de cette extension qui vont être sollicités pour ces opérations :

- le constructeur "PDO" : établissement de la connexion


- la méthode "query" : exécution d'une requête SQL
- la méthode "fetch" : récupération d'une ligne résultat
page 144

Connexions PDO

Instructions - PDO construct

Le constructeur crée une instance PDO qui va représenter une connexion à la base de données durant
l'exécution du script.

Syntaxe : PDO::__construct(dsn, username, password)

Le "Data Source Name" (dsn) contient les informations nécessaires à l'établissement d'une connexion à une base de
données spécifique (le nom du pilote PDO suivi d'une syntaxe spécifique au pilote).

Connexion PDO à MySQL

1 - <?php
2 - $hostname = "localhost";
3 - $username = "admin";
4 - $password = "xbz22";
5 -
6 - try
7 - {
8 - $dbh = new PDO("mysql:host=$hostname;dbname=company", $username, $password);
9 - echo "Connexion OK";
10 - }
11 - catch(PDOException $e)
12 - {
13 - echo $e->getMessage();
14 - }
15 - ?>

La connexion se fait en instanciant un objet de la classe PDO.


Dans cet exemple le "dsn" détermine le moteur de base de données visé (mysql) et précise le nom de la
base de données de travail (company).

Le code de connexion est entouré d'un bloc "try" pour faciliter la gestion d'une exception/erreur potentielle. En cas
d'impossibilité pour se connecter, PDO génère une exception qui est alors traitée dans le bloc "catch".

Connexion PDO à SQLite

1 - <?php
2 - try
3 - {
4 - $dbh = new PDO("sqlite:/data/company.db");
5 - echo "Connexion OK";
6 - }
7 - catch(PDOException $e)
8 - {
9 - echo "Erreur : ".$e->getMessage()."<br />";
10 - echo "N° : ".$e->getCode();
11 - }
12 - ?>

Dans cet exemple le "dsn" détermine le moteur de base de données visé (sqlite) et précise le chemin
d'accès de la base de données de travail (/data/company.db).
Le bloc catch est chargé d'intercepter une éventuelle erreur apparue dans le try. Ici on en profite pour
afficher le message d'erreur ainsi que son code.
page 145

Connexion PDO à Oracle

1 - <?php
2 - $username = "admin";
3 - $password = "xbz22";
4 -
5 - try
6 - {
7 - $dbh = new PDO("OCI:dbname=company", $username, $password);
8 - echo "Connexion OK";
9 - }
10 - catch(PDOException $e)
11 - {
12 - echo $e->getMessage();
13 - }
14 - ?>

Dans cet exemple le "dsn" détermine le moteur de base de données visé (Oracle OCI) et précise le nom de
la base de données de travail (company).

Comme on peut le constater dans les exemples précédents, PDO présente l'avantage d'offrir une interface uniforme d'accés
à une base de données sous PHP.

Activation des extensions PDO

Si vous vous retrouvez avec un environnement de développement qui n'a pas activé les extensions PDO, vous pouvez
remédier au problème de la manière suivante : ouvrez le fichier de configuration 'php.ini' que vous utilisez pour PHP et,
dans la partie où sont listée les extensions, vous enlevez le caractère ';' qui se trouve devant les lignes qui concernent
PDO. Il vous suffit ensuite de sauvegarder le fichier de configuration et de redémarrer votre serveur web.
page 146

Connexions PDO

Instructions - PDO request

PDO fait la distinction entre deux types de requêtes : celles qui permettent de récupérer des informations, et
celles qui permettent d'effectuer des manipulations de données (ajout, suppression ou modification).

Concrètement, si l'on projette de récupérer un ensemble d'enregistrements (par exemple une requête en SELECT pour
obtenir une liste de livres), on aura recours à la méthode 'query' que propose l'extension PDO. Celle-ci exécute une requête
SQL et retourne le jeu de résultats (s'il y en a) en tant qu'objet PDOStatement.

Syntaxe : PDO::query(sqlquery)

Par contre, si l'opération consiste à effectuer des modifications sur la base de données (par exemple des requêtes en
INSERT, UPDATE, ou DELETE), on aura plutôt recours à la méthode 'exec' que propose également l'extension PDO.
Celle-ci exécute une requête SQL et retourne le nombre de lignes affectées par la requête en modification.

Syntaxe : PDO::exec(sqlquery)

Nous allons voir plus en détail le fonctionnement de ces deux méthodes dans les chapitres suivants.
page 147

Connexions PDO

Instructions - PDO->query

Une fois l'objet de la classe PDO obtenu pour se connecter à une base de données, l'exécution du code SQL
peut se faire via la méthode "query". Celle-ci lance l'exécution de la requête sur le moteur de DB et retourne un
jeu de résultats en tant qu'objet PDOStatement.

Syntaxe : PDO::query(sqlquery)

L'objet PDOStatement reçu en valeur de retour pourra à son tour être exploité (en vue par exemple de l'affichage des
résultats dans une page web) via les méthodes 'fetch', 'fetchAll', ou encore 'fetchObject'.

Requête SQL en sélection via PDO

1 - <?php
2 - try
3 - {
4 - $dbh = new PDO("sqlite:/data/company.db");
5 - $sql = "SELECT * FROM clients";
6 - $stmt = $dbh->query($sql);
7 - // Retourne un objet PDOStatement qui pourra être
8 - // exploité via une méthode 'fetch'
9 - }
10 - catch(PDOException $e)
11 - {
12 - echo $e->getMessage();
13 - }
14 - ?>

Le code SQL restant spécifique à chaque moteur de DB, il faudra dans ce cas-ci s'assurer que la requête
SQL est bien supportée par SQLite. Pour cela vous devrez vous référer aux documentations respectives
des moteurs de bases de données (exemple : http://www.sqlite.org/lang.html).
page 148

Connexions PDO

Instructions - PDO->exec

Lorsqu'il s'agit d'apporter des modifications à une base de données (par exemple des requêtes en INSERT,
UPDATE, ou DELETE), l'exécution du code SQL peut se faire via la méthode "exec". Celle-ci lance l'exécution de
la requête sur le moteur de DB et et retourne le nombre de lignes affectées par la requête en modification.

Syntaxe : PDO::query(sqlquery)

Au contraire de la méthode 'query' vue précédemment, 'exec' ne retourne pas d'objet PDOStatement. PDO::exec() fournit
par contre comme valeur de retour le nombre de lignes qui ont été modifiées ou effacées pour la requête SQL qui a été
exécutée. Si aucune ligne n'est affectée, la fonction PDO::exec() retournera 0.

Requête SQL en modification via PDO

1 - <?php
2 - try
3 - {
4 - $dbh = new PDO("sqlite:/data/company.db");
5 - $sql = "DELETE FROM clients WHERE date = '2009'";
6 - $stmt = $dbh->exec($sql);
7 - // Retourne le nombre de lignes impactées par l'opération
8 - }
9 - catch(PDOException $e)
10 - {
11 - echo $e->getMessage();
12 - }
13 - ?>

Le code SQL restant spécifique à chaque moteur de DB, il faudra dans ce cas-ci s'assurer que la requête
SQL est bien supportée par SQLite. Pour cela vous devrez vous référer aux documentations respectives
des moteurs de bases de données (exemple : http://www.sqlite.org/lang.html).
page 149

Connexions PDO

Instructions - PDOStatement->fetch

Une fois la requête SQL exécutée par le moteur de bases de données, il faut passer à l'exploitation des lignes
résultats. C'est ici que la méthode 'fetch' de l'objet PDOStatement entre en action. Celle-ci prend en compte une
ligne résultat et en permet la récupération des différents champs.

Syntaxe : PDOStatement::fetch(type)

Le 'type' passé en argument indique sous quelle forme on veut récupérer le résultat. On utilise pour cela les constantes
suivantes :

- PDO::FETCH_BOTH : (défaut) pour un tableau indexé par les noms de colonnes et aussi par les numéros de
colonnes comme retournés dans le jeu de résultats.
- PDO::FETCH_ASSOC : pour un tableau associatif - indexé par le nom de la colonne comme retourné dans le jeu de
résultats.
- PDO::FETCH_NUM : pour un tableau indexé par les numéros de colonnes comme retournés dans le jeu de résultats.

Requête SQL via PDO

1 - <?php
2 - try
3 - {
4 - $dbh = new PDO("sqlite:/data/company.db");
5 - $sql = "SELECT * FROM clients";
6 - $stmt = $dbh->query($sql);
7 - while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
8 - {
9 - echo $row["name"] . "-" . $row["date"];
10 - }
11 - }
12 - catch(PDOException $e)
13 - {
14 - echo $e->getMessage();
15 - }
16 - ?>

La constante PDO::FETCH_ASSOC permet d'accéder aux valeurs individuelles des champs sur base de
leur nom.
page 150

Connexions PDO

Instructions - PDO->prepare

PDO offre la possibilité de préparer ses requêtes c'est-à-dire qu'il est possible de soumettre (avant exécution)
un modèle de requête au moteur de base de données (mysql, sqlite, postgresql ...). Ce modèle peut faire intervenir
des "placeholders" aux endroits où devront être insérées des valeurs dynamiques. Le SGBD va -sur base de ce
modèle- interpréter et compiler temporairement la logique de la requête qui lui est soumise.

Syntaxe : PDO::prepare(sqlquery)

Ce passage par la préparation de la requête n'est pas obligatoire: nous l'avons vu précédemment il est possible d'exécuter
du SQL en direct via les méthodes "query" et "exec". Mais la méthode "prepare" des avantages non négligeables:
optimisation pour les requêtes qui doivent être exécutées plusieurs fois, prévention des attaques par injection SQL,
clarification du code.

Préparation du modèle de requête

La première étape de cette "préparation" consiste à rédiger le modèle de la requête SQL et d'y placer correctement les
"placeholders" (pour lesquels les valeurs réelles seront substituées lorsque la requête sera exécutée).

Modèle SQL et placeholders

1 - <?php
2 - $sql = "INSERT INTO clients (nom, prenom) VALUES (:nom, :prenom)";
3 - //ou
4 - $sql = "INSERT INTO clients (nom, prenom) VALUES (?, ?)";
5 - ?>

La préparation d'une requête SQL peut se faire avec des paramètres nommés (précédé de ":") ou avec
des marqueurs (signe "?"). Un place holder représente une seule et unique valeur. Ces valeurs leur seront
associées dans l'étape suivante.

Préparation de la requête

1 - <?php
2 - $sql = "INSERT INTO clients (nom, prenom) VALUES (:nom, :prenom)";
3 - $stmt = $dbh->prepare($sql);
4 - ?>

En cas de succès PDO::prepare() retourne un objet PDOStatement. En cas d'échec, elle retourne FALSE.

Exécution de la requête

La méthode "execute" lance l'exécution proprement dite de la reqête sur le moteur de base de données. Les paramètres
étant à ce stade remplacés par leur valeur. Cette méthode retourne TRUE en cas de succès ou FALSE si une erreur
survient.
page 151

Association des valeurs aux placeholders - via un tableau

1 - <?php
2 - $sql = "INSERT INTO clients (nom, prenom) VALUES (:nom, :prenom)";
3 - $stmt = $dbh->prepare($sql);
4 - $stmt->execute(array(
5 - ":nom" => "Picasso",
6 - ":prenom" => "Pablo"
7 - ));
8 - ?>

Les valeurs de paramètres (placeholders) sont passés à la méthode execute() via un tableau.

Association des valeurs aux placeholders - via les 'binds'

1 - <?php
2 - $sql = "INSERT INTO clients (nom, prenom) VALUES (:nom, :prenom)";
3 - $stmt = $dbh->prepare($sql);
4 - $stmt->bindValue("nom", "Picasso");
5 - $stmt->bindValue("prenom", "Pablo");
6 - $stmt->execute();
7 - ?>

La méthode "bindValue" associe le paramètre à une valeur.

Une fois la requête exécutée correctement, il est possible de passer à la suite des opérations en utilisant les méthodes
appropriées comme "fetch", "fetchAll", "rowCount", ou encore la propriété "lastInsertId".
page 152

Gestion de courrier électronique

Introduction - Envoi de courriers à partir de PHP

Il est possible à partir d'un script PHP d'envoyer des courriers électroniques. Pour être exact, ce n'est pas
réellement PHP qui va les envoyer, celui-ci va seulement préparer le courrier et le passer "intelligement" au serveur
de mail qui a été précisé dans son fichier de configuration 'php.ini'.

Cette fonctionnalité est fréquemment utilisée dans le cadre de développements Web, entre autres pour envoyer un mail
de confirmation dans une application de commerce électronique, pour activer des listes de distribution, pour monitorer
certaines applications ...
page 153

Gestion de courrier électronique

Instructions - mail

La fonction mail permet d'envoyer à partir d'un script PHP des messages sous forme de courrier électronique.
Elle est par exemple utilisée pour envoyer un mail de confirmation dans une application de commerce électronique,
pour activer des listes de distribution, pour monitorer certaines applications ...

Si cette fonction est fort sollicitée et souvent primordiale dans de nombreux cas, son rôle reste cependant des plus simples.
Elle se limite en effet à "envelopper" les données d'un message et à passer celle-ci au serveur de mail spécifié dans le
fichier de configuration 'php.ini' (rubrique 'SMTP'). C'est ce dernier qui fera tout le travail.

Syntaxe : mail(to, subject, message, additional_headers)

Paramètres de la fonction 'mail'

to
Chaîne de caractères reprenant l'adresse électronique d'un destinataire.
Si il y a plusieurs destinataires, il suffit d'utiliser la virgule pour séparer les différentes adresses
électroniques.

subject
Chaîne de caractères reprenant le titre du message.

message
Chaîne de caractères reprenant le corps du message.

additional_headers
Paramètre facultatif. Il peut contenir des en-têtes de courrier supplémentaires (From: , Reply-To: ,Cc: ,
Bcc:, etc.).
Le caractère de saut de ligne '\n' doit être utilisé pour séparer les en-têtes supplémentaires.

Utilisation de 'mail'

1 - <?php
2 - mail("john@swing.be", "Essai Mail", "Ceci est un test.\n
3 - Le contenu du message peut contenir plusieurs lignes de texte.\n
4 - A bientôt");
5 - ?>

'mail' retourne TRUE en cas de réussite (c'est-à-dire si le courrier a pu être envoyé), et FALSE dans le cas
contraire.
Pour une utilisation sous un serveur Windows, il faut -dans le fichier php.ini, rubrique [mail functions]-
indiquer le compte smtp auquel php a accès. Le paramètre 'sendmail_from' doit lui préciser une adresse
email d'expéditeur par défaut.
page 154

Utilisation des en-têtes supplémentaires

1 - <?php
2 - $headers ='From: "Louis"<Louis@bxl.be>' . "\n";
3 - $headers .='Reply-To: info@bxl.be' . "\n";
4 - $headers .='Content-Type: text/plain; charset="iso-8859-1"'."\n";
5 - $headers .='Content-Transfer-Encoding: 8bit';
6 -
7 - $message = 'Invitation à la cérémonie ...';
8 -
9 - if(mail('Paul@google.com','Invitation',$message,$headers))
10 - {
11 - //Message envoyé
12 - }
13 - ?>

Les en-têtes supplémentaires seront ajoutés dans le courrier à la fin de la zone d'en-tête. Le message
envoyé aura la structure suivante :
Date: ...
Message-ID: ...
To: Paul@google.com
Subject: Invitation
From: Louis@bxl.be
Reply-To: info@bxl.be
Content-Type: text/plain; charset="iso-8859-1
... corps du message ...

Envoi d'un courrier au format HTML

1 - <?php
2 - $headers ='From: "Louis"<Louis@bxl.be>' . "\n";
3 - $headers .='Reply-To: info@bxl.be' . "\n";
4 - $headers .='Content-Type: text/html; charset="iso-8859-1"'."\n";
5 - $headers .='Content-Transfer-Encoding: 8bit';
6 -
7 - $message = '<html><head><title></title></head>
8 - <body>
9 - <p>Invitation à la cérémonie ...</p>
10 - </body></html>';
11 -
12 - if(mail('Paul@google.com','Invitation',$message,$headers))
13 - {
14 - //Message envoyé
15 - }
16 - ?>
page 155

Envoi d'un courrier au format TXT et HTML

1 - <?php
2 - // Contenu des messages
3 - $message_txt = 'Invitation à la cérémonie ...';
4 - $message_html = '<html><head><title></title></head>
5 - <body>
6 - <p>Invitation à la cérémonie ...</p>
7 - </body></html>';
8 -
9 - // Définition de la frontière" (boundary en anglais)
10 - // séparant les différentes parties du mail
11 - $mime_boundary = md5(time());
12 -
13 - // En-têtes de courrier supplémentaires
14 - $headers ='From: "Louis"<Louis@bxl.be>' . "\n";
15 - $headers .='Reply-To: info@bxl.be' . "\n";
16 - $headers .='MIME-Version: 1.0'."\n";
17 - $headers .='Content-Type: multipart/
alternative; boundary="' . $mime_boundary . '"';
18 -
19 - // Message au format TXT
20 - $message = 'This is a multi-part message in MIME format.'."\n\n";
21 - $message .= '--'.$mime_boundary."\n";
22 - $message .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n";
23 - $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
24 - $message .= $message_texte."\n\n";
25 -
26 - // Message au format HTML
27 - $message .= '--'.$mime_boundary."\n";
28 - $message .= 'Content-Type: text/html; charset="iso-8859-1"'."\n";
29 - $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
30 - $message .= $message_html."\n\n";
31 - $message .= '--'.$mime_boundary.'--'."\n";
32 -
33 - // Envoi du message
34 - if(mail('Paul@google.com','Invitation',$message,$headers))
35 - {
36 - //Message envoyé
37 - }
38 - ?>

La "frontière" (boundary) est utilisée pour séparer les différentes parties d'un courrier. Cette frontière doit
consister en une chaine de caractère assez unique pour ne pas être rencontrée dans le corps du message
principal (ici on utilise l'encryption 'md5' d'un timestamp).
Lorsqu'une frontière ouvre une partie, elle est précédée de deux tirets "--" et se termine par un retour de
ligne '\n'.
Pour fermer une frontière, on la fait précéder et suivre de deux tirets "--".

Certains hébergeurs (gratuits) n'autorisent pas l'envoi d'email via PHP pour éviter les problèmes d'utilisation abusive (envoi
massif de messages non sollicités (spam), mise en danger des ressources du système ...). D'autres hébergeurs proposent
une variante "maison" de la fonction 'mail' qui permet l'envoi de courriers de façon contrôlée.
page 156

Commandes systèmes

Introduction - Exécution de programmes externes

La portée d'un script PHP ne se limite pas obligatoirement aux outils prévus par la langage. Il y a en effet moyen
de prolonger les fonctionnalités de base en utilisant des commandes d'exécution de programmes externes.

Les fonctions 'sytem' et 'passthru' permettent à partir d'un script PHP de lancer l'exécution de commandes externes, d'en
afficher le résultat et de récupérer la main après exécution. Les commandes externes peuvent être de différents types:
Unix shell, DOS, exécutables, java ...

Cette possibilité augmente sérieusement la marge de manoeuvre du développeur en lui permettant de reporter certaines
tâches sur d'autres modules.
page 157

Commandes systèmes

Instructions - system

'system' lance l'exécution d'un programme externe.

Syntaxe : system(command)

Si une variable est fournie comme second argument, alors le code de statut de la commande y sera affecté.

Utilisation de 'system'

1 - <?php
2 - system("xt.exe test.xml style1.xsl");
3 - ?>

Le script ci-dessus exécute le programme xt. Celui-ci associe un fichier xml à une feuille de style xsl.
page 158

Commandes systèmes

Instructions - passthru

'passthru' exécute un programme externe et affiche le résultat.

Syntaxe : passthru(command)

Si une variable est fournie comme second argument, alors le code de statut de la commande y sera affecté.

Utilisation de 'passthru'

1 - <?php
2 - passthru("xt.exe test.xml style1.xsl");
3 - ?>

Le script ci-dessus exécute le programme xt. Celui-ci associe un fichier xml à une feuille de style xsl.
page 159

Gestion des cookies

Introduction - Utilité des cookies

Un cookie consiste en un petit fichier de type texte (+/- 100 octets) envoyé par un serveur Web à un navigateur
Web. Ce fichier contient des indications de configuration (caractéristiques techniques relevées sur l'ordinateur
client) et des données liées aux habitudes de consultation de l'utilisateur. Les données ainsi créées sont
enregistrées sur le client et persistent d'un accès à l'autre au serveur. L'objectif de cette technique est en principe
de fournir un élément d'information permettant d'améliorer la navigation de l'utilisateur.
page 160

Gestion des cookies

Instructions - setcookie

'setcookie' crée et initialise un cookie sur le poste client.

Syntaxe : setcookie(name, value, expire, path, domain, secure)

Paramètres de la fonction 'setcookie'

name
Paramètre obligatoire. Il précise le nom du cookie.
Si c'est le seul paramètre passé à la fonction 'setcookie', le cookie portant le nom spécifié sera supprimé du
navigateur client.

value
Paramètre facultatif. Il donne la valeur du cookie.

expire
Paramètre facultatif. Il indique quand le cookie devra être supprimé.
La valeur précisée doit être au format UNIX (nombre de secondes écoulées depuis le 1er janvier 1970). En
pratique, on utilise la fonction 'time' pour connaître la date courante et on y ajoute un nombre de secondes.

path
Paramètre facultatif. Il indique le répertoire et ses sous-répertoires sur le serveur pour lesquels le cookie
est valide (la valeur par défaut est '/').

domain
Paramètre facultatif. Il indique le domaine pour lequel le cookie est valide. La notation du domaine doit
contenir deux points (ex: .ulb.be).

secure
Paramètre facultatif. Il indique que le cookie doit être transmis au serveur via une connexion HTTPS. La
valeur doit alors être fixée à 1.

Quelques remarques à garder à l'esprit lorsque l'on exploite les cookies :

- Les données enregistrées dans un cookie ne peuvent être lues que par le serveur Web qui est à l'origine du cookie
(les autres serveurs Web n'y auront donc pas accès).
- Les appels à 'setcookie' doivent être réalisés dans le script PHP avant tout autre output vers le client.
- Les données d'un cookie ne seront disponibles que lors d'un prochain appel à un script PHP.
- Un utilisateur peut toujours configurer son navigateur afin qu'il refuse l'enregistrement de cookies sur son ordinateur.
Les cookies ne vous seront alors plus d'aucune utilité.
page 161

Utilisation de 'setcookie'

1 - <?php
2 - setcookie("section","archives",time()+3600);
3 - setcookie("color","#BEC69D");
4 - setcookie("font[family]","arial");
5 - setcookie("font[size]","+1");
6 - echo "Bienvenue sur notre section Archives ...";
7 - ?>

On peut définir le nom des cookies en exploitant la notation des tableaux (array). Nous l'avons fait dans
l'exemple précédent avec 'font[family]' et 'font[size]'. Cela ne change en rien le nombre de cookies créés
sur le poste client (autant qu'il y a d'éléments dans le tableau). C'est dans les scripts qui font référence aux
cookies que les choses sont différentes : les valeurs des cookies sont placées dans un tableau (permettant
ainsi de les exploiter dans des boucles).
page 162

Gestion des cookies

Instructions - read cookie

PHP rend disponibles dans un script les informations des cookies de la même façon qu'il le fait avec les
variables externes (données venant d'un formulaire HTML ou d'une URL). Il les place dans des variables globales.
Ainsi, il suffit pour récupérer un cookie de l'appeler -sous forme de variable- par le nom qui lui a été associé lors
de sa création (si le cookie portait le nom 'section' il faudra y faire référence via la variable '$section').

Il est également possible pour récupérer un cookie d'utiliser le tableau associatif global '$HTTP_COOKIE_VARS' (si le
cookie portait le nom 'section' il faudra y faire référence via l'élément '$HTTP_COOKIE_VARS[section]').

Lecture de cookies

1 - <?php
2 - echo "<html><body bgcolor=\"$color\">";
3 - // $color fait référence à un cookie précédemment installé
4 -
5 - echo "<font face=\"$font[family]\" size=\"$font[size]\">";
6 - // $font[family] et $font[size] font référence à
7 - // des cookies précédemment installés
8 -
9 - echo "Dernière section consultée : $section";
10 - // $section fait référence à un cookie précédemment installé
11 -
12 - echo "</font>";
13 - echo "</body></html>";
14 - ?>
page 163

Gestion de sessions

Introduction - Applications Web et sessions

Les sessions permettent de sauvegarder des informations entre deux accès au serveur. Ansi vous pouvez dans
une application conserver une trace du passage d'un utilisateur et cela vous évite de poser les mêmes questions
à chaque connexion. Les sessions sont fort sollicitées être autres dans les applications d'achat en-ligne et dans
les intranet.

En PHP, chaque visiteur qui accède à une application mettant en oeuvre les sessions se voit assigner un numéro
d'identifiant (l'identifiant de session). Celui-ci peut être enregistré soit dans un cookie soit dans l'URL. Ce système rend
possible l'enregistrement de variables afin de les préserver et de les réutiliser tout au long de l'utilisation de l'application.
page 164

Gestion de sessions

Instructions - session_start

La fonction 'session_start' vérifie si une session à déjà été ouverte - sinon elle en crée une. 'session_start' doit
être appelée au début de chaque script exploitant les sessions.

Syntaxe : session _start()

Cette fonction initialise également les données de session. Si la session existe déjà (elle est alors connue par son
identifiant), 'session_start' instancie toutes les variables qui lui sont liées.

Utilisation de 'session_start'

1 - <?php
2 - session_start();
3 - ...
4 - ?>

L'appel à cette fonction doit se faire de préférence avant tout autre output (c'est indispensable si l'on utilise
les sessions basées sur les cookies).

Remarque : si l'on veut exploiter la technique des sessions sur une machine tournant un operating system de type Windows,
il faut préciser dans le fichier php.ini un répertoire valide pour le paramètre 'session.save_path' (par exemple : C:\WINNT
\TEMP).
page 165

Gestion de sessions

Instructions - session_destroy

'session_destroy' détruit toutes les données associées à une session.

Syntaxe : session _destroy()

Utilisation de 'session_destroy'

1 - <?php
2 - session_start();
3 - ...
4 - session_destroy();
5 - ?>

Avant d'utiliser 'session_dstroy' il faut appeler la fonction 'session_start'.


page 166

Gestion de sessions

Instructions - session_register

'session_register' enregistre une variable dans la session courante.

Syntaxe : session_register(varname)

Déclaration et enregistrement des variables de session

Utilisation de 'session_register'

1 - <?php
2 - session_start();
3 - session_register('auteur_id');
4 - session_register('login');
5 - $auteur_id = "4567";
6 - $login = "admin";
7 - ?>

Le script ci-dessus initialise une session, et enregistre dans la session courante deux variables. Ensuite ces
variables sont assignées.

Une autre manière de faire consiste à enregistrer les variables de session via le tableau prédéfini $HTTP_SESSION_VARS
(ou sa version courte $_SESSION).

Utilisation de '$HTTP_SESSION_VARS'

1 - <?php
2 - session_start();
3 - $HTTP_SESSION_VARS["auteur_id"] = "4567";
4 - $HTTP_SESSION_VARS["login"] = "admin";
5 - ?>

Dans ce cas, les valeurs sont directement assignées et indicées dans le tableau $HTTP_SESSION_VARS
(ou $_SESSION).

Utilisation et récupération des variables de session

Les valeurs de session sont toujours contenues dans le tableau $HTTP_SESSION_VARS et ce quelle que soit la méthode
de déclaration utilisée. Pour les exploiter, il suffit donc de questionner ce tableau.
page 167

Utilisation des valeurs de session

1 - <?php
2 - session_start();
3 - ...
4 - // sollicitation du tableau associatif $HTTP_SESSION_VARS
5 - if (isset($HTTP_SESSION_VARS["login"]))
6 - {...}
7 -
8 - // alternative : tableau associatif $_SESSION
9 - if (isset($_SESSION["login"]))
10 - {...}
11 -
12 - // sollicitation des variables globales
13 - // si dans le fichier de configuration de PHP
14 - // l'option 'register_globals' est activée,
15 - // alors les valeurs de session peuvent être
16 - // récupérées via des variables globales
17 - if (isset($login)
18 - {...}
19 - ?>

Le script ci-dessus teste si la variable de session login a été assignée.


page 168

Gestion de sessions

Instructions - session_id

La gestion de sessions consiste à enregistrer des informations concernant l'utilisateur et de les relier à chaque
requête grâce à un identifiant (présent dans la requête, sur le serveur ou dans un cookie). Dans ce contexte,
'session_id' renvoie l'identifiant de la session courante.

Syntaxe : session_id()

Utilisation de 'session_id'

1 - <?php
2 - $sid=session_id();
3 - ...
4 - ?>

On stocke dans la variable $sid l'identifiant de session.


page 169

Gestion de sessions

Instructions - PHPSESSID

L'identifiant de session est transmis du serveur au client tout au long de la session. C'est l'élément de référence
indispensable qui donne accès aux autres informations de la session. Le nom par défaut de cet identifiant est
PHPSESSID.

La technique des cookies, sur laquelle s'appuie en partie PHP pour assurer la cohérence d'une gestion de session
constitue certainement une façon transparente de faire transiter l'identifiant de session. Elle n'est cependant pas fiable à
100% : l'utilisateur peut refuser ou effacer les cookies, le navigateur peut ne pas les supporter correctement. Une méthode
alternative est nécessaire.

Hors cookies, l'échange de l'identification peut encore se faire de différentes manières : en ajoutant à l'URL des variables
d'identification (URL?PHPSESSID=...) ou via un champ de formulaire caché (input type="hidden").

L'exemple suivant montre comment enregistrer des variables, et comment relier correctement des pages avec le SID.

Gestion de sessions

1 - <?php
2 - ***********************
3 - // enregistrement des variables de session
4 -
5 - session_start();
6 - session_register('auteur_id');
7 - session_register('login');
8 - $auteur_id = $myrow[id];
9 - $login = $myrow[login];
10 -
11 -
12 - ***********************
13 - // liaison via un formulaire
14 -
15 - $sid=session_id();
16 - <form method=\"post\" action=\"agenda.php\">
17 - <input type=\"hidden\" name=\"PHPSESSID\" value=\"$sid\">
18 - ...
19 -
20 - ***********************
21 - // liaison via une URL
22 -
23 - <a href=\"agenda.php?" . SID . "\"> ... </a>
24 -
25 - ?>

Le script ci-dessus initialise une session, et enregistre dans la session courante deux variables. Ensuite ces
variables sont assignées.
page 170

Conseils pratiques

Circum Net, 2017


page 171

Sécurité

Tester les variables clients

Il est important de garder à l'esprit lors du développement d'une application avec le langage PHP (ou avec
tout autre langage d'ailleurs) que les informations fournies par le client ne peuvent être acceptées sans avoir pris
certaines précautions. C'est en effet très souvent par ce biais que des scripts sont détournés ou donnent lieu à
des comportements inattendus ou inappropriés.

'register_globals' à OFF

Depuis la version 4.2, le paramètre de configuration de PHP 'register_globals' est passé en valeur par défaut de 'ON' à
'OFF'. Ceci pour des raisons de sécurité. En effet, à 'ON' ce paramètre, qui contrôle entre autres la mise à disposition des
variables qui sont passées au script par un utilisateur, peut être à la source de pas mal de confusion.

Concrètement, à 'ON' ce paramètre enclenche, lors de l'appel à un script, l'enregistrement des variables d'environnement,
GET, POST, Cookie et Serveur, en tant que variables globales. L'appel suivant :
http://www.monsite.com/moscript.php?id=16 aura donc, dans ce contexte, pour effet de mettre à disposition dans le script
appelé la variable '$id' contenant la valeur '16'. Or cette "facilité", si l'on n'a pas pris la peine dans son code de filterer les
données entrantes, permet le détournement de variables. Elle est par conséquence potentiellement "dangereuse".

register_globals et le détournement de variables

1 - if (check_identity())
2 - {
3 - $access = true;
4 - }
5 -
6 - ....
7 -
8 - if ($access)
9 - {
10 - ...
11 - }

Dans cet exemple, un paramètre envoyé par url ou par formulaire, pour autant qu'il porte le nom 'access',
peut rendre le premier test inutile en faisant en sorte que la variable $access soit toujours évaluée à 'true'.

Il est dès lors vivement conseillé de laisser la paramètre 'register_globals' sur 'OFF' et de passer, pour la récupération des
variables externes, par les tableaux prédéfinis $_GET et $_POST, suivant l'action dans le code HTML.

Requêtes SQL sur une base de données

Avant de lancer une commande SQL sur une base de données via PHP (SELECT, INSERT INTO ...), il est toujours
préférable de s'assurer qu'aucune information indésirable n'est envoyée par le client. On peut ainsi tester les valeurs vides,
supprimer les caractères de nouvelles lignes, filtrer les balises html, vérifier les formats de dates ... Pour réaliser ces tests,
PHP offre différents outils de manipulation de chaînes de caractères. En voici les principaux :

- mysql_real_escape_string : protège les caractères spéciaux d'une commande SQL


- strip_tags : filtrage des tags
page 172

- substr_replace : remplacement de chaînes de caractères


- ereg_replace : remplacement de chaînes de caractères (expressions régulières)
- trim : suppression des espaces en début et fin de chaîne
- strtolower : passage en minuscules
- strtoupper : passage en majuscules

'Include' de fichiers sur base de variables clients

Si l'on désire effectuer des inclusions (include, require, include_once, require_once) sur base de variables clients (par
exemple récupérées d'un formulaire ou d'une url) il est indispensable d'en vérifier la validité et la conformité au préalable.
Cela évitera que vos scripts soit détourneés par des utilisateurs malintentionnés. En effet, sans vérification, ce type d'input
peut déboucher sur l'affichage de fichiers "non public" ou sur l'exécution de scripts situés sur des serveurs distants.

Problèmes liés aux variables clients"

Imaginons un script PHP contenant l'instruction 'include' suivante :

include($_GET['page']);

Les deux principales dérives possibles sont :

1) La prise en compte et l'affichage de fichiers situés en dehors de l'arborescence Web.


L'appel url ci-dessous risque de donner lieu à l'affichage d'un fichier contenant des passwords et considéré comme privé.

http://my_site.com/my_script.php?page=/etc/passwd

2) L'exécution de scripts situés sur des serveurs distants.


Cette fois-ci notre script peut servir de véhicule à un script étranger. Dans l'exemple suivant, toutes les instructions
présentes dans le script 'trojan.php' seront exécutées par le script 'my_script.php' (suppression de données, récupération
de données, déterioration de DB, envoi de mails ...).

http://my_site.com/my_script.php?page=http://another_site.com/trojan.php

Solution

Le comportement à adopter face à ce type de problèmes est très simple. Il suffit de tester le paramètre qui va servir de
base à l'inclusion et de n'autoriser que les valeurs prévues.

Tester les variables clients

1 - $okpages = array('value1', 'value2', 'value3');


2 - if( in_array($page, $okpages) )
3 - {
4 - include($page);
5 - }

Dans ce cas, un liste d'autorité (ici un array) est consultée avant que l'instruction puisse être exécutée.
page 173

Programmation

Déboguer un script

Commenter et faire parler vos scripts

Comme nous l'avons déjà vu, on ne saurait trop insister sur le fait qu'inclure des commentaires dans un
programme ne peut être que bénéfique. On l'appréciera d'ailleurs assez rapidement: une bonne documentation
facilite grandement le développement, la correction, la mise à jour et le partage des scripts.

Mais si les commentaires sont fort utilisés pour annoter un programme php, ils sont également particulièrement sollicités
lorsque l'on doit déboguer un script. Les commentaires permettent en effet de mettre entre parenthèses (en d'autres termes
de désactiver) une partie du code afin d'identifier plus facilement où se situe le problème.

Ajoutons à cela que pour suivre encore de plus près ce que fait un script et pour comprendre ou identifier clairement les
sources d'erreurs éventuelles, il est utile de parsemer son code d'output de test ou de vérification à l'aide -par exemple-
de la fonction 'print_r'. print_r($variable_du_script); Cette fonction affiche la valeur des variables et s'il s'agit d'un tableau
le détail de ses clés/valeurs. On obtient ainsi de façon contextuelle la composition des variables utilisées dans le script. Il
est alors aisé de vérifier si ces variables ont bien été affectées et si la logique du script est respectée et valide.

Mettre au point un fonction de déboguage

Si l'insertion d'instructions d'output dans le code peut faciliter le déboguage, elle peut également, si l'on y prend pas garde,
déboucher sur une pollution du code. En effet, ces instructions ne font pas partie de l'affichage "normal" du script et elles
doivent être effacées ou mises en commentaires avant de passer à la phase de production.

Le recours à une fonction adéquate peut éviter ces difficultés.

Définition d'une fonction de déboguage

1 - $debugmode = true;
2 - function debug($var)
3 - {
4 - global $debug;
5 - if ($debugmode) print_r($var);
6 - }
7 -
8 - ...
9 - ...
10 - ...
11 -
12 - debug($unevariable);
13 -
14 - ...
15 - ...
16 - ...
17 -
18 - debug($uneautrevariable);

La fonction 'debug' prend une variable en paramètre. Elle teste si la variable '$debugmode' est à 'true'. Si
c'est la cas elle lance l'instruction d'affichage 'print_r' pour la variable reçue en paramètre.
Si on ne désire plus voir apparaître les affichages de déboguage il suffit de fixer '$debugmode' à 'false'.
page 174

Adaptation de la fonction pour un affichage HTML

1 - $debugmode = true;
2 - function html_print_r($var)
3 - {
4 - echo "<pre>";
5 - echo str_replace("\n", "<br/>", print_r($var)).
6 - echo "</pre>";
7 - }
8 -
9 - function debug($var)
10 - {
11 - global $debug;
12 - if ($debugmode) html_print_r($var);
13 - }
14 - ...
15 - ...
16 - ...
17 -
18 - debug($unevariable);
19 -
20 - ...
21 - ...
22 - ...
23 -
24 - debug($uneautrevariable);

Pour que les informations fournies par 'print_r' soient directement visibles dans le navigateur Web, il faut
légèrement adapter notre fonction de façon à ce que les retours de ligne soient traduits en code html "<br/
>". Ceci peut être très facilement réalisé en faisant intervenir l'instruction de remplacement de chaînes
"str_replace".

Récupérer le résultat de print_r() dans une variable

Depuis la version 4.3 de PHP, le flux de retour obtenu par la fonction print_r() peut être stocké dans une variable. Pour
cela, il suffit de fixer à 'true' le deuxième argument optionnel de 'print_r'.

$var = print_r($variable_du_script, true);

Résultat de print_r() dans une variable

1 - ...
2 -
3 - // Affichage
4 - print_r($var);
5 -
6 - // Enregistrement dans une variable
7 - $result = print_r($var, true);
8 -
9 - ...

On peut avoir recours à cet enregistrement pour, par exemple, parcourir et analyser les données récupérées en vue de
les 'logger' ou de les mettre en forme.

Lister toutes les variables définies dans un script

La fonction prédéfinie 'get_defined_vars' retourne un tableau multidimensionnel contenant la liste de toutes les variables
qui ont été définies et qui lui sont accessibles en fonction des sa portée d'appel. Il peut s'agir de variables d'environnement,
de serveur ou définies par l'utilisateur.
page 175

get_defined_vars()

get_defined_vars() et print_r()

1 - ...
2 -
3 - // Affichage
4 - print_r(get_defined_vars());
5 -
6 - // Enregistrement dans une variable
7 - $result = print_r(get_defined_vars(), true);
8 -
9 - ...
page 176

Programmation

Erreurs de syntaxe

Les erreurs de syntaxe sont les erreurs que le programmeur PHP doit s'attendre à rencontrer le plus souvent.
Causées par l'inexpérience ou la distraction, elles sont largement excusables, mais par contre il faut apprendre
à rapidement pouvoir les repérer et les corriger.

Parse error, unexpected T_STRING, expecting ',' or ';'

"Parse error, unexpected T_STRING (OR T_VARIABLE), expecting ',' or ';'" est certainement le message d'erreur que l'on
rencontre inévitablement dès que l'on se lance dans la programmation PHP. Il faut donc s'y habituer et surtout le décoder.

L'interpréteur PHP manifeste, via ce message, le fait qu'il ne peut identifier clairement le départ et la fin d'une chaîne de
caractères ou d'une instruction. Voici les principales erreurs à l'origine de ce message :

- absence des guillemets de fermeture d'une chaîne de caractères


- présence de guillemets doubles non échappés dans une chaîne délimitée par ce même type de guillemets
- présence de guillemets simples non échappés dans une chaîne délimitée par ce même type de guillemets
- absence de point-virgule (;) à la fin d'une instruction

Erreurs de syntaxe

1 - <?php
2 - // incorrect : le guillement simple n'est pas protégé
3 - echo 'on annonce que l'orage est proche';
4 -
5 - // correct
6 - echo 'on annonce que l\'orage est proche';
7 -
8 - // incorrect : les guillements doubles ne sont pas protégés
9 - echo "L'histoire du "grand Bob"";
10 -
11 - // correct
12 - echo "L'histoire du \"grand Bob\"";
13 -
14 - // incorrect : l'instruction ne se termine pas par ';'
15 - echo "Les temps sauvages"
16 -
17 - // correct
18 - echo "Les temps sauvages";
19 -
20 - // incorrect : la chaînes n'est pas correctement délimitée
21 - echo "La steppe rouge;
22 -
23 - // correct
24 - echo "La steppe rouge";
25 - ?>
page 177

Base de données

Paramètres de connexion

Quand il s'agit de se connecter à une base de données via PHP, il est tentant -lorsque l'on débute- d'aller au
plus court et de directement fournir les paramètres d'accès à l'instruction de connexion.

Voyons cela dans l'exemple ci-dessous :

Connexion à une base de données


1 - <?php
2 - $mysql = mysql_connect('localhost', 'admin', 'zor22x?');
3 - mysql_select_db('books') or die("cannot select DB");
4 - ...
5 - ?>

On est ici devant le cas très courant du passage des paramètres de connexion à la db en clair directement
dans le script d'appel.

Ce n'est cependant pas une bonne façon de procéder et elle ne fera que ralentir votre développement par la suite (répétition
inutile, manque de flexibilité et de sécurité).

Une autre approche est à privilégier. Voyons une première amélioration à travers le stockage des paramètres d'accès
dans des variables.

Utilisation de variables
1 - <?php
2 - $db_host = 'localhost';
3 - $db_user = 'admin';
4 - $db_password = 'zor22x?';
5 - $db_database = 'books';
6 -
7 - $mysql = mysql_connect($db_host, $db_user, $db_password);
8 - mysql_select_db($db_database);
9 - ...
10 - ?>

Stockage des paramètres d'accès dans des variables

Cette légère modification a déjà le mérite de rendre le code plus clair et de nous mettre sur la voie de la modularité.
Mais, puisque les paramètres d'accès ne sont pas destinés à changer autant prolonger l'adaptation et les placer dans
des constantes:

Utilisation de constantes
1 - <?php
2 - define('DB_HOST', 'localhost');
3 - define('DB_USER', 'admin');
4 - define('DB_PASSWORD', 'zor22x?');
5 - define('DB_DATABASE', 'books');
6 -
7 - $mysql = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
8 - mysql_select_db(DB_DATABASE);
9 - ...
10 - ?>

Stockage des paramètres d'accès dans des constantes


page 178

Il est encore possible d'aménager le script de façon à ne pas devoir modifier les paramètres chaque fois que vous transférez
vos données sur le serveur de production. Il suffit pour cela d'intégrer un test qui déterminera le cadre d'exécution :

Prise en compte du contexte d'exécution

1 - <?php
2 - define('CONTEXT', 'production');
3 -
4 - if(CONTEXT == 'production')
5 - {
6 - define('DB_HOST', 'localhost');
7 - define('DB_USER', 'admin');
8 - define('DB_PASSWORD', 'zor22x?');
9 - define('DB_DATABASE', 'books');
10 - }
11 - else
12 - {
13 - define('DB_HOST', 'dev.net');
14 - define('DB_USER', 'dev');
15 - define('DB_PASSWORD', '45ZZ5*');
16 - define('DB_DATABASE', 'books');
17 - }
18 -
19 - $mysql = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
20 - mysql_select_db(DB_DATABASE);
21 - ...
22 - ?>

Il est également possible de déterminer dynamiquement le contexte en testant le serveur sur lequel le sctipt
est exécuté (voir $_SERVER).

Enfin, une fois finalisée cette procédure peut être récupérée par tous les scripts qui en ont besoin à l'aide d'une simple
instruction 'include'.
page 179

Web

Nécessité d'échapper des caractères

Lorsque l'on désire envoyer des chaînes de caractères à un navigateur Web, on est rapidement confronté à
la difficulté d'afficher également des simples et doubles guillemets HTML - or ceux-ci entrent en conflit avec les
guillemets utilisé par PHP pour délimiter les chaînes de caractères :

Conflit entre guillemets HTML et PHP

1 - <?php
2 - echo "L'histoire du "grand Bob"";
3 -
4 - echo 'On l'appelait 'Le grand blond'';
5 - ?>

Ces deux instructions vont produire des messages d'erreur. En effet, étant donné qu'il n'y a aucune
distinction entre les guillemets qui relèvent du langage PHP et ceux qui relèvent de l'HTML, l'interpréteur de
code PHP ne pourra que bloquer sur cette ambiguité.

Pour éviter cette difficulté, on peut échapper les caractères problématiques en les faisant précéder du signe backslash:

Echappement de caractères avec un backslash

1 - <?php
2 -
3 - // Affichage dont les guillements ont été "protégés"
4 - echo "L'histoire du \"grand Bob\"";
5 - echo 'On l\'appelait \'Le grand blond\'';
6 -
7 - // Affichage du code HTML permettant l'insertion d'une image
8 - echo "<img src=\"images/fleur.gif\">";
9 -
10 - // Affichage du code HTML permettant l'insertion d'un lien
11 - echo "<a href=\"index.html\">Visitez notre site ...</a>";
12 -
13 - ?>

Un guillemet échappé sera simplement affiché comme un caractère normal.


page 180

Web

Filtrer les données utilisateur

A travers la fonction prédéfinie "filter_var" PHP offre le possibilité de valider aisément les données saisies
par un utilisateur. Celle-ci permet de vérifier si les données reçues correspondent bien à un type ou une forme
attendus (entier, réel, booléens, courriel, adresse web...).

Pour l'utiliser il faut lui fournir deux arguments: la variable à valider et le type de filtre à appliquer.

Filtrer les données utilisateur

1 - <?php
2 -
3 - $var = 755;
4 - $res = filter_var($var, FILTER_VALIDATE_INT);
5 - var_dump($res);
6 - // affiche: int(755)
7 -
8 - $var = 'abc';
9 - $res = filter_var($var, FILTER_VALIDATE_BOOLEAN);
10 - var_dump($res);
11 - // affiche: bool(false)
12 -
13 - $var = 'abc';
14 - $res = filter_var($var, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
15 - var_dump($res);
16 - // affiche: NULL
17 -
18 - $var = 'sd@sky.net';
19 - $res = filter_var($var, FILTER_VALIDATE_EMAIL);
20 - var_dump($res);
21 - // affiche: string(10) "sd@sky.net"
22 -
23 - var_dump(filter_var('http:/example.com', FILTER_VALIDATE_URL));
24 - // affiche: bool(false)
25 -
26 - ?>

Il suffit de l'utiliser dans une condition pour mettre en place les données venant d'un formulaire web par exemple.

Filtrer les données utilisateur

1 - <?php
2 - if(filter_var($_POST['courriel'], FILTER_VALIDATE_EMAIL) !== false)
3 - {
4 - // si la valeur du champ courriel correspond bien à un email...
5 - }
6 - ?>
page 181

Web

Redirection : Headers already sent by

Lorsque l'on utilise une instruction PHP qui manipule les en-têtes HTTP (par exemple via la fonction 'header'
permettant d'enclencher une redirection), il faut s'assurer des les appeler avant d'avoir généré le moindre flux de
sortie vers le client.

En effet, dès qu'un début de contenu est envoyé via le serveur Web (soit via des instructions HTML classiques, soit via des
instructions PHP d'output comme echo et print) cela implique que les en-têtes HTTP ont déjà été précisés et communiqués
au client. Or, il n'est plus possible de remanier les en-têtes HTTP une fois qu'ils sont envoyés. En conséquence, si -après
avoir produit du code HTML ou lancé des instructions 'echo'- on utilise dans un script la fonction 'header' pour rediriger un
appel de page, le moteur PHP génère automatiquement un message d'erreur 'Headers already sent by ...'.

Il y a toutefois un moyen d'éviter cette difficulté : en utilisant la bufferisation de sortie - c'est-à-dire la mise en mémoire
temporaire des données de sortie. On utilisera pour cela les fonctions prédéfinies 'ob_start' et 'ob_end_flush'.

ob_start()

ob_start() démarre la bufferisation de sortie. Tant qu'elle est enclenchée, les données -hormis les en-têtes- ne sont pas
envoyées au navigateur, mais temporairement placées dans un buffer.

ob_end_flush()

ob_end_flush() envoie vers le client le contenu du buffer de sortie (s'il existe) et désactive la bufferisation.

Utilisation d'un buffer d'output

1 - <?php
2 - // Démarrage de la bufferisation de sortie
3 - ob_start();
4 -
5 - echo "Cet output est issu d'un buffer de sortie.";
6 -
7 - // Envoi vers le client du contenu du buffer
8 - ob_end_flush();
9 - ?>

Note : ob_gzhandler() est une fonction qui -combinée à 'ob_start()'- permet l'envoi de données compressées aux
navigateurs qui supportent les pages compressées. Elle détermine le type d'encodage accepté par un navigateur, et
retourne le contenu le plus adéquat. Ce procédé réduit considérablement le poids des pages à délivrer.

Pages compressées

Pour compresser les pages à la volée : il suffit de placer en tête de fichier la ligne suivante :

1 - <?php ob_start('ob_gzhandler'); ?>


2 - ... suite du code ou de l'output ...
page 182

Etude de cas

Circum Net, 2017


page 183

Annuaire

Annuaire électronique

Il s'agit de mettre au point un script court et basique qui permette de retrouver dans un fichier texte de référence
les coordonnées d'une personne sur base d'un critère récupéré à partir un formulaire HTML. Ce cas est fourni à
titre d'exemple et le code est volontairement simplifié. C'est une piste à explorer que vous ne devez pas hésiter
à améliorer!

Dans le fichier texte de référence sont enregistrés le prénom, le nom, le service, le numéro de téléphone et l'adresse
électronique de différentes personnes. Chaque personne est décrite sur une nouvelle ligne. Celle-ci a le format suivant :

nom;prenom;service;tel;email\n

Fichier de référence 'annuaire.txt'

1 - Olivier;Darnoult;Relations publiques;2410;odarnoult@soc.com
2 - Lidia;Desy;Relations publiques;2412;ldesy@soc.com
3 - Sylvie;Gardin;Comptabilité;3649;sgardin@soc.com
4 - Marc;Lesage;Sécurité;1000;securit@soc.com
5 - Louis;Laleux;Formation;2656;llaleux@soc.com

Le caractère ';' est utilisé afin de séparer les différents champs d'information.

Le critère de recherche de l'utilisateur est récupéré via un formulaire HTML. Celui-ci présente un champ de saisie pouvant
porter sur le nom, le prénom, le service et le numéro de téléphone d'une personne. Le code HTML correspondant est le
suivant :

<input type="text" size="20" name="critere"/>

Formulaire de recherche 'annuaire.html'

1 - <html>
2 - <head>
3 - <title>Annuaire</title>
4 - </head>
5 - <body>
6 - <p><b>Recherche dans l'annuaire</b></p>
7 - <form action="annuaire.php" method="get"><br/>
8 - Critère :
9 - <input type="text" size="20" name="critere"/>
10 - <br/>
11 - <br/>
12 - <input type="submit" value="Rechercher">
13 - </form>
14 - </body>
15 - </html>

Le script php qui recevra les données se nomme 'annuaire.php'. Les infos seront envoyées selon la
méthode 'get'.

Le script PHP doit récupérer le critère de recherche (et vérifier s'il n'est pas vide). Il doit ouvrir, lire et décoder le fichier
texte de référence 'annuaire.txt' (c'est-à-dire en dissocier les champs d'information). Une fois que c'est fait, il peut passer
à la recherche proprement dite: comparaison du critère de recherche avec les données récupérées du fichier texte.
page 184

- Pour récupérer le critère de recherche, il suffit de récupérer dans le tableau GET l'élément correspondant au champ
de saisie HTML (en l'occurrence $_GET['critere']).
- Pour lire le fichier texte et stocker ses lignes dans un tableau (array), on utilise la fonction 'file'.
- Pour passer en revue tous les éléments du tableau précédemment constitué, on utilise une boucle 'foreach'.
- Pour fractionner en ses différentes composantes (prénom,nom,service ...) chaque élément du tableau, on utilise
-à l'intérieur de la boucle 'foreach'- la fonction 'explode'. Celle-ci scinde une chaîne de caractères sur base d'un
délimiteur (en l'occurrence ';').
- Pour comparer le critère de recherche aux données récupérées du fichier de référence, on a recours à la fonction
'stristr' qui recherche un sous-chaîne dans une chaîne de caractères de façon insensible à la casse.

Script PHP 'annuaire.php'

1 - <?php
2 - if (!empty($_GET["critere"]))
3 - {
4 - $resultat = "";
5 - $lignes = file("annuaire.txt");
6 - foreach($lignes as $ligne)
7 - {
8 - list($prenom,$nom,$service,$tel,$email)=explode(';', $ligne);
9 - if (stristr($ligne, $_GET["critere"]))
10 - {
11 - $resultat .= "<p>";
12 - $resultat .= "<b>$nom</b><br/>";
13 - $resultat .= "$prenom<br/>";
14 - $resultat .= "$service<br/>";
15 - $resultat .= "$tel<br/>";
16 - $resultat .= "$email</p>";
17 - }
18 - }
19 - echo (($resultat != "")?$resultat:"<p>Aucun enregistrement trouvé.</p>");
20 - }
21 - else
22 - {
23 - echo "<p>Vous devez préciser un critère !</p>";
24 - }
25 - ?>

Les structures conditionnelles 'if' sont là pour tester le critère de recherche et renvoyer à l'utilisateur les
messages adéquats.

- Le test !empty($_GET["critere"]) vérifie la présence du critère de recherche.


- A la ligne 19 du script on utilise l'opérateur ternaire en tant que syntaxe réduite permettant de traduire une affectation
conditionnelle. Dans cette structure, le caractère "?" teste si la condition qui le précède est vrai ou fausse. Si elle est
vérifiée, l'interpréteur retourne la valeur précisée directement après le caractère "?"; si elle est fausse, l'interpréteur
retourne ce qui suit le caractère ":".
page 185

Annuaire
Annuaire d'adresses Web

Ce script va retrouver des adresses Web sur base de leur description (c'est-à-dire l'url, le titre et les mots-clés
associés) enregistrée dans un fichier texte délimité. Ce cas est fourni à titre d'exemple et le code est volontairement
simplifié. C'est une piste à explorer que vous ne devez pas hésiter à améliorer!

L'utilisateur doit saisir un critère dans un formulaire HTML. La recherche se fait ici d'abord sur le titre de l'adresse (c'est
un parti pris, nous avons décidé de donner la priorité au titre). Dans le cas d'un résultat positif, on présente le titre, l'url
et les mots-clés associés de l'adresse concernée.

Si aucune occurence n'est trouvée pour cette première étape, la recherche porte alors sur la liste des mots-clés associés.
Dans le cas d'un résultat positif, on présente le titre et l'url de l'adresse concernée ainsi que les mots-clés "pertinents" (ceux
qui contiennent le critère recherché) en gras; les autres mots-clés associés (ceux qui ne contiennent pas le critère
recherché) sont présentés sans mise en évidence particulière. Ceci permet à l'utilisateur de mieux apprécier la réponse
qui lui est fournie.

Résultat de la recherche - exemples


- Dans le cas d'une réponse sur base du titre:
Résultat obtenu sur base du titre.
titre : ULB
mots-clés associés: université,enseignements,études
url : www.ulb.ac.be

- Dans le cas d'une réponse sur base des mots-clés:


Résultat obtenu sur base des mots-clés.
titre : Linux Org Association
mot(s)-clé(s) pertinent(s): unix
mots-clés associés: os open source
url : www.linux.org

Dans le fichier texte de référence sont enregistrés les adresses url, les titres et les mots-clés de différentes pages Web.
Chaque page est décrite sur une nouvelle ligne. Les adresses url, les titres et les mots-clés sont séparés par des barres
verticales '|'. Les mots-clés sont séparés par des virgules.
La ligne de description a le format suivant :

url|titre|mot-clé,mot-clé,mot-clé,...\n

Fichier de référence 'webindex.txt'


1 - www.google.com|Google|search,index,bot
2 - www.ulb.ac.be|ULB|université,enseignements,études
3 - www.ucl.ac.be|UCL|université,enseignements,études
4 - www.linux.org|Linux Org Association|unix,os,open source

Dans ce fichier deux types de séparateurs sont utilisés:


les '|' pour séparer les champs de plus haut niveau,
les ',' pour séparer les champs secondaires.
page 186

Le critère de recherche de l'utilisateur est récupéré via un formulaire HTML. Celui-ci présente un champ de saisie pouvant
porter sur l'url, le titre et les mots-clés d'une page Web. Le code HTML correspondant est le suivant :

<input type="text" size="20" name="critere"/>

Formulaire de recherche 'webindex.html'

1 - <html>
2 - <head>
3 - <title>Annuaire d'adresses Web</title>
4 - </head>
5 - <body>
6 - <p><b>Recherche dans l'index Web</b></p>
7 - <form action="webindex.php" method="get"><br/>
8 - Critère :
9 - <input type="text" size="20" name="critere"/>
10 - <br/>
11 - <br/>
12 - <input type="submit" value="Rechercher">
13 - </form>
14 - </body>
15 - </html>

Le script php qui recevra les données se nomme 'webindex.php'. Les infos seront envoyées selon la
méthode 'get'.

Le script PHP doit récupérer le critère de recherche (et vérifier si il n'est pas vide). Il doit ouvrir, lire et décoder le fichier
texte de référence 'webindex.txt' (c'est-à-dire en dissocier les champs d'information). Une fois que c'est fait, il peut passer
à la recherche proprement dite : comparaison du critère de recherche avec les données récupérées du fichier texte. Dans
un premier temps, il verifie si le critère de recherche peut être trouvé dans le titre. Si ce n'est pas le cas, il passe à l'analyse
des différents mots-clés associés à l'adresse web.

- Pour récupérer le critère de recherche, il suffit de récupérer dans le tableau GET l'élément correspondant au champ
de saisie HTML (en l'occurrence $_GET['critere']).
- Pour lire le fichier texte et stocker ses lignes dans un tableau (array), on utilise la fonction 'file'.
- Pour passer en revue tous les éléments du tableau précédemment constitué, on utilise une boucle 'foreach'.
- Pour fractionner en ses différentes composantes (url,titre,mots-clés) chaque élément du tableau, on utilise -à
l'intérieur de la boucle 'foreach'- la fonction 'explode'. Celle-ci scinde une chaîne de caractères sur base d'un
délimiteur (en l'occurrence '|').
- Pour comparer le critère de recherche aux données récupérées du fichier de référence, on a recours à la fonction
'preg_match' qui effectue une recherche par expression régulière insensible à la casse.
- Si le critère de recherche n'est pas retrouvé dans le titre on passe dans le bloc portant sur les mots-clés.
- Afin d'analyser individuellement les mots-clés on fractionne la chaîne de caractère '$motscles' sur base du délimiteur
','. Pour cela on utilise la fonction 'explode' qui retourne un tableau contenant les différents mots-clés.
- Pour passer en revue tous les éléments du tableau précédemment constitué, on utilise une boucle 'foreach'.
- Pour comparer le critère de recherche à un mot-clé, on utilise -à l'intérieur de la boucle 'foreach'- la fonction
'preg_match' (alternativement on aurait pu ici utiliser la fonction 'stristr').
- Si un mot-clé est pertinent, il est enregistré dans la variable '$liste_mots' - dans le cas contraire il est enregistré dans
la variable '$liste_mots_associes'.
page 187

Script PHP 'webindex.php'

1 - <?php
2 - if (!empty($_GET["critere"]))
3 - {
4 - $resultat = "";
5 - $lignes = file("webindex.txt");
6 - foreach($lignes as $ligne)
7 - {
8 - list($url,$titre,$motscles)=explode('|',$ligne);
9 - if (preg_match("/" . $_GET["critere"] . "/i", $titre))
10 - {
11 - $resultat .= "<p>";
12 - $resultat .= "Résultat obtenu sur base du titre.<br/>";
13 - $resultat .= "<b>$titre</b><br/>";
14 - $resultat .= "mots-clés associés: $motscles<br/>";
15 - $resultat .= "url: $url<br/>";
16 - $resultat .= "</p>";
17 - }
18 - else
19 - {
20 - $resultat_mots ="";
21 - $liste_mots_pertinents = "";
22 - $liste_mots_associes = "";
23 - $motscles = explode(',',$motscles);
24 - foreach($motscles as $mot)
25 - {
26 - if (preg_match("/" . $_GET["critere"] . "/i", $mot))
27 - {
28 - $liste_mots_pertinents .= "$mot ";
29 - }
30 - else
31 - {
32 - $liste_mots_associes .= "$mot ";
33 - }
34 - }
35 - if($liste_mots_pertinents != "")
36 - {
37 - $resultat .= "<p>";
38 - $resultat .= "Résultat obtenu sur base des mots-clés.<br/>";
39 - $resultat .= "titre : <b><a href=\"$url\">$titre</a></b><br/>";
40 - $resultat .= "mot(s)-clé(s) pertinent(s): <b>$liste_mots_pertinents</b><br/>";
41 - $resultat .= "mots-clés associés: $liste_mots_associes<br/>";
42 - $resultat .= "url : $url<br/>";
43 - $resultat .= "</p>";
44 - }
45 - }
46 - }
47 - echo (($resultat != "")?$resultat:"<p>Aucun enregistrement trouvé.</p>");
48 - }
49 - else
50 - {
51 - echo "<p>Vous devez préciser un critère !</p>";
52 - }
53 - ?>

Les structures conditionnelles 'if' sont là pour tester le critère de recherche et renvoyer à l'utilisateur les
messages adéquats.
page 188

Editeur

Editeur de texte

L'objectif est ici d'offrir, via un navigateur web, une interface d'édition sommaire pour certains documents sur
le serveur. Dans un premier temps, il faut afficher une liste de liens vers les fichiers à éditer. Lorsque l'utilisateur
en sélectionne un, il faut présenter le contenu du fichier texte dans un champ d'édition et enregistrer sur disque
le résultat après modification. Ce cas est fourni à titre d'exemple et le code est volontairement simplifié. C'est une
piste à explorer que vous ne devez pas hésiter à améliorer!

Nous limitons volontairement la première étape de l'opération au listing des fichiers xml contenu dans le répertoire courant.

Listing des fichiers xml

1 - <?php
2 - $path = "./datafiles/";
3 - if ($dir = opendir($path))
4 - {
5 - while($file = readdir($dir))
6 - {
7 - if (substr(strrchr($file, "."),1,3) == "xml")
8 - {
9 - echo "<a href=\"edit2.php?editfile=$file\">$file<a><br>\n";
10 - }
11 - }
12 - closedir($dir);
13 - }
14 - ?>

1. La fonction 'strrchr' récupère tous les caractères à partir du caractère ".".


2. La fonction 'substr' extrait du résultat précédent les trois caractères qui suivent le premier caractère.
3. Le lien html référence le script 'edit2.php' et lui passe le nom du fichier sélectionné en paramètre ('editfile=
$file').

Le script 'edit2.php' doit récupérer le paramètre qui lui est passé, lire le fichier choisi par l'utilisateur et en afficher le contenu
dans un formulaire html.
page 189

Edition du contenu d'un fichier


1 - <?php
2 - $filename = stripslashes($_GET["editfile"]);
3 - $path = "./datafiles/" . $filename;
4 - if(file_exists($path))
5 - {
6 - $contents = file_get_contents($path);
7 -
8 - echo "<form method=\"post\" action=\"edit3.php\">
9 - <table>
10 - <tr><td colspan=\"3\">Edition du fichier <b>$editfile</b></td></tr>
11 - <tr>
12 - <td>Nom :</td>
13 - <td></td>
14 - <td>
15 - <input type=\"text\" name=\"editfile\" value=\"$filename\">
16 - </td>
17 - </tr>
18 - <tr>
19 - <td>Contenu :</td>
20 - <td></td>
21 - <td>
22 - <textarea name=\"contents\" rows=\"16\" cols=\"40\">"
23 - . stripslashes($contents) .
24 - "</textarea>
25 - </td>
26 - </tr>
27 - <tr>
28 - <td></td>
29 - <td></td>
30 - <td><input type=\"submit\" value=\"enregistrer\"></td>
31 - </tr>
32 - </table>
33 - </form>";
34 - }
35 - ?>

Le script php ouvre en lecture un fichier sur base du paramètre 'editfile', il en lit le contenu grâce à la
fonction 'file_get_contents' et l'affiche dans une zone 'textarea'. Le traitement n'est effectué que si le fichier
précisé par l'utilisateur existe bien dans le répertoire de stockage des fichiers xml (fonction 'file_exists').

Le script 'edit3.php' est celui qui recoit les données du formulaire d'édition. Il est chargé d'enregistrer les modifications
sur disque. Pour cela, il doit récupérer les données du formulaire (le nom du fichier, le contenu textuel) et les écrire dans
le fichier.

Enregistrement des modifications


1 - <?php
2 - $filename = stripslashes($_POST["editfile"]);
3 - $path = "./datafiles/" . $filename;
4 - if(file_exists($path))
5 - {
6 - echo "Modification du fichier";
7 - file_put_contents($path, stripslashes($_POST["contents"]));
8 -
9 - // file_put_contents revient à appeler les fonctions
10 - // fopen(), fwrite() et fclose() successivement.
11 - // $fp = fopen($path, "w");
12 - // if(fwrite($fp, stripslashes($_POST["contents"])))
13 - // {
14 - // echo "Ecriture du fichier OK";
15 - // }
16 - // else
17 - // {
18 - // echo "Impossible d'écrire!";
19 - // }
20 - //fclose($fp);
21 - }
22 - ?>

Le fichier identifié via le paramètre 'editfile' est ouvert en écriture. Ensuite, le contenu récupéré à partir du
formulaire (champ 'contents') est écrit dans le fichier.
page 190

Index
PDO->exec 148
PDO->prepare 150
PDO->query 147
PDOStatement->fetch 149
PHPSESSID 169
affectation 50
apprentissage 11
array 101
break 61
closedir 112
commentaires 24
constantes 46
constructeur PDO 144
continue 62
copy 126
distribution 12
do while 59
documentation,support 14
each 103
echo 78
elseif 56
erreur 71
explode 98
expression régulière 130
extension 19
fclose 116
feof 123
fgets 119
fichiers 108
file 120
file_exists 124
filesize 122
flock 129
fonction 68
fopen 115
for 60
foreach 104
formulaire 28
fread 118
fwrite 117
htmlentities 95
htmlspecialchars 94
hébergement 16
if 54
implode 99
include 65
installation 13
is_array 107
isset 32
list 102
mail 153
nl2br 91
odbc_connect 137
odbc_exec 138
odbc_fetch_into 142
odbc_fetch_row 139

Notes PHP - Circum Net


page 191

odbc_result 140
odbc_result_all 141
opendir 109
opérateur ternaire 57
passthru 158
preg_match 133
preg_replace 135
print 79
readdir 110
readfile 121
reset 106
rewinddir 111
session_destroy 165
session_id 168
session_register 166
session_start 164
setcookie 160
sizeof 105
str_replace 96
strip_tags 88
stripslashes 89
strlen 81
strrchr 87
strtolower 82
strtoupper 83
substr 85
substr_count 86
switch 63
system 157
séparateur 22
tableaux 100
template 18
tempnam 127
tmpfile 128
touch 113
trim 97
ucfirst 84
unlink 114
urldecode 93
urlencode 92
utilisation 10
variables dynamiques 33
while 58

Notes PHP - Circum Net