0% ont trouvé ce document utile (0 vote)
19 vues49 pages

Langage PHP

Télécharger au format doc, pdf ou txt
Télécharger au format doc, pdf ou txt
Télécharger au format doc, pdf ou txt
Vous êtes sur la page 1/ 49

Langage PHP

Introduction à PHP

Qu'est-ce que PHP?

PHP est un langage interprété (un langage de script) exécuté du côté serveur (comme les scripts CGI, ASP, ...) et non
du côté client (un script écrit en Javascript ou une applet Java s'exécute sur votre ordinateur...). La syntaxe du
langage provient de celles du langage C, du Perl et de Java. Ses principaux atouts sont:

 La gratuité et la disponibilité du code source (PHP3 est distribué sous licence GNU GPL)
 La simplicité d'écriture de scripts
 la possibilité d'inclure le script Php au sein d'une page HTML (contrairement aux scripts CGi, pour lesquels il faut
écrire des lignes de code pour afficher chaque ligne en langage HTML)
 La simplicité d'interfaçage avec des bases de données (de nombreux SGBD sont supportés, mais le plus utilisé avec
ce langage est MySQL, un SGBD gratuit sur les plateformes Unix et Linux, mais payant sous Windows)).
 L'intégration au sein de nombreux serveurs web (Apache, Microsoft IIS, ...)

Origines de PHP
Le langage PHP a été mis au point au début d'automne 1994 par Rasmus Lerdorf. Ce langage de script lui permettait
de conserver la trace des utilisateurs venant consulter son CV sur son site, grâce à l'accès à une base de données par
l'intermédiaire de requêtes SQL. Ainsi, étant onné que de nombreux internautes lui demandèrent ce programme,
Rasmus Lerdorf mit en ligne en 1995 la première version de ce programme qu'il baptisa Personal Sommaire Page
Tools, puis Personal Home Page v1.0 (traduisez page personnelle version 1.0).
Etant donné le succès de PHP 1.0, Rasmus Lerdorf décida d'améliorer ce langage en y intégrant des structures plus
avancées telles que des boucles, des structures conditionnelles, et y intégra un package permettant d'interpréter les
formulaires qu'il avait développé (FI, Form Interpreter) ainsi que le support de mSQL. C'est de cette façon que la
version 2 du langage, baptisée pour l'occasion PHP/FI version 2, vit le jour durant l'été 1995. Il fut rapidement utilisé
sur de nombreux sites (15000 fin 1996, puis 50000 en milieu d'année 1997).
A partir de 1997, Zeev Suraski et Andi Gurmans rejoignèrent Rasmus pour former une équipe de programmeurs afin
de mettre au point PHP 3 (Stig Bakken, Shane Caraveo et Jim Winstead les rejoignèrent par la suite). C'est ainsi que
la version 3.0 de PHP fut disponible le 6 juin 1998.
A la fin de l'année 1999, une version bêta de PHP, baptisée PHP4 est apparue...

SGBD supportés par Php


Php permet un interfaçage simple avec de nombreux SGBD. La version 3 du langage supporte les SGBD suivants:
 Adabas D
 dBase
 Empress
 FilePro
 Informix
 Interbase
 mSQL
 MySQL
 Oracle
 PostgreSQL
 Solid
 Sybase
 Velocis
 Unix dbm

Implantation de PHP

L'interprétation du code par le serveur

Un script PHP est un simple fichier texte contenant des instructions écrites à l'aide de caractères ASCII 7 bits (des
caractères non accentués) incluses dans un code HTML à l'aide de balises spéciales et stocké sur le serveur. Ce fichier
doit avoir l'extension ".php3" pour pouvoir être interprété par le serveur!
Ainsi, lorsqu'un navigateur (le client) désire accéder à une page dynamique réalisé en php3:

1
Langage PHP
 le serveur reconnait qu'il s'agit d'un fichier php3
 il lit le fichier php3
 Dès que le serveur rencontre une balise indiquant que les lignes suivantes sont du code php3, il "passe" en mode
php3, ce qui signifie qu'il ne lit plus les instructions: il les exécute!
 Lorsque le serveur rencontre une instruction, il la transmet à l'interpréteur
 L'interpréteur exécute l'instruction puis envoie les sorties éventuelles à l'interpréteur
 A la fin du script, le serveur transmet le résultat au client (le navigateur)

Un script PHP est interprété par le serveur, les utilisateurs ne peuvent donc pas voir le source!

visible directement par le client puisque dès qu'il en


Le code php3 stocké sur le serveur n'est donc jamais
demande l'accès, le serveur l'interprète!
De cette façon aucune modification n'est à apporter sur les navigateurs...

Implantation au sein du code HTML


Pour que le script soit interprété par le serveur deux conditions sont nécessaires:
 Le fichier contenant le code doit avoir l'extension .php3 et non .html
 Le code php3 contenu dans le code HTML doit être délimité par les balises <?php et ?>

Un script PHP doit:


 comporter l'extension .php3

 être imbriqué entre les délimiteurs <?php et ?>


Pour des raisons de conformité avec certaines normes (XML et ASP par exemple), plusieurs balises peuvent être
utilisées pour délimiter un code PHP:
1. <?php et ?>
2. <? et ?>
3. <script language="php"> et </script>
4. <%php et %>

Un exemple de script simple


Voici l'exemple le plus utilisé de script php:
<html>
<head><title>Exemple</title></head>
<body>
<?php
echo "Hello world";
?>
</body>
</html>
On notera bien évidemment que la fonction echo permet d'afficher sur le navigateur la chaine délimitée par les
guillemets...

Caractéristiques de PHP

L'interprétation du code

Un code PHP (celui compris entre les délimiteurs <?php et ?>) est un ensemble d'instructions se terminant chacune
par un point-virgule (comme en langage C). Lorsque le code est interprété, les espaces, retours chariot et
tabulation ne sont pas pris en compte par le serveur. Il est tout de même conseiller d'en mettre (ce n'est pas
parce qu'ils ne sont pas interprétés que l'on ne peut pas les utiliser) afin de rendre le code plus lisible (pour
vous, puisque les utilisateurs ne peuvent lire le code source: il est interprété).

2
Langage PHP

Les commentaires

Une autre façon de rendre le code plus compréhensible consiste à insérer des commentaires, des lignes qui seront
tout simplement ignorées par le serveur lors de l'interprétation.

Pour ce faire, il est possible, comme en langage C, d'utiliser des balises qui vont permettre de délimiter les
explications afin que l'interpréteur les ignore et passe directement à la suite du fichier.
Ces délimiteurs sont

/* et */
Un commentaire sera donc noté de la façon suivante:
/* Voici un commentaire! */
Il y a toutefois quelques règles à respecter:
 Les commentaires peuvent être placés n'importe où à l'intérieur des délimiteurs de script PHP
 Les commentaires ne peuvent contenir le délimiteur de fin de commentaire (*/)
 Les commentaires ne peuvent être imbriqués
 Les commentaires peuvent être écrits sur plusieurs lignes

 Les commentaires ne peuvent pas couper un mot du code en deux


Il est possible aussi d'utiliser un type de commentaire permettant de mettre toute la fin d'une ligne en commentaire
en utilisant le double slash (//). Tout ce qui se situe à droite de ce symbole sera mis en commentaire.

Typologie
La manière d'écrire les choses en langage PHP a son importance. Le langage PHP est par exemple sensible à la casse
(en anglais case sensitive), cela signifie qu'un nom contenant des majuscules est différent du même nom écrit en
minuscules. Toutefois, cette règle ne s'applique pas aux fonctions, les spécifications du langage PHP précisent que la
fonction print peut être appelée print(), Print() ou PRINT().
Enfin, toute instruction se termine par un point-virgule.

Installation

Introduction

Un serveur web est un logiciel permettant de rendre accessibles à de nombreux ordinateurs (les clients) des pages web
stockées sur le disque. Cette fiche pratique explique comment installer le serveur web Apache sur un système de type
UNIX (typiquement une distribution de Linux telle que RedHat, Mandrake ou n'importe quelle autre).

Pour cela quelques connaissances sur Linux ou bien Unix sont nécessaires. Le but de cette fiche va être d'être capable
de récupérer les sources des différents éléments nécessaires et de les compiler (un compilateur C est donc
nécessaire, il est généralement installé par défaut sur la plupart des distributions Linux) afin d'avoir un système
opérationnel.

L'installation suivante comprend l'installation de l'interpréteur PHP,


un langage de programmation permettant de
créer des pages créées dynamiquement, ainsi que le SGBD MySQL, un système de gestion de bases de données
relationnelles puissant fonctionnant sous Linux (et gratuit!).

Télécharger les sources


 Les sources de PHP peuvent être téléchargées sur le site http://www.php.net/
 Les sources de Apache peuvent être téléchargées sur le site http://www.apache.org/
 Les sources de MySQL peuvent être téléchargées sur le site http://www.mysql.org/

installer Apache et PHP


1. Décompresser les archives:
2. tar zxvf apache_1.3.x.tar.gz
tar zxvf php-3.0.x.tar
3. Configurer Apache

3
Langage PHP
4. cd apache_1.3.x
./configure --prefix=/www
5. Configurer PHP
6. cd ../php-3.0.x
./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars

Si vous préférez installer PHP dans un autre répertoire, il faut utiliser l'option de configuration --with-config-file-
path=/path

7. Compiler PHP
8. make
make install
9. Installer Apache
10. cd ../apache_1.3.x
11. ./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a
12. make
make install
13. Modifier le fichier de configuration de PHP
14. cd ../php-3.0.x
cp php3.ini-dist /usr/local/lib/php3.ini

Vous pouvez désormais éditer le fichier de configuration /usr/local/lib/php3.ini.

15. Editez le fichier de configuration du serveur apache (généralement httpd.conf ou srm.conf et ajoutez la ligne
suivante:

AddType application/x-httpd-php3 .php3

Il s'agit de choisir l'extension associée aux scripts PHP. Par souci d'homogénéité, il est courant de choisir l'extension
.php3

16. Démarrez le serveur Apache. (Il est essentiel d'arrêter et redémarrer le serveur, et non uniquement de le relancer.
Il suffit généralement de taper apachectl stop, puis apachectl start).

Premier lancement
Pour vérifier si l'installation a bien fonctionnée, il vous suffit de créer un petit fichier dans la racine des documents du
serveur web (appelée DocumentRoot dans le fichier de configuration httpd.conf). Nommez ce fichier toto.php3, et
mettez le code suivant dans ce fichier:
<html>
<head><title>Exemple</title></head>
<body>
<?php
echo "PHP fonctionne!";
?>
</body>
</html>
Lancez un navigateur sur cette machine et entrez l'URL suivante:
http://localhost/toto.php3
localhost désigne la machine sur laquelle vous vous trouvez...
Vous devriez logiquement voir apparaître la phrase "PHP fonctionne!" sur

Variables
Concept de variable avec PHP

Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de
l'exécution du programme. Les variables en langage PHP peuvent être de trois types:

 scalaires
 tableaux
 tableaux associatifs

4
Langage PHP
Quelque soit le type de variable, son nom doit obligatoirement être précédé du caractère dollar ($).
Contrairement à de nombreux langages de programmation, comme le langage C, les variables en PHP n'ont pas
besoin d'être déclarées, c'est-à-dire que l'on peut commencer à les utiliser sans en avoir averti l'interpréteur
précédemment, ainsi si la variable existait précédemment, son contenu est utilisé, sinon l'interpréteur lui
affectera la valeur en lui assignant 0 par défaut. De cette façon si vous ajoutez 3 à une nouvelle variable (non
définie plus haut dans le code), sa valeur sera 3...

Nommage des variables


Avec PHP, les noms de variables doivent répondre à certains critères:
 un nom de variable doit commencer par une lettre (majuscule ou minuscule) ou un "_" (pas par un chiffre)
 un nom de variables peut comporter des lettres, des chiffres et le caractère _ (les espaces ne sont pas
autorisés!)

Nom de variable correct Nom de variable incorrect Raison


$Variable $Nom de Variable comporte des espaces
$Nom_De_Variable $123Nom_De_Variable commence par un chiffre
$nom_de_variable [email protected] caractère spécial @
$nom_de_variable_123 $Nom-de-variable signe - interdit
$nom_de_variable nom_de_variable ne commence pas par $

Les noms de variables sont sensibles à la casse (le langage PHP fait la différence entre un nom en
majuscule et un nom en minuscules), il faut donc veiller à utiliser des noms comportant la même casse!
Toutefois, les noms de fonctions font exception à cette règle...

Variables scalaires
La langage PHP propose trois types de variables scalaires:
 entiers: nombres naturels sans décimale (sans virgule)
 réels: nombres décimaux (on parle généralement de type double, car il s'agit de nombre décimaux à double
précision)
 chaines de caractères: ensembles de caractères

Il n'est pas nécessaire en PHP de typer les variables, c'est-à-dire de définir leur type, il suffit de leur assigner une
valeur pour en définir le type:
 entiers: nombre sans virgule
 réels: nombres avec une virgule (en réalité un point)
 chaines de caractères: ensembles de caractères entre guillemets simples ou doubles

Instruction Type de la variable


$Variable = 0; type entier
$Variable = 12; type entier
$Variable = 0.0; type réel
$Variable = 12.0; type réel
$Variable = "0.0"; type chaîne
$Variable = "Bonjour tout le monde"; type chaîne
spécial permettant d'effectuer des opérations particulières. Ces
Il existe des caractères repérés par un code ASCII
caractères peuvent être représentés plus simplement en langage PHP grâce au caractère '\' suivi d'une lettre, qui
précise qu'il s'agit d'un caractère de contrôle:
Caractère Description
\" guillemet
\\ barre oblique inverse (antislash)
\r retour chariot
\n retour à la ligne
\t tabulation

5
Langage PHP
En effet, certains de ces caractères ne pourraient pas être représentés autrement (un retour à la ligne ne peut pas
être représenté à l'écran). D'autre part, les caractères \ et " ne peuvent pas faire partie en tant que tel d'une
chaîne de caractère, pour des raisons évidente d'ambiguité...

Variables tableaux
Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de
nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes à gérer.
Heureusement, PHP propose des structures de données permettant de stocker l'ensemble de ces données dans une
"variable commune". Ainsi, pour accéder à ces valeurs il suffit de parcourir la variable de type complexe composée de
"variables" de type simple.
Les tableaux stockent des données sous forme de liste. Les données contenues dans la liste sont accessibles grâce à
un index (un numéro représentant l'élément de la liste). Contrairement à des langages tels que le langage C, il est
possible de stocker des éléments de types différents dans un même tableau.
Ainsi, pour désigner un élément de tableau, il suffit de faire suivre au nom du tableau l'indice de l'élément entre
crochets:
$Tableau[0] = 12;
$Tableau[1] = "CCM";
Avec PHP, il n'est pas nécessaire de préciser la valeur de l'index lorsque l'on veut remplir un tableau, car il assigne la
valeur 0 au premier élément (si le tableau est vide) et incrémente les indices suivants. De cette façon, il est facile de
remplir un tableau avec des valeurs. Le code précédent est équivalent à:
$Tableau[] = 12;
$Tableau[] = "CCM";

 Les indices de tableau commencent à zéro

 tous les types de variables peuvent être contenus dans un tableau

Lorsqu'un tableau contient d'autres tableaux, on parle de tableaux multidimensionnels. Il est possible de créer
directement des tableaux multidimensionnels en utilisant plusieurs paires de crochets pour les index (autant de paires
de crochets que la dimension voulue). Par exemple, un tableau à deux dimensions pourra être déclaré comme suit:
$Tableau[0][0] = 12;
$Tableau[0][1] = "CCM";
$Tableau[1][0] = 1245.652;
$Tableau[1][1] = "Au revoir";

Variables tableaux associatifs


PHP permet l'utilisation de chaînes de caractères au lieu de simples entiers pour définir les indices d'un tableau, on
parle alors de tableaux associatifs. Cette façon de nommer les indices peut parfois être plus agréable à utiliser:
$Toto["Age"] = 12;
$Toto["Adresse"] = "22 rue des bois fleuris";
$Toto["Nom"] = "Ah, vous auriez bien aimé
connaître le nom de famille de Toto...";

Portée (visibilité) des variables


Selon l'endroit où on déclare une variable, celle-ci pourra être accessible (visible) de partout dans le code ou bien que
dans une portion confinée de celui-ci (à l'intérieur d'une fonction par exemple), on parle de portée (ou visibilité) d'une
variable.
Lorsqu'une variable est déclarée dans le code même, c'est-à-dire à l'extérieur de toute fonction ou de tout bloc
d'instruction, elle est accessible de partout dans le code (n'importe quelle fonction du programme peut faire appel à
cette variable). On parle alors de variable globale
Lorsque l'on déclare une variable à l'intérieur d'un bloc d'instructions (entre des accolades), sa portée se confine à
l'intérieur du bloc dans lequel elle est déclarée.
 Une variable déclarée au début du code, c'est-à-dire avant tout bloc de donnée, sera globale, on pourra alors les
utiliser à partir de n'importe quel bloc d'instruction
 Une variable déclarée à l'intérieur d'un bloc d'instructions (dans une fonction ou une boucle par exemple) aura une
portée limitée à ce seul bloc d'instruction, c'est-à-dire qu'elle est inutilisable ailleurs, on parle alors de variable locale

D'une manière générale il est préférable de donner des noms différents aux variables locales et globales pour
des raisons de lisibilité et de compréhension du code...

Définition de constantes
Une constante est une variable dont la valeur est inchangeable lors de l'exécution d'un programme. Avec PHP, les
constantes sont définies grâce à la fonction define(). la syntaxe de la fonction define() est la suivante:

6
Langage PHP
define("Nom_de_la_variable", Valeur);

Le nom d'une constante définie à l'aide de la fonction define() ne doit pas commencer par le caractère $
(de cette façon aucune affection n'est possible).

Opérateurs

Qu'est-ce qu'un opérateur?

Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations,
les évaluer, ...
On distingue plusieurs types d'opérateurs:

 les opérateurs de calcul


 les opérateurs d'assignation
 les opérateurs d'incrémentation
 les opérateurs de comparaison
 les opérateurs logiques
 (les opérateurs bit-à-dit)
 (les opérateurs de rotation de bit)

Les opérateurs de calcul


Les opérateurs de calcul permettent de modifier mathématiquement la valeur d'une variable
Opérateur Dénomination Effet Exemple Résultat (avec x valant 7)
+ opérateur d'addition Ajoute deux valeurs $x+3 10
- opérateur de soustraction Soustrait deux valeurs $x-3 4
* opérateur de multiplication Multiplie deux valeurs $x*3 21
/ plus: opérateur de division Divise deux valeurs $x/3 2.3333333
= opérateur d'affectation Affecte une valeur à une variable $x=3 Met la valeur 3 dans la variable $x

Les opérateurs d'assignation


Ces opérateurs permettent de simplifier des opérations telles que ajouter une valeur dans une variable et stocker le
résultat dans la variable. Une telle opérations s'écrirait habituellement de la façon suivante par exemple: $x=$x+2
Avec les opérateurs d'assignation il est possible d'écrire cette opération sous la forme suivante: $x+=2
Ainsi, si la valeur de x était 7 avant opération, elle sera de 9 après...
Les autres opérateurs du même type sont les suivants:
Opérateur Effet
+= addition deux valeurs et stocke le résultat dans la variable (à gauche)
-= soustrait deux valeurs et stocke le résultat dans la variable
*= multiplie deux valeurs et stocke le résultat dans la variable
/= divise deux valeurs et stocke le résultat dans la variable
%= donne le reste de la division deux valeurs et stocke le résultat dans la variable
|= Effectue un OU logique entre deux valeurs et stocke le résultat dans la variable
^= Effectue un OU exclusif entre deux valeurs et stocke le résultat dans la variable
&= Effectue un Et logique entre deux valeurs et stocke le résultat dans la variable
.= Concatène deux chaînes et stocke le résultat dans la variable

Les opérateurs d'incrémentation


Ce type d'opérateur permet de facilement augmenter ou diminuer d'une unité une variable. Ces opérateurs sont très
utiles pour des structures telles que des boucles, qui ont besoin d'un compteur (variable qui augmente de un en un).
Un opérateur de type $x++ permet de remplacer des notations lourdes telles que $x=$x+1 ou bien $x+=1
Opérateur Dénomination Effet Syntaxe Résultat (avec x valant 7)

7
Langage PHP
++ Incrémentation Augmente d'une unité la variable $x++ 8
-- Décrémentation Diminue d'une unité la variable $x-- 6

Les opérateurs de comparaison


Résultat (avec x valant
Opérateur Dénomination Effet Exemple
7)
==
Compare deux valeurs et vérifie Retourne 1 si $X est égal
A ne pas confondre avec le opérateur d'égalité $x==3
leur égalité à 3, sinon 0
signe d'affectation (=)!!
Vérifie qu'une variable est
opérateur d'infériorité Retourne 1 si $X est
< strictement inférieure à une $x<3
stricte inférieur à 3, sinon 0
valeur
Vérifie qu'une variable est Retourne 1 si $X est
<= opérateur d'infériorité $x<=3
inférieure ou égale à une valeur inférieur à 3, sinon 0
Vérifie qu'une variable est
opérateur de Retourne 1 si $X est
> strictement supérieure à une $x>3
supériorité stricte supérieur à 3, sinon 0
valeur
Vérifie qu'une variable est Retourne 1 si $X est
opérateur de
>= supérieure ou égale à une $x>=3 supérieur ou égal à 3,
supériorité
valeur sinon 0
opérateur de Vérifie qu'une variable est Retourne 1 si $X est
!= $x!=3
différence différente d'une valeur différent de 3, sinon 0

Les opérateurs logiques (booléens)


Ce type d'opérateur permet de vérifier si plusieurs conditions sont vraies:
Opérateur Dénomination Effet Syntaxe
|| ou OR OU logique Vérifie qu'une des conditions est réalisée ((condition1)||(condition2))
&& ou
ET logique Vérifie que toutes les conditions sont réalisées ((condition1)&&(condition2))
AND
XOR OU exclusif Opposé du OU logique ((condition1)XOR(condition2))
Inverse l'état d'une variable booléenne (retourne la valeur
! NON logique (!condition)
1 si la variable vaut 0, 0 si elle vaut 1)

(Les opérateurs bit-à-bit)


Si vous ne comprenez pas ces opérateurs cela n'est pas important, vous n'en aurez probablement pas l'utilité. Pour
ceux qui voudraient comprendre, rendez- vous aux chapitres suivants:
 compréhension du binaire
 représentation des données
 Instructions arithmétiques et logiques en assembleur

Ce type d'opérateur traite ses opérandes comme des données binaires, plutôt que des données décimales,
hexadécimales ou octales. Ces opérateurs traitent ces données selon leur représentation binaire mais retournent des
valeurs numériques standards dans leur format d'origine.
Les opérateurs suivants effectuent des opérations bit-à-bit, c'est-à-dire avec des bits de même poids.
Résultat (avec x
Opérateur Dénomination Effet Syntaxe
valant 7)
Retourne 1 si les deux bits de même poids sont à 9 & 12 (1001 &
& ET bit-à-bit 8 (1000)
1 1100)
Retourne 1 si l'un ou l'autre des deux bits de 9 | 12 (1001 |
| OU bit-à-bit 13 (1101)
même poids est à 1 (ou les deux) 1100)
Retourne 1 si l'un des deux bits de même poids est 9 ^ 12 (1001 ^
^ OU bit-à-bit 5 (0101)
à 1 (mais pas les deux) 1100)
Complément 9 ^ 12 (1001 ^
~ Retourne 1 si le bit est à 0 (et inversement) 5 (0101)
(NON) 1100)

(Les opérateurs de rotation de bit)


Si vous ne comprenez pas ces opérateurs cela n'est pas important, vous n'en aurez probablement pas l'utilité. Pour
ceux qui voudraient comprendre, rendez- vous aux chapitres suivants:
 compréhension du binaire

8
Langage PHP
 représentation des données
 Instructions arithmétiques et logiques en assembleur

Ce type d'opérateur traite ses opérandes comme des données binaires d'une longueur de 32 bits, plutôt que des
données décimales, hexadécimales ou octales. Ces opérateurs traitent ces données selon leur représentation binaire
mais retournent des valeurs numériques standards dans leur format d'origine.
Les opérateurs suivants effectuent des rotation sur les bits, c'est-à-dire qu'il décale chacun des bits d'un nombre
de bits vers la gauche ou vers la droite. La première opérande désigne la donnée sur laquelle on va faire le
décalage, la seconde désigne le nombre de bits duquel elle va être décalée.
Résultat
Opérateur Dénomination Effet Syntaxe (avec x
valant 7)
Décale les bits vers la gauche (multiplie par 2 à chaque
6 << 1 (110
<< Rotation à gauche décalage). Les zéros qui sortent à gauche sont perdus, 12 (1100)
<< 1)
tandis que des zéros sont insérés à droite
Décale les bits vers la droite (divise par 2 à chaque
6 >> 1
Rotation à droite avec décalage). Les zéros qui sortent à droite sont perdus,
>> (0110 >> 3 (0011)
conservation du signe tandis que le bit non-nul de poids plus fort est recopié
1)
à gauche

Autres opérateurs
Les opérateurs ne peuvent pas être classés dans une catégorie spécifique maisils ont tout de même chacun leur
importance!
Résultat (avec x
Opérateur Dénomination Effet Syntaxe
valant 7)
"Bonjour"."Au
. Concaténation Joint deux chaînes bout à bout "BonjourAu revoir"
revoir"
Référencement de
$ Permet de définir une variable $MaVariable = 2;
variable
Permet d'accéder aux données $MonObjet-
-> Propriété d'un objet
membres d'une classe >Propriete
Permet d'accéder aux données $MonObjet-
-> Propriété d'un objet
membres d'une classe >Propriete

Les priorités
Lorsque l'on associe plusieurs opérateurs, il faut que le navigateur sache dans quel ordre les traiter, voici donc dans
l'ordre décroissant les priorités de tous les opérateurs:
Priorité des opérateurs
() []
-- ++ ! ~ -
* / %
+ -
< <= >= >
== !=
&
^
|
&&
||
? :
= += -= *= /= %= <<= >>= >>>= &= ^= |=
AND
XOR

Structures conditionnelle

9
Langage PHP

Qu'est-ce qu'une structure conditionnelle?

On appelle structure conditonnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-
à-dire si la valeur de son expression vaut 0 ou 1 (le PHP associe le mot clé true à 1 et false à 0). Ces structures
conditionnelles peuvent être associées à des structures qui se répètent suivant la réalisation de la condition, on
appelle ces structures des structures de boucle

La notion de bloc

Une expression suivie d'un point-virgule est appelée instruction. Par exemple a++; est une instruction.
Lorsque l'on veut regrouper plusieurs instructions, on peut créer ce que l'on appelle un bloc, c'est-à-dire un ensemble
d'instructions (suivies respectivement par des point-virgules) et comprises entre les accolades { et }.

Les instructions if, while et for peuvent par exemple être suivies d'un bloc d'instructions à exécuter...

L'instruction if

L'instruction if est la structure de test la plus basique, on la retrouve dans tous les langages (avec une syntaxe
différente...). Elle permet d'exécuter une série d'instruction si jamais une condition est réalisée.

La syntaxe de cette expression est la suivante:

if (condition réalisée) {
liste d'instructions
}

Remarques:

 la condition doit être entre des parenthèses


 il est possible de définir plusieurs conditions à remplir avec les opérateurs ET et OU (&& et ||)
par exemple:
if ((condition1)&&(condition2)) teste si les deux conditions sont vraies
if ((condition1)||(condition2)) exécutera les instructions si l'une ou l'autre des deux conditions est vraie
 s'il n'y a qu'une instruction, les accolades ne sont pas nécessaires...

L'instruction if ... else


L'instruction if dans sa forme basique ne permet de tester qu'une condition, or la plupart du temps on aimerait
pouvoir choisir les instructions à exécuter en cas de non réalisation de la condition...
L'expression if ... else permet d'exécuter une autre série d'instruction en cas de non-réalisation de la condition.
La syntaxe de cette expression est la suivante:
if (condition réalisée) {
liste d'instructions
}
else {
autre série d'instructions
}

L'instruction if ... elseif ... else


L'instruction if ... else ne permet de tester qu'une condition, or il est parfois nécessaire de tester plusieurs conditions
de façon exclusive, c'est-à-dire que sur toutes les conditions une seule sera réalisée ...
L'expression if ... elseif ... else permet d'enchaîner une série d'instructions et évite d'avoir à imbriquer des
instructions if.
La syntaxe de cette expression est la suivante:
if (condition réalisée) {
liste d'instructions
}

10
Langage PHP
elseif (autre condition réalisée) {
autre série d'instructions
}
...
else (dernière condition réalisée) {
série d'instructions
}

une façon plus courte de faire un test (opérateur ternaire)


Il est possible de faire un test avec une structure beaucoup moins lourde grâce à la structure suivante, appelée
opérateur ternaire:
(condition) ? instruction si vrai : instruction si faux
Remarques:
 la condition doit être entre des parenthèses
 Lorsque la condition est vraie, l'instruction de gauche est exécutée
 Lorsque la condition est fausse, l'instruction de droite est exécutée

L'instruction switch
L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une même variable. Ce branchement
conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable, car cette opération aurait été compliquée
(mais possible) avec des if imbriqués. Sa syntaxe est la suivante:
switch (Variable) {
case Valeur1:
Liste d'instructions
break;
case Valeur1:
Liste d'instructions
break;
case Valeurs...:
Liste d'instructions
break;
default:
Liste d'instructions
break;
}
Les parenthèses qui suivent le mot clé switch indiquent une expression dont la valeur est testée successivement par
chacun des case. Lorsque l'expression testée est égale à une des valeurs suivant un case, la liste d'instruction qui suit
celui-ci est exécuté. Le mot clé break indique la sortie de la structure conditionnelle. Le mot clé default précède la
liste d'instructions qui sera exécutée si l'expression n'est jamais égale à une des valeurs.

N'oubliez pas d'insérer des instructions break entre chaque test, ce genre d'oubli est difficile à détecter
car aucune erreur n'est signalée...

Les boucles
Les boucles sont des structures qui permettent d'exécuter plusieurs fois la même série d'instructions jusqu'à ce
qu'une condition ne soit plus réalisée...
On appelle parfois ces structures instructions répétitives ou bien itérations.
La façon la plus commune de faire une boucle, est de créer un compteur (une variable qui s'incrémente, c'est-à-
dire qui augmente de 1 à chaque tour de boucle) et de faire arrêter la boucle lorsque le compteur dépasse une
certaine valeur.

La boucle for
L'instruction for permet d'exécuter plusieurs fois la même série d'instructions: c'est une boucle!
Dans sa syntaxe, il suffit de préciser le nom de la variable qui sert de compteur (et éventuellement sa valeur de
départ, la condition sur la variable pour laquelle la boucle s'arrête (basiquement une condition qui teste si la valeur du
compteur dépasse une limite) et enfin une instruction qui incrémente (ou décrémente) le compteur.
La syntaxe de cette expression est la suivante:
for (compteur; condition; modification du compteur) {
liste d'instructions
}

11
Langage PHP
Par exemple:
for (i=1; i<6; i++) {
printf("%d", i);
}
Cette boucle affiche 5 fois la valeur de i, c'est-à-dire 1,2,3,4,5
Elle commence à i=1, vérifie que i est bien inférieur à 6, etc... jusqu'à atteindre la valeur i=6, pour laquelle la
condition ne sera plus réalisée, la boucle s'interrompra et le programme continuera son cours.
D'autre part, le langage C++ autorise la déclaration de la variable de boucle dans l'instruction for elle-même!
Par exemple:
for (int i=0; i<10; i++) {
printf("%d", i);
}
 il faudra toujours vérifier que la boucle a bien une condition de sortie (i.e le compteur s'incrémente
correctement)
 une instruction printf(); dans votre boucle est un bon moyen pour vérifier la valeur du compteur pas à
pas en l'affichant!
 il faut bien compter le nombre de fois que l'on veut faire exécuter la boucle:
o for(i=0;i<10;i++) exécute 10 fois la boucle (i de 0 à 9)
o for(i=0;i<=10;i++) exécute 11 fois la boucle (i de 0 à 10)
o for(i=1;i<10;i++) exécute 9 fois la boucle (i de 1 à 9)

o for(i=1;i<=10;i++) exécute 10 fois la boucle (i de 1 à 10)

L'instruction while
L'instruction while représente un autre moyen d'exécuter plusieurs fois la même série d'instructions.
La syntaxe de cette expression est la suivante:
while (condition réalisée) {
liste d'instructions
}
Cette instruction exécute la liste d'instructions tant que (while est un mot anglais qui signifie tant que) la condition
est réalisée.

La condition de sortie pouvant être n'importe quelle structure conditionnelle, les risques de boucle infinie
(boucle dont la condition est toujours vraie) sont grands, c'est-à-dire qu'elle risque de provoquer un
plantage du navigateur!

Saut inconditionnel
Il peut être nécessaire de faire sauter à la boucle une ou plusieurs valeurs sans pour autant mettre fin à celle-ci.
La syntaxe de cette expression est "continue;" (cette instruction se place dans une boucle!), on l'associe
généralement à une structure conditionnelle, sinon les lignes situées entre cette instruction et la fin de la boucle
seraient obsolètes.
Exemple: Imaginons que l'on veuille imprimer pour x allant de 1 à 10 la valeur de 1/(x-7) ... il est évident que pour
x=7 il y aura une erreur. Heureusement, grâce à l'instruction continue il est possible de traiter cette valeur à part puis
de continuer la boucle!
x=1
while (x<=10) {
if (x == 7) {
printf("Division par zéro!");
continue;
}
a = 1/(x-7);
printf("%d", a);
x++
}
Il y avait une erreur dans ce programme... peut-être ne l'avez-vous pas vue:
Lorsque x est égal à 7, le compteur ne s'incrémente plus, il reste constamment à la valeur 7, il aurait fallu écrire:
x=1
while (x<=10) {
if (x == 7) {
printf("division par 0");
x++;
continue;
}
a = 1/(x-7);
printf("%d", a);

12
Langage PHP
x++
}

Arrêt inconditionnel
A l'inverse, il peut être voulu d'arrêter prématurément la boucle, pour une autre conditon que celle précisé dans l'en-
tète de la boucle. L'instruction break permet d'arrêter une boucle (for ou bien while). Il s'agit, tout comme continue,
de l'associer à une structure conditionnelle, sans laquelle la boucle ne ferait jamais plus d'un tour!
Dans l'exemple de tout à l'heure, par exemple si l'on ne savait pas à quel moment le dénominateur (x-7) s'annule
(bon...OK...pour des équations plus compliquées par exemple) il serait possible de faire arrêter la boucle en cas
d'annulation du dénominateur, pour éviter une division par zéro!
for (x=1; x<=10; x++) {
a = x-7;
if (a == 0) {
printf("division par 0");
break;
}
printf("%d", 1/a);
}

Arrêt d'exécution du script


PHP autorise l'utilisation de la commande exit, qui permet d'interrompre totalement l'interprétation du script, ce qui
signifie que le serveur n'envoie plus d'infomrations au navigateur: le script est figé dans son état actuel. cette
instruction est particulièrement utile lors de l'apparition d'erreur!

Les fonctions

La notion de fonction

On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instruction par simple appel de la
fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du
programme une série d'instructions, cela permet une simplicité du code et donc une taille de programme
minimale. D'autre part, une fonction peut faire appel à elle-même, on parle alors de fonction récursive (il ne
faut pas oublier de mettre une condition de sortie au risque sinon de ne pas pouvoir arrêter le programme...).

La déclaration d'une fonction

PHP recèle de nombreuses fonctions intégrées permettant d'effectuer des actions courantes. Toutefois, il est possible
de définir des fonctions, dites fonctions utilisateurs afin de simplifier l'exécution de séries d'instructions répétitives.
Contrairement à de nombreux autres langages, PHP nécessite que l'on définisse une fonction avant que celle-ci puisse
être utilisée, car pour l'appeler dans le corps du programme il faut que l'interpréteur la connaisse, c'est-à-dire qu'il
connaisse son nom, ses arguments et les instructions qu'elle contient. La définition d'une fonction s'appelle
"déclaration" et peut se faire n'importe où dans le code. La déclaration d'une fonction se fait grâce au mot-clé
function, selon la syntaxe suivante:

function Nom_De_La_Fonction(type1 argument1, type2 argument2, ...) {

liste d'instructions

}
Remarques:
 le nom de la fonction suit les mêmes règles que les noms de variables:
o le nom doit commencer par une lettre
o un nom de fonction peut comporter des lettres, des chiffres et les caractères _ et & (les espaces ne sont pas
autorisés!)
o le nom de la fonction, comme celui des variables est sensible à la casse (différenciation entre les minuscules
et majuscules)
 Les arguments sont facultatifs, mais s'il n'y a pas d'arguments, les parenthèses doivent rester présentes
 Il ne faut pas oublier de refermer les accolades

13
Langage PHP
 Le nombre d'accolades ouvertes (fonction, boucles et autres structures) doit être égal au nombre
d'accolades fermées!

 La même chose s'applique pour les parenthèses, les crochets ou les guillemets!

Une fois cette étape franchie, votre fonction ne s'exécutera pas tant que l'on ne fait pas appel à elle quelque part
dans la page!

Appel de fonction
Pour exécuter une fonction, il suffit de faire appel à elle en écrivant son nom (une fois de plus en respectant la casse)
suivie d'une parenthèse ouverte (éventuellement des arguments) puis d'une parenthèse fermée:

Nom_De_La_Fonction();
Remarques:
 le point virgule signifie la fin d'une instruction et permet à l'interpréteur de distinguer les différents blocs
d'instructions
 si jamais vous avez défini des arguments dans la déclaration de la fonction, il faudra veiller à les inclure lors de
l'appel de la fonction (le même nombre d'arguments séparés par des virgules!)

 Nom_De_La_Fonction(argument1, argument2);

Renvoi d'une valeur par une fonction


La fonction peut renvoyer une valeur (et donc se terminer) grâce au mot-clé return. Lorsque l'instruction return est
rencontrée, la fonction évalue la valeur qui la suit, puis la renvoie au programme appelant (programme à partir
duquel la fonction a été appelée).
Une fonction peut contenir plusieurs instructions return, ce sera toutefois la première instruction return rencontrée qui
provoquera la fin de la fonction et le renvoi de la valeur qui la suit.
La syntaxe de l'instruction return est simple:

return valeur_ou_variable;

Les arguments d'une fonction


Il est possible de passer des arguments à une fonction, c'est-à-dire lui fournir une valeur ou le nom d'une variable
afin que la fonction puisse effectuer des opérations sur ces arguments ou bien grâce à ces arguments.
Le passage d'arguments à une fonction se fait au moyen d'une liste d'arguments (séparés par des virgules) entre
parenthèses suivant immédiatement le nom de la fonction. Les arguments peuvent être de simple variables, mais
aussi des tableaux ou des objets. A noter qu'il est possible de donner une valeur par défaut à ces arguments en
faisant suivre le nom de la variable par le signe "=" puis la valeur que l'on affecte par défaut à la vairable.
Lorsque vous voulez utiliser un argument dans le corps de la fonction en tant que variable, celui-ci doit être précédé
par le signe $.

<?
function dire_texte($qui, $texte = 'Bonjour')
{

if(empty($qui)){ // $qui est vide, on retourne faux


return false;
}else{
echo "$texte $qui"; // on affiche le texte
return true; // fonction exécutée avec succès
}

}
?>
Ainsi cette fonction peut être appelée de deux façons différentes:

<?

// Passage des deux paramètres


dire_texte("cher phpeur", "Bienvenue"); // affiche "Bienvenue cher phpeur"

// Utilisation de la valeur par défaut du deuxième paramètre


dire_texte("cher phpeur"); // affiche "Bonjour cher phpeur"

14
Langage PHP
?>

Travailler sur des variables dans les fonctions


Lorsque vous manipulerez des variables dans des fonctions, il vous arrivera de constater que vous avez beau modifier
la variable dans la fonction celle-ci retrouve sa valeur d'origine dès que l'on sort de la fonction...
Cela est du à la portée des variables, c'est-à-dire si elles ont été définies comme variables globales ou locales.
Il existe plusieurs niveaux de définition de variables :
 Une variable précédée du mot clé global sera visible dans l'ensemble du code, c'est-à-dire que sa portée ne sera
pas limitée à la fonction seulement. Ainsi, toutes les fonctions pourront utiliser et modifier cette même variable
 Le niveau static permet de définir une variable locale à la fonction, qui persiste durant tout le temps d'exécution du
script
 Par défaut, la variable possède le niveau local, c'est-à-dire que la variable ne sera modifié qu'à l'intérieur de la
fonction et retrouvera la valeur qu'elle avait juste avant l'appel de fonction à la sortie de celle-ci

<?

$chaine = "Nombre de camions : ";

function ajoute_camion($mode='')
{
global $chaine;
static $nb=0;

$nb++; // on incrémente le nombre de camions

if($mode == "affiche"){
echo $chaine.$nb; // on affiche le nombre de camions
}

ajoute_camion(); // nb == 1
ajoute_camion(); // nb == 2
ajoute_camion(); // nb == 3
ajoute_camion("affiche"); // affiche Nombre de camions : 4

?>

Passage de paramètre par référence


Une autre méthode pour modifier une variable consiste à la faire précéder du caractère &, précisant qu'il s'agit alors
d'un alias: la valeur de la variable est modifiée à la sortie de la fonction. On parle alors de passage par référence.
Dans ce cas on passe la référence (adresse mémoire) de la variable à la fonction, ce qui permet de modifier sa valeur.

<?
function dire_texte($qui, &$texte)
{
$texte = "Bienvenue $qui";
}

$chaine = "Bonjour ";


dire_texte("cher phpeur",$chaine);
echo $chaine; // affiche "Bienvenue cher phpeur"
?>

Retourner plusieurs variables


Lorsque vous souhaitez qu'une fonction retourne plusieurs valeurs, le plus simple est d'utiliser un tableau.

>?
function nom_fonction()
{
.....

return array( $variable1, $variable2, $variable3 );

15
Langage PHP
// on retourne les valeurs voulues dans un tableau
}
$retour = nom_fonction();
echo "$retour[0] - $retour[1] - $retour[2]";

?>

La récursivité
Les fonctions récursives sont des fonctions qui s'appellent elles-mêmes. Ce type de fonction se révèle indispensable
pour parcourir une arborescence par exemple.
Voici un exemple simple.

<?
function fonction_recursive($n=0)
{
$n++;
echo "$n <br>";
if($n < 10){ // si n est inférieur à 10 on continue
fonction_recursive($n);
}

}
fonction_recursive(); // affiche les nb de 1 à 10
?>
Les classes

La notion de classe

Php3 intègre un soupçon de caractéristiques empruntées aux langages orientés objet, c'est-à-dire la possibilité d'utiliser
des objets, entités regroupant des données et des fonctions au sein d'une structure et rendant la programmation plus
simple qu'en programmation habituelle (appelée programmation procédurale par opposition à la programmation orientée
objet).

On appelle classe la structure d'un objet, c'est-à-dire la déclaration de l'ensemble des entités qui composeront un
objet. Un objet est donc "issu" d'une classe, c'est le produit qui sort d'un moule. En réalité on dit qu'un objet est une
instanciation d'une classe, c'est la raison pour laquelle on pourra parler indifféramment d'objet ou d'instance
(éventuellement d'occurence).

Une classe est composée de deux parties:

 Les attributs (parfois appelés données membres): il s'agit des données représentant l'état de l'objet
 Les méthodes (parfois appelées fonctions membres): il s'agit des opérations applicables aux objets

déclaration d'une classe


Pour pouvoir manipuler des objets, il est essentiel de définir des classes, c'est-à-dire définir la structure d'un objet.
Avec Php, cette définition se fait de la manière suivante:

class Nom_de_la_classe {
// Déclarations des données membres
var $Donnee_Membre_1;
var $Donnee_Membre_2;
var $...
// Déclarations des données membres
function Nom_de_la_fonction_membre1(parametres) {
liste d'instructions;
}
};
Nom_de_la_classe représente bien évidemment le type d'objet désigné par la classe ou du moins le nom que vous
leur attribuez.

16
Langage PHP
Contrairement aux langages orientés objet comme le C++, Php n'inclue pas dans sa version 3 de niveaux de visibilité
des éléments de la classe, il n'y a donc pas de concept d'encapsulation, un des concepts majeurs de la
programmation orientée objet.

Contrairement à la déclaration de classes en C++, la déclaration de la classe ne se finit pas par un point-
virgule!

Instanciation de la classe
Après avoir déclaré une classe, il faut instancier des objets pour pouvoir l'exploiter. Cette opération se fait à l'aide du
mot clé new permettant de faire des objets découlant d'une classe. La syntaxe du mot clé new est la suivante:

$Nom_de_l_objet = new Nom_de_la_classe;


A partir du moment où l'objet est instancié, il possède des propriétés qui lui sont propres, cela signifie que si vous
instanciez un nouvel objet, la modification des propriétés de l'un n'influera aucunement sur celles de l'autre.
Il existe une méthode spéciale (portant le même nom que la classe) s'exécutant automatiquement lors de
l'instanciation de l'objet. Cette méthode, appelée constructeur est très utile pour initialiser les données membres
lors de l'instanciation.

Accéder aux propriétés d'un objet


L'accès aux propriétés d'un objet se fait grâce au nom de l'objet, suivi d'une flêche (->) représentée par un moins (-)
et un signe supérieur (>), puis du nom de la donnée membre (sans le signe $). Par exemple:

Nom_de_l_objet->Nom_de_la_donnee_membre = Valeur;

Accéder aux méthodes d'un objet


L'accès aux méthodes d'un objet se fait comme pour l'accès aux propriétés, c'est-à-dire par le nom de l'objet, suivi
d'une flêche et du nom de la méthode. La méthode est suivie de parenthèses, contenant les paramètres, si il y'en a.
L'accès à une méthode se fait donc de la façon suivante:

Nom_de_l_objet->Nom_de_la_donnee_fonction_membre(parametre1,parametre2,...);

La variable courante $this


Le mot clé $this permet de désigner l'objet dans lequel on se trouve, c'est-à-dire que lorsque l'on désire faire
référence dans une fonction membre à l'objet dans lequel elle se trouve, on utilise this.
Grâce à cette variable spéciale, il est possible dans une fonction membre de faire référence aux propriétés situées
dans le même l'objet que la fonction membre.
Ainsi, lorsque l'on désire accéder à une propriété d'un objet à partir d'une méthode du même objet, il suffit de faire
précéder le nom de la donnée membre par $this->. Par exemple:

class Toto{
var $age;
var $sexe;
var $adresse;

function DefineTotoAge($Age){
$this->age = Age;
}
}

Les limitations de l'utilisation de classes avec Php


PHP, dans sa version 3, reste assez limité du point de vue de la programmation objet. La plupart des aspects
marquants de la programmation objet ne sont pas présents dans le langage:
 l'encapsulation
 l'héritage
 le polymorphisme

Affichage de texte

17
Langage PHP
Le but de Php est de permettre la création de page web dynamiques, ainsi son but premier est de pouvoir
envoyer des données au navigateur.

Les trois fonctions standards

Php3 fournit 3 fonctions permettant d'envoyer du texte au navigateur. Ces fonctions ont la particularité de pouvoir
insérer dans les données envoyées des valeurs variables, pouvant être fonction d'un valeur récupérée par exemple,
c'est ce qui rend possible la création de pages dynamiques. Les 3 fonctions sont les suivantes:

 echo
 print
 printf

La fonction echo
La fonction echo permet d'envoyer au navigateur la chaîne de caractères (délimitée par des guillemets) qui la suit. La
syntaxe de cette fonction est la suivante:
echo Expression;
L'expression peut être une chaîne de caractères ou une expression que l'interpréteur évalue
echo "Chaine de caracteres";
echo (1+2)*87;
Ainsi, étant donné que la chaîne de caractères est délimitée par des guillemets, l'insertion de guillemets doubles
dans la chaîne provoquerait une erreur. C'est la raison pour laquelle les guillemets doubles, ainsi que tous les
caractères spéciaux, doivent être précédés d'un antislash. Voici un récapitulatif des caractères spéciaux
nécessitant l'ajout d'un antislash:
Caractère Description
\" guillemet
\$ caractère $
\\ barre oblique inverse (antislash)
\r retour chariot
\n retour à la ligne
\t tabulation
Le caractère $ a un rôle particulier dans la mesure où l'interpréteur le comprend comme une variable, ce qui signifie
que lorsque le caractère $ est rencontré dans la chaîne qui suit la fonction echo, l'interpréteur récupère le nom de la
variable qui suit le caractère $ et le remplace par sa valeur. Dans l'exemple suivant par exemple, on assigne la date
actuelle à une variable appelée $MaDate, puis on l'affiche sur le navigateur:

<HEAD>
<TITLE>Affichage de l'heure</TITLE>
<BODY>

<?php

// Récupération de la date
// et stockage dans une variable

$MaDate = date("Y");

echo "<HTML>";
echo "Nous sommes en $MaDate";

?>
</BODY>
<HTML>

La fonction print
La fonction print est similaire à la fonction echo à la différence près que l'expression à afficher est entre parenthèses.
La syntaxe de la fonction print est la suivante:

18
Langage PHP
print(expression);
L'expression peut, comme pour la fonction echo être une chaîne de caractères ou une expression que l'interpréteur
évalue:
print("Chaine de caracteres");
print ((1+2)*87);

La fonction printf
La fonction printf (empruntée au langage C) est rarement utilisée car sa syntaxe est plus lourde. Toutefois,
contrairement aux deux fonctions précédentes, elle permet un formatage des données, cela signifie que l'on peut
choisir le format dans lequel une variable sera affichée à l'écran.
La syntaxe de printf est la suivante:
printf (chaîne formattée);
Une chaîne formattée est une chaîne contenant des codes spéciaux permettant de repérer l'emplacement d'une valeur
à insérer et son format, c'est-à-dire sa représentation. A chaque code rencontré doit être associé une valeur ou une
variable, que l'on retrouve en paramètre à la fin de la fonction printf. Les valeurs à insérer dans la chaîne
formattées sont séparées par des virgules et doivent apparaître dans l'ordre où les codes apparaissent dans la
chaîne formattée Les codes de formatage des types de données sont les suivants:
Code Type de format
%b Entier en notation binaire
%c Caractère codé par son code ASCII
%d Entier en notation décimale
%e Type double (nombre à virgule) au format scientifique (1.76e+3)
%f Type double (nombre à virgule)
%o Entier en notation octale
%s Chaîne de caractères
%x Entier en notation hexadécimale (lettres en minuscules)
%X Entier en notation hexadécimale (lettres en majuscules)
%% Caractère %
Imaginons que l'on définisse une variable en virgule flottante, afin d'obtenir une précision de calcul plus grande
qu'avec un entier, mais qu'on désire l'afficher en tant qu'entier. Dans ce cas la fonction printf prend toute son
importance:
$Pi = 3.1415927;
$R = 24.546;
$Perimetre = 2 * $Pi * $R;
printf ("Le périmètre du cercle est %d",$Perimetre);

L'importance de l'implantation du code php au sein du code HTML


Le code Php peut être implanté au sein du code HTML. Cette caractéristique n'est pas à négliger car le fait d'écrire
uniquement du code Php là où il est nécessaire rend la programmation plus simple (il est plus simple d'écrire du code
HTML que des fonctions echo ou print, dans lesquelles les caractères spéciaux doivent être précédés d'un antislash
sous peine de voir des erreurs lors de l'exécution). L'exemple le plus simple concerne les pages dynamiques dont l'en-
tête est toujours le même: dans ce cas, le code Php peut ne commencer qu'à partir de la balise <BODY>, au moment
où la page peut s'afficher différemment selon une variable par exemple.
Mieux, il est possible d'écrire plusieurs portions de script en Php, séparées par du code HTML statique car les
variables/fonctions déclarées dans une portion de script seront accessibles dans les portions de scripts inférieures.
Pour plus d'informations PHP France
Var. d'environnement
Notion de variable d'environnement

Les variables d'environnement sont, comme leur nom l'indique, des données stockées dans des variables permettant
au programme d'avoir des informations sur son environnement. L'environnement, dans le cas du script PHP est:

 Le serveur
 Le client

Ces variables sont créées par le serveur à chaque fois que le script PHP est appelé, le serveur les lui fournit en
paramètres cachés lors de l'exécution de l'interpréteur.
Elles permettent notamment d'avoir des informations sur le type de serveur, son administrateur, la date à
laquelle le script a été appelé, l'adresse IP et le type de navigateur du client,...
19
Langage PHP

Les variables d'environnement


On peut donc classer les variables d'environnement en deux catégories:
 Les variables d'environnement dépendant du client
 Les variables d'environnement dépendant du serveur

Les variables d'environnement dépendant du client


Variable
Description
d'environnement
Il s'agit de la méthode d'authentification qui a été utilisée par le client pour accéder au
$AUTH_TYPE
script PHP
$COMSPEC Location de l'interpréteur de commandes sur la machine (Sous Windows)
Type de données contenu présent dans le corps de la requête. Il s'agit du type MIME des
$CONTENT_TYPE
données
$DOCUMENT_ROOT Racine des documents sur le serveur
$DOCUMENT_URI Adresse du script PHP en relatif (à partir de la racine du serveur)
$HTTP_ACCEPT Types MIME reconnus par le serveur (séparés par des virgules)
$HTTP_ACCEPT_ENCODING Types d'encodage que le serveur peut réaliser (gzip,deflate)
$HTTP_ACCEPT_LANGUAGE Langue utilisée par le serveur (par défaut en-us)
$HTTP_CONNECTION Type de connection ouverte entre le client et le serveur (par exemple Keep-Alive)
$HTTP_HOST Nom d'hôte de la machine du client (associée à l'adresse IP)
$HTTP_REFERER URL de la page qui a appelé le script PHP
Cette variable permet d'avoir des informations sur le type de navigateur utilisé par le
client, ainsi que son système d'exploitation. Voici quelques exemples de User-Agents:
$HTTP_USER_AGENT  Mozilla/4.0 (compatible; MSIE 5.01; Windows NT; TUCOWS Network)

 Mozilla/4.7 [en] (X11; I; Linux 2.2.14-15mdk i686)


$LAST_MODIFIED Date et heure de dernière modification du fichier
$PATH Il s'agit du chemin d'accès aux différents répertoires sur le serveur
Il s'agit du chemin d'accès au script PHP en relatif (de la racine du serveur jusqu'au script
$PATH_INFO
PHP)
$PHP_SELF Nom du script PHP
$REDIRECT_STATUS Il s'agit
$REDIRECT_URL Il s'agit
Il s'agit de la partie de l'URL (ayant servie à accéder au script PHP) située après le point
$QUERY_STRING d'interrogation. C'est de cette manière que sont transmises les données d'un formulaire
dans le cas de la méthode GET
$REMOTE_ADDR Cette variable contient l'adresse IP du client appelant le script CGI
REMOTE_PORT Cette variable permet de savoir le port sur lequel la requête HTTP a été envoyée au serveur
Chemin d'accès complet au script PHP
SCRIPT_FILENAME  Sous windows, il sera de la forme:
c:/php/php.exe
Chemin d'accès relatif (par rapport au chemin d'accès à la racine web
SCRIPT_NAME
($DOCUMENT_ROOT)) au script PHP

Les variables d'environnement dépendant du serveur


Variable d'environnement Description
$DATE_GMT Date actuelle au format GMT
$DATE_LOCAL Date actuelle au format local
$DOCUMENT_ROOT Racine des documents Web sur le serveur
$GATEWAY_INTERFACE Version des spécifications CGI utilisées par le serveur
$HTTP_HOST Nom de domaine du serveur
$SERVER_ADDR Adresse IP du serveur
$SERVER_ADMIN Adresse de l'administrateur du serveur
$SERVER_NAME Nom donné au serveur en local

20
Langage PHP
$SERVER_PORT Numéro de port associé au protocole HTTP sur le serveur
$SERVER_PROTOCOL Nom et version du protocole utilisé pour envoyer la requête au script PHP
Type (logiciel) du serveur web
 Pour un serveur Apache sous Unix:

$SERVER_SOFTWARE Apache/1.3.2 (Unix) PHP/3.0.5


 Pour un serveur Apache sous Windows:

Apache/1.3.2 (Unix) PHP/3.0.5

Affichage des variables d'environnement


Il est possible de créer un script permettant de visualiser l'ensemble des variables d'environnement.
La première façon consiste à utiliser la fonction phpinfo() qui affiche toute seule un tableau récapitulatif des
paramètres du serveur et de l'intepréteur PHP, ainsi qu'un tableau des variables d'environnement

<?
phpinfo();
?>
PHP fournit la fonction getenv() permettant de retourner la valeur de la variable d'environnement passée en
paramètre:

<?
echo getenv("HTTP_USER_AGENT");
?>
Enfin il est possible de définir des variables d'environnement:

<?
echo putenv("MA_VARIABLE=mavaleur");
?>
Les Fichiers

La gestion des fichiers avec PHP

Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de
fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier est repérée par
une variable, indiquant l'état du fichier et que l'on peut passer en paranètre aux fonctions spécialisées pour le
manipuler.

La fonction fopen()

La fonction de base est la fonction fopen(). C'est elle qui permet d'ouvrir un fichier, que ce soit pour le lire, le créer,
ou y écrire. Voilà sa syntaxe :

entier fopen(chaine nomdufichier, chaine mode);


Le mode indique le type d'opération qu'il sera possible d'effectuer sur le fichier après ouverture. Il s'agit d'une lettre
(en réalité une chaîne de caractères) indiquant l'opération possible:
 r (comme read) indique une ouverture en lecture seulement
 w (comme write) indique une ouverture en écriture seulement (la fonction crée le fichier s'il n'existe pas)
 a (comme append) indique une ouverture en éciture seulement avec ajout du contenu à la fin du fichier (la fonction
crée le fichier s'il n'existe pas)

Lorsque le mode est suivie du caractère + celui-ci peut être lu et écrit. Enfin, le fait de faire suivre le mode par la
lettre b entre crochets indique que le fichier est traité de façon binaire.
Voici un tableau récapitulant l'ensemble des modes de fichiers possibles:
Mode Description

r ouverture en lecture seulement

21
Langage PHP

w ouverture en écriture seulement (la fonction crée le fichier s'il n'existe pas)

ouverture en écriture seulement avec ajout du contenu à la fin du fichier (la fonction crée le fichier s'il n'existe
a
pas)

r+ ouverture en lecture et écriture

w+ ouverture en lecture et écriture (la fonction crée le fichier s'il n'existe pas)

ouverture en lecture et écriture avec ajout du contenu à la fin du fichier (la fonction crée le fichier s'il n'existe
a+
pas)

Voici des exemples d'utilisations possibles de cette fonction:

$fp = fopen("../fichier.txt","r"); //lecture


$fp = fopen("ftp://phpfrance.com/pub/fichier.txt","w"); //écriture depuis début du fichier
$fp = fopen("http://igalaxie.com/fichier.txt","a"); //écriture depuis fin du fichier
De plus, la fonction fopen permet d'ouvrir des fichiers présents sur le web grâce à leur URL. Voici un script permettant
de récupérer le contenu d'une page d'un site site web:

<?
$fp = fopen("http://www.commentcamarche.net","r"); //lecture du fichier
while (!feof($fp)) { //on parcoure toutes les lignes
$page .= fgets($fp, 4096); // lecture du contenu de la ligne
}
?>
Il est généralement utile de tester si l'ouverture de fichier s'est bien déroulée ainsi que d'éventuellement stopper le
script PHP si cela n'est pas le cas:

<?
if (!$fp = fopen("http://www.commentcamarche.net","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}

else {
// votre code;
}
?>

Un fichier ouvert avec la fonction fopen() doit être fermé, à la fin de son utilisation, par la fonction
fclose() en lui passant en paramètre l'entier retourné par la fonction fopen()

Lecture et écriture
Une fois que le fichier a été ouvert avec le mode désiré, il est possible de lire son contenu et d'y écrire des
informations grâce aux fonctions:
 fputs() (aussi parfois appelée fwrite(), les deux noms sont équivalents, on parle d'alias)permettant d'écrire une
chaîne de caractères dans le fichier

 booléen fputs(entier Etat_du_fichier, chaine Sortie);

La fonction fputs() renvoie 0 en cas d'échec, 1 dans le cas contraire

 fgets() permettant de récupérer une ligne du fichier



 châne fgets(entier Etat_du_fichier, entier Longueur);

22
Langage PHP
Le paramètre Longueur désigne le nombre de caractères maximum que la fonction est sensée récupérer sur la ligne.
La fonction fgets() renvoie 0 en cas d'échec, 1 dans le cas contraire

Etant donné que la fonction fgets() récupére à chaque appel une nouvelle ligne du fichier, il est essentiel, pour
récupérer l'intégralité du contenu d'un fichier de l'insérer dans une boucle while.
Ainsi, on utilise la fonction feof(), fonction testant si la fin du fichier n'a pas été atteinte, en tant que test de la boucle
while. De cette façon, tant que la fin du fichier n'a pas été atteinte, on lit la ligne suivante du fichier...

<?
if (!$fp = fopen("fichier.txt","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}

else {
while(!feof($fp)) {
$Ligne = fgets($fp,255); // On récupère une ligne
echo $Ligne; // On affiche la ligne
$Fichier .= $Ligne; // On stocke l'ensemble des lignes dans une variable
}
fclose($fp); // On ferme le fichier
}
?>
Pour stocker des infos dans le fichier, il faut dans un premier temps ouvrir le fichier en écriture en le créant si il
n'existe pas. On a donc le choix entre le mode 'w' et le mode 'a'. On préférera le second puisque le pointeur se trouve
en fin de fichier (autrement dit on écrit à la suite de ce qui se trouve dans le fichier au lieu d'écraser le contenu
existant éventuellement déjà).

<?
$fp = fopen("php_8_fichier.txt","a"); // ouverture du fichier en écriture
fputs($fp, "\n"); // on va a la ligne
fputs($fp, "$nom|$email"); // on écrit le nom et email dans le fichier
fclose($fp);
?>
Voici un petit script permettant de récupérer le titre d'une page Web (le texte compris entre les balises <TITLE> et
</TITLE>). Il utilise les expressions régulières pour localiser le texte.

<?
$fp = fopen("http://www.commentcamarche.net","r"); //lecture du fichier
while (!feof($fp)) { //on parcoure toutes les lignes
$page .= fgets($fp, 4096); // lecture du contenu de la ligne
}
$titre = eregi("<title>(.*)</title>",$page,$regs); //on isole le titre
echo $regs[1];
fclose($fp);
?>

Les tests de fichiers


PHP fournit de nombreuses fonctions permettant de faire des tests sur les fichiers pour connaître leurs propriétés.
Voici la liste des fonctions des test:
 is_dir() permet de savoir si le fichier dont le nom est passé en paramètre correpond à un répertoire

booléen is_dir(chaine Nom_du_fichier);

La fonction is_dir() renvoie 1 si il s'agit d'un répertoire, 0 dans le cas contraire

<?
if (!is_dir("install")) {
echo "Il ne s'agit pas d'un répertoire
";
}

else {

23
Langage PHP
echo "Il s'agit bien d'un répertoire
";
}
?>
 is_executable() permet de savoir si le fichier dont le nom est passé en paramètre est exécutable

booléen is_executable(chaine Nom_du_fichier);

La fonction is_executable() renvoie 1 si le fichier est exécutable, 0 dans le cas contraire

 is_file() permet de savoir si le fichier dont le nom est passé en paramètre ne correpond ni à un répertoire, ni à un
lien symbolique

booléen is_file(chaine Nom_du_fichier);

La fonction is_file() renvoie 1 si il s'agit d'un fichiere, 0 dans le cas contraire

 is_dir() permet de savoir si le fichier dont le nom est passé en paramètre correpond à un lien symbolique

booléen is_link(chaine Nom_du_fichier);

La fonction is_link() renvoie 1 si il s'agit d'un lien symbolique, 0 dans le cas contraire

D'autres façons de lire et écrire


Dans certains cas, il peut être rébarbatif de devoir mettre en oeuvre les fonctions fopen() et fgets pour lire
l'intégralité du contenu d'un fichier. Pour cette raison PHP fournit des fonctions supplémentaires permettant de faire
directement certaines opérations.
La fonction file() permet de retourner dans un tableau l'intégralité d'un fichier en mettant chacune de ces lignes dans
un élément du tableau (rappel: le premier élément d'un tableau est repéré par l'indice 0).
Voilà sa syntaxe :

Tableau file(chaine nomdufichier);


L'exemple suivante montre comment parcourir l'ensemble du tableau afin d'afficher le fichier.

<?
$Fichier = "fichier.txt";
if (is_file($Fichier)) {
if ($TabFich = file($Fichier)) {
for($i = 0; $i < count($TabFich); $i++)
echo $TabFich[$i];
}
else {
echo "Le fichier ne peut être lu...<br>";
}
}

else {
echo "Désolé le fichier n'est pas valide<br>";
}
?>
La fonction fpassthru() permet d'envoyer le contenu du fichier dans la fenêtre du navigateur. La syntaxe de cette
fonction est la suivante:
booléen fpassthru(entier etat);
Cette fonction permet en réalité d'envoyer le contenu du fichier à partir de la position courante dans le fichier, c'est-à-
dire qu'il est possible par exemple de lire quelques lignes avec fgets(), puis d'envoyer le reste au navigateur... Le
script suivant permet de parcourir tous les fichiers HTML contenus dans votre site à la recherche de MetaTags:

<
function ScanDir($Directory){
echo "<b>Processing</b>: $Directory<br>\n";

if (is_dir($Directory) && is_readable($Directory)) {

24
Langage PHP
if($MyDirectory = opendir($Directory)) {

while($Entry = readdir($MyDirectory)) {

if (is_dir($Directory."/".$Entry)) {
if (($Entry != ".") && ($Entry != "..")) {
echo "<b>Repertoire</b>: $Directory/$Entry<br>\n";
ScanDir($Directory."/".$Entry);
}
}

else {
echo "<b>Fichier</b>: $Directory/$Entry
\n";
if (eregi("(\.html)|(\.htm)",$Entry)){
$MetaTags = get_meta_tags($Directory."/".$Entry);
}
}
}

}
closedir($MyDirectory);
}
}
}

$open_basedir=\".\";
ScanDir(".");
?>

Récupération de données
Php rend très simple la récupération de données envoyées par l'intermédiaire de formulaires HTML.

Création d'un formulaire

Grâce à la balise FORM du langage HTML, il est très simple de créer des formulaires comprenant:

 des champs de saisie


 des cases à cocher
 des boutons radio
 des listes à choix multiples
 ...

Pour utiliser un tel formulaire capable d'envoyer des informations à un script Php3, il suffit de mettre le nom du fichier
Php3 qui réceptionnera les informations en tant que valeur de l'attribut ACTION de la balise FORM.
Voici ce à quoi peut ressembler un formulaire en HTML, permettant d'envoyer les coordonnées d'une personne à un
fichier Php3 nommé test.php3:

<FORM Method="GET" Action="test.php3">


Nom : <INPUT type=text size=20 name=nom><BR>
Prénom : <INPUT type=text size=20 name=prenom><BR>
Age : <INPUT type=text size=2 name=age><BR>
<INPUT type=submit value=Envoyer>
</FORM>
Le résultat de ce code est le suivant (le bouton Envoyer est volontairement désactivé):

25
Langage PHP
Nom :

Prénom :

Age :

Récupération et utilisation des données


Lorsque l'on soumet un formulaire à un fichier Php3, toutes les données du formulaires lui sont passées en tant que
variables, c'est-à-dire chacun des noms associés aux champs (ou boutons) du formulaires précédés du caractère $.
Ainsi, dans l'exemple précédent, le fichier test.php3 reçoit les variables:
 $nom
 $prenom
 $age

Si jamais un des champs du formulaire n'est pas rempli, il possède la valeur "", c'est-à-dire une chaîne vide...
Voici par exemple ce à quoi pourrait ressembler le fichier test.php3, dont le but est uniquement d'afficher les
informations saisies par l'utilisateur à l'écran, ainsi que de vérifier que tous les champs ont bien été correctement
rempli:

<HTML>
<HEAD>
<TITLE>Test.php3: Affichage des données utilisateur</TITLE>
</HEAD>

<BODY>

<?php

if (($nom=="")||($prenom=="")||($age=="")){

if($nom=="") print("Veuillez saisir le nom de l'utilisateur<BR>\n");


if($nom=="") print("Veuillez saisir le prénom de l'utilisateur<BR>\n");
if($nom=="") print("Veuillez saisir l'age de l'utilisateur<BR>\n");

else {
echo "Récapitulatif des informations saisies<BR>\n
<UL>
<LI>Nom: $nom</LI>
<LI>Prenom: $prenom</LI>
<LI>Age: $age</LI>
</UL>
";
}

?>

</BODY>
</HTML>

Base de données
Php permet un interfaçage très simple avec un grand nombre de bases de données. Lorsqu'une base de données n'est
pas directement supportée par Php, il est possible d'utiliser un driver ODBC, pilote standard pour communiquer avec
les bases de données.

La communication avec les bases de données se fait à l'aide de requêtes SQL, un langage de quatrième génération
reconnu par l'ensemble des SGBD.

26
Langage PHP
Dans les exemples ci-dessous, le système de gestion de bases de données utilisé est MySQL, un SGBD gratuit et
rapide fonctionnant (entre autres) sous Linux. Etant donné que la majorité des serveurs Web (dont le fameux
serveur Apache) fonctionnent sous Linux, MySQL est de ce fait le SGBD le plus utilisé avec Php.

La déclaration des variables

La première étape consiste à déclarer les variables qui vont permettre la connexion à la base de données (ce sont les
paramètres des fonctions de connexion à la base). Ces variables sont:

 $user : Le nom d'utilisateur


 $passwd : Le mot de passe
 $host : L'hôte (ordinateur sur lequel le SGBD est installé)
 $bdd : Le nom de la base de données

Rappel: Les variables ne sont pas visibles par vos visiteurs étant donné que le script (portant
l'extension .php3) est systématiquement interprété par le serveur Web

Ces variables sont en fait des paramètres de la fonction permettant la connexion à la base de données. Il est
donc possible de passer les valeurs de ces variables directement dans chaque fonction permettant la connexion,
mais cela devient vite gênant lors d'un changement de mot de passe par exemple. Le comble de l'élégance
voudrait que l'on stocke ces valeurs dans un fichier à part, afin de changer les valeurs dans tous les fichiers y
faisant référence en un seule fois.

Les fonctions de base


Php fournit un grand choix de fonctions permettant de manipuler les bases de données. Toutefois, parmi celles-ci
quatre fonctions sont essentielles:
 La fonction de connexion au serveur
 La fonction de choix de la base de données
 La fonction de requête
 La fonction de déconnexion

Avec le SGBD MySQL, ces fonctions sont les suivantes:


 mysql_connect
 mysql_select_db
 mysql_query
 mysql_close

Gestion des erreurs


Certaines de ces fonctions renvoient une valeur permettant de connaître l'état de la connexion, ainsi il est possible
d'interrompre le script afin d'éviter les erreurs en cascade. Deux méthodes permettent d'effectuer cette opération:
 Le stockage du résultat de l'exécution de la fonction dans une variable. Par exemple:

$connect = mysql_connect($host,$user,$password);
 L'utilisation de la fonction die() en cas d'erreur d'exécution. Si la fonction retourne la valeur 0 (c'est-à-dire s'il y a
une erreur) la fonction die() (traduisez meurt) renvoie un message d'erreur. Par exemple:

mysql_connect($host,$user,$password) or die("erreur de connexion au serveur $host");

Traitement des résultats


Lorsque l'on effectue une requête de sélection de tuples à l'aide de la fonction mysql_query, il est essentiel de stocker le
résultat de la requête (les enregistrements) dans une variable, que l'on nomme généralement $result.
Toutefois, cette variable contient l'ensemble des enregistrements et n'est donc pas exploitable telle quelle. Ainsi on
utilise la fonction mysql_fetch_row(), qui découpe les lignes de résultat en colonnes (par exemple Nom,adresse,...) et
les affecte à une variable tableau dans l'ordre où elles arrivent.
Ainsi, imaginons une table appelée liens contenant le nom et l'URL de sites internet. Il est possible de récupérer
l'ensemble des enregistrements et de les afficher dans un tableau:

27
Langage PHP

<html>
<head>
<title>Liens</title>
<head>

<body>

<table border="1" cellpadding="0" cellspacing="0">


<tr>
<th>Nom du site</th>
<th>URL</th>
</tr>

<?php
// Déclaration des paramètres de connexion
$host = la_machine;
// Généralement la machine est localhost
// c'est-a-dire la machine sur laquelle le script est hébergé

$user = votre_login;
$bdd = Nom_de_la_base_de_donnees;
$password = Mot_de_passe;

// Connexion au serveur
mysql_connect($host, $user,$password) or die("erreur de connexion au serveur");
mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");

// Creation et envoi de la requete


$query = "SELECT nom,url FROM sites ORDER BY nom";
$result = mysql_query($query);

// Recuperation des resultats


while($row = mysql_fetch_row($result)){
$Nom = $row[0];
$Url = $row[1];

echo "<tr>\n
<td><a href=\"$Url\">$Nom</a></td>\n
<td>$Url</td>\n
</tr>\n";

// Deconnexion de la base de donnees


mysql_close();
?>

</tr>
</table>
</body>
</html>

Dans l'exemple ci-dessus, les requête retourne les champs nom et url. La fonction mysql_fetch_row() analyse donc
chaque ligne de résultat de la requête et stocke les colonnes dans le tableau row[]. Ainsi, le champ nom sera stocké
dans row[0] et url dans row[1]. D'autre part, on inclue généralement mysql_fetch_row() dans une boucle while de
telle façon à ce que l'ensemble des lignes de résultat soient traitées. Lorsqu'il n'y a plus de ligne à traiter, la
boucle while se termine et l'interpréteur exécute la suite des instructions.

Détecter un résultat nul


Il peut être utile, avant d'insérer des données dans une table, de détecter la présence d'un enregistrement dans une
table, afin d'éviter de stocker des doublons. Cela peut se faire en effectuant une requête SQL avec un ordre SELECT et

28
Langage PHP
une clause WHERE permettant de vérifier la présence ou non d'enregistrements correspondant à la requête. La non
présence de résultat se traduit par un retour nul de la part de la fonction mysql_fetch_row(). Voici un exemple
affichant le résultat d'une requête le cas échéant, et dans le cas contraire une phrase exmpliquant qu'aucun
enregistrement correspondant n'a été trouvé (le code HTML dans lequel le code PHP doit être implanté a
volontairement été omis):

<?php
// Déclaration des paramètres de connexion
$host = la_machine;
// Généralement la machine est localhost
// c'est-a-dire la machine sur laquelle le script est hébergé

$user = votre_login;
$bdd = Nom_de_la_base_de_donnees;
$password = Mot_de_passe;

// Connexion au serveur
mysql_connect($host, $user,$password) or die("erreur de connexion au serveur");
mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");

// Creation et envoi de la requete


$query = "SELECT nom,url FROM sites ORDER BY nom";
$result = mysql_query($query);

// Recuperation des resultats

if (!mysql_fetch_row($result)) {
echo "Aucun enregitrement ne correspond\n";
}

else {
while($row = mysql_fetch_row($result)){
$Nom = $row[0];
$Url = $row[1];

echo "<tr>\n
<td><a href=\"$Url\">$Nom</a></td>\n
<td>$Url</td>\n
</tr>\n";
}
}

// Deconnexion de la base de donnees


mysql_close();
?>

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

Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de
caractères, c'est-à-dire permettant de trouver les portions de la chaîne correspondant au modèle. Ce système est
emprunté au système POSIX (un système d'exploitation). De nombreux scripts sous UNIX les utilisent (notamment
Perl).

En réalité il s'agit d'un système fort ingénieux (et aussi très puissant) permettant de retrouver un mot, ou une
phrase (et même beaucoup d'autres choses en réalité) dans un texte, ressemblant au modèle que l'on a
construit...

Construire une expression régulière

29
Langage PHP
Les expressions régulières permettent de rechercher des occurences (c'est-à-dire une suite de caractères
correspondant à ce que l'on recherche) grâce à une série de caractères spéciaux. L'expression réguliè en elle-même
est donc une chaîne de caractère contenant des caractères spéciaux et des caractères standards...

Les symboles ^ et $ indiquent le début ou la fin d'une chaine, et permettent donc de la délimiter.

"^debut": chaine qui commence par "debut"


"fin$": chaine qui se termine par "fin"
"^chaine$": chaine qui commence et se termine par "chaine"
"abc": chaine contenant la chaine "abc"
Les symboles *, + et ?, respectivement "zero ou plusieurs", "un ou plusieurs", "un ou aucun", permettent de donner
une notions de nombre.

"abc+": chaine qui contient "ab" suivie de un ou plusieurs "c" ("abc", "abcc" etc..)
"abc*": chaine qui contient "ab" suivie de zero ou plusieurs "c" ("ab", "abc" etc..)
"abc?": chaine qui contient "ab" suivie de zero ou un "c" ("ab" ou "abc")
"^abc+": chaine qui commence par "ab" suivie de un ou plusieurs "c" ("abc", "abcc" etc..)
Les accolades {X,Y} permettent de donner des limites de nombre.

"abc{2}": chaine qui contient "ab" suivie de deux "c" ("abcc")


"abc{2,}": chaine qui contient "ab" suivie de deux "c" ou plus ("abcc" etc..)
"abc{2,4}": chaine qui contient "ab" suivie 2, 3 ou 4 "c" ("abcc" .. "abcccc")
A noter que le premier nombre de la limite ("{0,2}", mais pas "{,2}") est obligatoire. Les symboles vu précedemment
('*', '+', and '?') sont équivalents à "{0,}", "{1,}", et "{0,1}".
Les parenthèses ( ) permettent de représenter une séquence de caractères.

"a(bc)*": chaine qui contient "a" suivie de zero "bc" ou plus


La barre verticale | se comporte en tant qu'opérateur OU

"un|le": chaine qui contient "un" ou "le"


"(un|le) chien": chaine qui contient "un chien" ou "le chien"
"(a|b)*": chaine qui contient une suite de "a" ou de "b"
Le point . indique n'importe quel caractère (une fois)

"^.{3}$": chaine qui contient 3 caractères


Les crochets [ ] définissent une liste de caractères autorisés (ou interdits). Le signe - permet quand à lui de définir un
intervalle. Le caractère ^ après le premier crochet indique quand à lui une interdiction.

"[abc]": chaine qui contient un "a", un "b", ou un "c"


"[a-z]": chaine qui contient un caractère compris entre "a" et "z"
"[^a-zA-Z]": chaine qui ne commence pas par une lettre
 Pour rechercher un caractère faisant partie des caractères spéciaux, il suffit de le faire précéder
d'un antislash (sauf entre crochets)

 un antislash doit donc être doublé!


En effet dans les crochets, chaque caractère représente ce qu'il est. Pour représenter un ] il faut le mettre en premier
(ou après un ^ si c'est une interdiction), un - se met en premier ou en dernier.

"[\+?{}.]": chaine qui contient un de ces six caractères


"[]-]": chaine qui contient le caractère "]" ou le caractère "-"
Voici un tableau récapitulatif des caractères spéciaux utilisés dans les expressions régulières:
Caractère Utilité
[] Les crochets définissent une liste de caractères autorisés
() Les parenthèse définissent un élément composé de l'expression régulière qu'elle contient
Les accolades lorsqu'elles contiennent un ou plusieurs chiffres séaprés par des virgules représente le
{} nombre de fois que l'élément précédant les accolades peut se reproduire (par exemple p{2,5} correspond
à ppp, pppp ou ppppp
Un moins entre deux caractères dans une liste représente un intervalle (par exemple [a-d] représente
-
[abcd])
. Le caractère point représente un caractère unique
* Le caractère astérisque indique la répétition indéterminée de l'élément la précédant
? Le caractère "point d'interrogation indique la présence éventuelle de l'élément la précédant

30
Langage PHP
| Occurence de l'élément situé à gauche de cet opérateur ou de celui situé à droite (lard|cochon)
 Placé en début d'expression il signifie "chaîne commençant par .. "
^
 Utilisé à l'intérieur d'une liste il signifie "ne contenant pas les caractères suivants...
$ Placé en fin d'expression il signifie "chaîne finissant par .. "

Les classes de caractères


Il peut également être utile de vérifier si une chaîne contient des caractères d'un certain type (numérique,
alphanumérique, ...) sans avoir à les énumérer. Pour cela les expressions régulières définissent des classes de
caractères, dont la syntaxe est:

[:classe:]
Les classes de caractères sont celles définies par UNIX. Voici un tableau récapitulant certaines de ces classes:
Nom de la classe Description
[:alnum:] caractères alphanumériques (équivalent à [A-Za-z0-9])
[:alpha:] caractères alphabétiques ([A-Za-z])
[:blank:] caractères blanc (espace, tabulation)
[:ctrl:] caractères de contrôe (les premiers du code ASCII
[:digit:] chiffre ([0-9])
[:graph:] caractère d'imprimerie (qui fait une marque sur l'écran en quelque sorte)
[:print:] caractère imprimable (qui passe à l'imprimante ... tout sauf les caractères de contrôle)
[:punct:] caractère de ponctuation
[:space:] caractère d'espacement
[:upper:] caractère majuscule
[:xdigit:] caractère hexadécimal
Voici quelques exemples d'utilisation des classes de caractère dans une expression régulière :
chaine composée d'un ou plusieurs caractère(s) alphanumerique(s)
"^[:alnum:]+$"
chaine contenant un caractère de ponctuation ou un caractère d'espacement
"[:punct:]|[:space:]"
Un nombre
"^[:digit:]+$"

Les fonctions de manipulation d'expressions régulières


PHP fournit quelques fonctions de bases permettant de manipuler des chaînes à l'aide d'expressions régulières.

Les fonctions ereg() et eregi()


La fonction ereg() dont le prototype est le suivant:
Booleen ereg(chaine modele,chaine texte[,tableau occurences])
permet d'évaluer le texte passer en argument grâce au modèle (qui est une expression régulière) et stocke toutes les
occurences dans un tableau passé optionnellement en paramètre. Lorsque la fonction trouve des occurences, elle
renvoie true, sinon elle retourne false.
La fonction eregi() dont le prototype est le suivant:
Booleen eregi(chaine modele,chaine texte[,tableau occurences])
effectue le même travail que sa consoeur ereg(), à la différence près qu'elle n'est pas sensible à la casse (pas de
différenciation minuscules/majuscules)

<?
$fp = fopen("http://www.commentcamarche.net","r"); //lecture du fichier
while (!feof($fp)) { //on parcoure toutes les lignes
$page .= fgets($fp, 4096); // lecture du contenu de la ligne
}
$titre = eregi("<title>(.*)</title>",$page,$regs); //on isole le titre
/* Le titre commence par <title>,
puis contient n'importe quelle chaine,
et se termine par </title> */
echo $regs[1]; // on retourne la premiere occurence trouvée
// Les occurences se trouvent entre parenthèses

31
Langage PHP
// $regs[0] renvoie toute la chaine
fclose($fp);
?>

Les fonctions ereg_replace() et eregi_replace()


La fonction ereg_replace() dont le prototype est le suivant:
chaine ereg_replace(chaine modele,chaine remplacement,chaine texte)
Permet de retourner la chaine texte passée en arguments avec les occurences trouvees remplacées par la chaine de
remplacement.
Pour utiliser les occurences correspondant au modele dans la chaine de remplacement, il suffit d'utiliser des
parenthèses dans la chaine modele, puis de faire référence à ces éléments dans la chaine de remplacement en
utilisant deux signes antislash suivi d'un numéro identifiant l'élément entre 0 et 9 (les numéros sont donnés par ordre
d'imbriquement, puis de gauche à droite, le zéro représente la chaine entière).
Le code suivant remplace Toto par <b>Toti Toto</b>... inutile mais formateur.

$Texte = "Bienvenue a Toto dans le mondes des expressions régulières";


$Texte = ereg_replace("To(to)","<b>\\1ti \\0</b>",$texte);

Le code suivant (utilisation avancée des expressions régulières) remplace un URL par un hypertexte HTML (il remplace
toute suite de caractères de ponctuations et alphanum&eacuyte;riques commençant par http://, ou ftp:// par le
même texte (sans le http://) entre balises HTML hypertexte...):

$Texte = "Bienvenue sur http://www.commentcamarche.net cher ami";


$Texte = ereg_replace("((http://)([[:punct:]]|[[:alnum:]])*)","<a href=\"\\0\">\\2</a>",$corps);

La fonction eregi_replace() dont le prototype est le suivant:


chaine eregi_replace(chaine modele,chaine remplacement,chaine texte)
effectue le même travail que sa consoeur ereg_replace(), à la différence près qu'elle n'est pas sensible à la casse
(pas de différenciation minuscules/majuscules).

La fonction split()
La fonction split() possède la syntaxe suivante:

tableau split (chaîne expression, chaîne texte [, entier limite])


La fonction split() retourne un tableau à partir d'une chaine et d'une expression régulière. La limite, optionnelle
permet de limiter la taille du tableau retourné. Dans ce cas le dernier élément du tableau contient le reste de la
chaine. Si une erreur se produit, split retourne 0.

<?
// découpe une phrase en un tableau de mots
// on utilise split au cas ou plusieurs espaces séparent les mots
$phrase = "Ceci est une phrase avec trois espaces ici";
$tableau_mots = split(" +",trim($phrase)); // un espace ou plus
?>

La fonction sql_regcase()
La fonction sql_regcase() possède la syntaxe suivante:

chaine sql_regcase (chaine texte)


Elle retourne une expression régulière qui représente la chaine passée en paramètre sans tenir compte de la case.
Chaque caractère de la chaine est representé entre crochets, avec deux caractères à l'intérieur un en majuscule et
l'autre en minuscule, ou le cas échéant deux fois le même caractères. Aucune explication ne vaut un bon exemple ;)

<?
echo sql_regcase("un test");
// affiche [Uu][Nn][ ][Tt][Ee][Ss][Tt]
?>
Cette fonction permet de générer une chaine non sensible à la casse, pour les expressions régulières dans les bases
de données par exemple. Dans MySQL lorsque vous utilisez la fonction REGEXP (au lieu de LIKE) la recherche est
sensible à la casse. La solution est donc de générer une chaine non sensible à la casse à l'aide de sql_regcase.

<?
$motclef = sql_regcase("motclef");
$sql = "SELECT * from table WHERE champ REGEXP "[[:<:]]$motclef[[:>:]]";
// selectionne tous les enregistrements de la table table, contenant le MOT motclef

32
Langage PHP
?>

Générations des images

Prérequis

PHP permet de créer des images au format GIF à l'aide d'une librairie de fonctions prévue à cet effet. La librairie
permettant de créer et manipuler des fichiers graphiques se nomme GD, ainsi, pour pouvoir utiliser ces fonctions il
faut que PHP soit installé avec l'extension GD, c'est-à-dire passer le paramètre --with-gd.

La librairie de fonctions GD permet de créer assez facilement des fichiers au format GIF, en fonction par
exemple de données stockées dans un SGBD (Système de gestion de bases de données). Il faut tout de même
savoir que ce genre de procédé met à rude épreuve le processeur, il faut donc utiliser ces fonctions à bon escient
(par exemple pour des diagrammes statistiques à barre, des graphiques sectoriels, ...).

Comment utiliser ces fonctions

Les fonctions de la librairies GD permettent de retourner une image, c'est-à-dire un fichier GIF. Ainsi un tel fichier ne
peut envoyer du texte au navigateur, il doit obligatoirement être appelé à partir d'une page HTML (généralement
avec une balise <IMG src="mon_fichier.php3">).

D'autre part, pour que le navigateur sache qu'il s'agit d'un fichier de type GIF, la premiere chose à faire (avant
d'envoyer n'importe quelle autre information au navigateur) est d'envoyer un en-tête HTTP indiquant le type MIME du
fichier, c'est-à-dire:

headers("Content-Type: image/gif");
La principale fonction de la librairie est imagegif() elle permet de retourner au navigateur l'image créée avec les
autres fonctions, en passant en paramètres un entier identifiant l'image. Si jamais le nom du fichier est passé en
second argument, le fichier est écrit sur le disque.

booléen imagegif(entier image, chaîne NomDuFichier);

 La fonction imagegif() ne fonctionne pas avec PHP4

 Notez que vous pouvez utiliser imagepng() et imagejpg()!

La fonction imagecreate() permet de créer un identifiant pour une image vierge possèdant les dimensions indiquées
en paramètres.

entier imagecreate(entier largeur,entier hauteur);


La fonction imagecreatefromgif() permet de créer un identifiant pour l'image créée à partir d'une image GIF
existant sur le disque, en passant en paramètre le nom du fichier.

entier createimagefromgif(chaîne NomDuFichier);


Enfin la fonction imagedestroy() permet de vider la mémoire allouée à l'image dont on a passé l'identifiant en
paramètre.

booléen imagedestroy(entier image);


Voilà donc un script minimal (et inutile) créant une image PHP à partir d'une image présente sur le disque:

<?php
headers("Content-Type: image/gif");
$image = imagecreatefromgif("toto.gif");
imagegif($image);
?>

L'allocation de couleur
La majeure partie des fonctions de la librairie GD permettent de créer une image,

33
Langage PHP
 en dessinant des formes (trait, rectangle, cercle, ...)
 en allouant des couleurs à l'image
 en dessinant des chaînes de caractères
 ...

La plupart des fonctions graphiques nécessitent le passage en paramètre d'une couleur. Ainsi, PHP fournit des
fonctions permettant d'allouer une couleur à une image en spécifiant les composantes RGB (Red, Green, Blue soient
Rouge, Vert et Bleu) de la couleur.
La fonction imagecolorallocate() alloue une couleur à une image en spécifiant ses composantes RGB sous forme
entière (0 à 255 pour chaque composante), ou hexadécimale (0x00 à 0xFF pour chaque composante).

entier imagecolorallocate(entier image, entier rouge,entier vert, entier bleu);


Voici quelques exemples d'allocation de couleurs avec cette fonction (avec les composantes en hexadécimal ou en
entier):

$noir = imagecolorallocate($image,0,0,0);
$rouge = imagecolorallocate($image,255,0,0);
$vert = imagecolorallocate($image,0,0xFF,0);

La création de formes
La librairie GD fournit un panel de fonctions permettant de créer des formes primaires telles que:
 des rectangles
 des ellipses (donc des cercles)
 des arcs
 des lignes

Généralement ces fonctions admettent en premier paramètre l'identifiant de l'image dans laquelle la forme doit
être créée, puis les coordonnées permettant de générer la forme, et enfin la couleur de l'élément. Elles
retournent 1 si l'élément a pu être dessiné, 0 dans le cas contraire
Voici un tableau présentant les fonctions de génération de forme:
Fonction Description
Crée un arc de centre (x,y) dont la largeur et la hauteur sont en
imagearc(entier image,entier x,entier y,entier
pixels. Début et fin représentent les angles de début et de fin (le
largeur,entier hauteur,entier début,entier fin,entier
degré 0 est à trois heures) en tournant dans le sens des
couleur)
aiguilles d'un montre
imagedashedline(entier image,entier xdebut,entier Trace un trait pointillé entre les points (xdebut,ydebut) et
ydebut,entier xfin,entier yfin,entier couleur) (xfin,yfin) de la couleur spécifiée
Crée un polygone de la couleur spécifiée, dont les points sont
imagefilledpolygon(entier image,tableau
stockes dans un tableau de valeurs (x,y). Le nombre de points
coordonnees,entier nonbre,entier couleur)
du tableau à utiliser est spécifié en paramètre nombre
imagefilledrectangle(entier image,entier Crée un rectangle rempli avec la couleur spécifiée, et dont les
xgauchehaut,entier ygauchehaut,entier coins supérieur gauche et inférieur droit sont spécifiés en
xdroitebas,entier ydroitebas,entier couleur) argument
imageline(entier image,entier xdebut,entier Trace un trait entre les points (xdebut,ydebut) et (xfin,yfin) de
ydebut,entier xfin,entier yfin,entier couleur) la couleur spécifiée
Crée un polygone non rempli dont le contour est de la couleur
imagepolygon(entier image,tableau spécifiée, dont les points sont stockes dans un tableau de
coordonnees,entier nonbre,entier couleur) valeurs (x,y). Le nombre de points du tableau à utiliser est
spécifié en paramètre nombre
imagerectangle(entier image,entier Crée un rectangle nom rempli dont le contour est de la couleur
xgauchehaut,entier ygauchehaut,entier spécifiée, et dont les coins supérieur gauche et inférieur droit
xdroitebas,entier ydroitebas,entier couleur) sont spécifiés en argument
Voici un exemple montrant comment créer des formes simples avec PHP:

<?php
$image = imagecreate(160,100);
$fond = imagecolorallocate($image,0xEF,0xF2,0xFB);
$noir = imagecolorallocate($image,0,0,0);
imagefill($image,0,0,$fond);
imagefilledpolygon($image,array(80,15,45,85,125,85),3,$noir);
header("Content-Type: image/gif");
imagegif($image);

34
Langage PHP
?>
Deux fonctions supplémentaires vous permettront de remplir une zone avec une couleur:
Fonction Description
Remplit une zone d'une même couleur par la couleur spécifiée en
imagefill(entier image,entier x,entier y,entier
argument, en commençant le remplissage à partir du point indiqué en
couleur)
paramètre
Remplit une zone délimitée par une bordure d'une couleur, par la
imagetoborder(entier image,entier x,entier
couleur spécifiée en argument, en commençant le remplissage à partir
y,entier couleurbordure,entier couleur)
du point indiqué en paramètre

Les chaînes de caractères


PHP permet d'autre part de dessiner des chaînes de caractères dans une image grâce à une grande variété de
fonctions dédiées. Cela autorise ainsi la création de légendes ou de boutons dynamiques, en fonction du texte passé
en paramètre, stocké dans un fichier, ou bien dans une base de données.
La principale fonction permettant de créer des chaînes de caractères dans l'image est imagestring() :

booléen imagestring(entier image,entier police,entier x,entier y,chaine texte,entier couleur);


Cette fonction permet de créer une chaîne de caractères contenant le texte passé en argument à la position spécifiée
par les arguments (x,y) avec la police indiquée.
En réalité PHP propose 5 polices par défaut numérotées de 0 à 5, mais il est possible de spécifier une police
p[ersonnalisée grâce à la fonction imageloadfont() :

Entier imageloadfont(chaîne Nom_du_Fichier);


Le format du fichier de police passé en paramètre peut varier selon le système sur lequel PHP fonctionne...
Enfin, les fonctions imagefontwidth() et imagefontheight() renvoient la largeur et la hauteur de la police passée
en unique paramètre. Ainsi, il est facile de connaître le nombre de pixels que va occuper la chaîne entière:

$largeur = imagefontwidth($police) * strlen($text);


$hauteur = imagefontheight($police);
Voici un tableau présentant les fonctions de création de chaînes de caractères graphiques:
Fonction Description
Crée un caractère à l'emplacement (x,y) (position de l'angle supérieur gauche
booléen imagechar(entier image,entier
du caractère). La police du caractère peut-être choisie parmi les polices par
police,entier x,entier y,chaîne
défaut (1 à 5) ou bien une police personnalisé que vous avez ouvert
caractere,entier couleur)
précédemment avec imageloadfont()
Crée un caractère orienté à l'horizontale (rotation de 90°) à l'emplacement
booléen imagecharup(entier
(x,y) (position de l'angle supérieur gauche du caractère). La police du
image,entier police,entier x,entier
caractère peut-être choisie parmi les polices par défaut (1 à 5) ou bien une
y,chaîne caractere,entier couleur)
police personnalisé que vous avez ouvert précédemment avec imageloadfont()
entier imagefontheight(entier police) retourne la hauteur de la police utilisée
entier imagefontwidth(entier police) retourne la largeur de la police utilisée
entier imageloadfont(chaîne Charge la police dont le nom est passé en argument et retourne son
nom_du_fichier) identifiant
Crée une chaîne de caractères à l'emplacement (x,y) (position de l'angle
booléen imagestring(entier
supérieur gauche de la chaîne de caractère). La police du caractère peut-être
image,entier police,entier x,entier
choisie parmi les polices par défaut (1 à 5) ou bien une police personnalisé
y,chaîne texte,entier couleur)
que vous avez ouvert précédemment avec imageloadfont()
Crée une chaîne de caractères orientée verticalement (rotation de 90°) à
booléen imagestringup(entier l'emplacement (x,y) (position de l'angle supérieur gauche de la chaîne de
image,entier police,entier x,entier caractère). La police du caractère peut-être choisie parmi les polices par
y,chaîne texte,entier couleur) défaut (1 à 5) ou bien une police personnalisé que vous avez ouvert
précédemment avec imageloadfont()

Un diagramme des navigateurs de vos visiteurs


Le script suivant est fourni par le webmaster de C'est quoi Linux. Il vous permet de créer une image contenant un
diagramme circulaire des navigateurs de vos visiteurs, sachant que ceux-ci sont stockés dans une table appelée
visiteurs dans un champ nommé navigateur.
Pour stocker ces valeurs, il suffit de créer cette table sur votre site, puis de stocker la valeur à l'aide de la requête
suivante:
INSERT INTO visiteurs values("$HTTP_USER_AGENT")
Voici le code PHP:

<?

35
Langage PHP
header("Content-type: image/gif");

$host="votre.base.de.donnees";
$user="votre.login";
$pass="votre.mot.de.passe";
$bdd="nom_de_la_base";

mysql_connect($host,$user,$pass);
mysql_select_db($bdd);
$query="SELECT navigateur FROM visiteurs";
$result=mysql_query($query);

$netscape3=0;
$netscape4=0;
$ie3=0;
$ie4=0;
$ie5=0;
$autre=0;

while($row=mysql_fetch_row($result))
{
$total++;

if(ereg("3(\.)([0-9]+) (\[)([a-z]+)(\])(.*)$",$row[0]))
{
$netscape3++;
}
if(ereg("4(\.)([0-9]+) (\[)([a-z]+)(\])(.*)$",$row[0]))
{
$netscape4++;
}
if(ereg("MSIE(\_?)( ?)3",$row[0]) )
{
$ie3++;
}
if(ereg("MSIE(\_?)( ?)4",$row[0]) )
{
$ie4++;
}
if(ereg("MSIE(\_?)( ?)5",$row[0]) )
{
$ie5++;
}
if( (!ereg("3(\.)([0-9]+) (\[)([a-z]+)(\])(.*)$",$row[0]))
&&(!ereg("4(\.)([0-9]+) (\[)([a-z]+)(\])(.*)$",$row[0]))
&&(!ereg("MSIE(\_?)( ?)3",$row[0]) )
&&(!ereg("MSIE(\_?)( ?)4",$row[0]) )
&&(!ereg("MSIE(\_?)( ?)5",$row[0]) ))
{
$autre++;
}
}

mysql_close();

function compare($navig,$nbre)
{
if($navig==$netscape3) { $navig++; }
if($nbre!=1)
{
if($navig==$netscape4) { $navig++; }
}
if($nbre>2)

36
Langage PHP
{
if($navig==$ie3) { $navig++; }
}
if($nbre>3)
{
if($navig==$ie4) { $navig++; }
}
if($nbre>4)
{
if($navig==$ie5) { $navig++; }
}
return($navig);
}
$netscape3=$netscape3*10;
$netscape4=$netscape4*10;
$ie3=$ie3*10;
$ie4=$ie4*10;
$ie5=$ie5*10;
$autre=$autre*10;

$netscape4=compare($netscape4,1);
$ie3=compare($ie3,2);
$ie4=compare($ie4,3);
$ie5=compare($ie5,4);
$autre=compare($autre,5);

function radians($degrees)
{
return($degrees * (pi()/180.0));
}

function circle_point($degrees, $diameter)


{
$x = cos(radians($degrees)) * ($diameter/2);
$y = sin(radians($degrees)) * ($diameter/2);

return(array($x,$y));
}

$ChartDiameter = 130;
$ChartFont = 2;
$ChartFontHeight = imagefontheight($ChartFont);
$ChartFontWidth = imagefontwidth($ChartFont);
$ChartData = array($netscape3,$netscape4,$ie3,$ie4,$ie5,$autre);
$ChartData2 = array($netscape3=>"Netscape 3",
$netscape4=>"Netscape 4",
$ie3=>"Internet Exploreur 3",
$ie4=>"Internet Exploreur 4",
$ie5=>"Internet Exploreur 5",
$autre=>"Autres Navigateurs");

$ChartWidth = $ChartDiameter + 20 + ($ChartFontWidth * 40);


$ChartHeight = $ChartDiameter + 20;

rsort($ChartData);
arsort($ChartData2);

$ChartCenterX = $ChartDiameter/2 + 10;


$ChartCenterY = $ChartDiameter/2 + 10;

$image = imagecreate($ChartWidth, $ChartHeight);

$colorBody = imagecolorallocate($image,0xEF,0xF2,0xFB);

37
Langage PHP
$colorBorder = imagecolorallocate($image,0x00,0x00,0x00);
$colorText = imagecolorallocate($image,0x00,0x00,0x00);

$colorSlice[]= imagecolorallocate($image,0x76,0x89,0xFF);
$colorSlice[]= imagecolorallocate($image,0x96,0xA6,0xFF);
$colorSlice[]= imagecolorallocate($image,0xA6,0xB9,0xFF);
$colorSlice[]= imagecolorallocate($image,0xB6,0xC9,0xFF);
$colorSlice[]= imagecolorallocate($image,0xC6,0xD9,0xFF);
$colorSlice[]= imagecolorallocate($image,0xD6,0xE9,0xFF);

imagefill($image,0,0,$colorBody);

$Degrees = 0;
for($index=0; $index < count($ChartData); $index++)
{
$ChartDataReel=(int)($ChartData[$index]/10);
if( $ChartDataReel !=0)
{
$StartDegrees = round($Degrees);
$Degrees+= (($ChartDataReel/$total)*360);
$EndDegrees = round($Degrees);

$CurrentColor = $colorSlice[$index%(count($colorSlice))];

imagearc($image, $ChartCenterX, $ChartCenterY, $ChartDiameter,


$ChartDiameter, $StartDegrees, $EndDegrees, $CurrentColor);

list($ArcX, $ArcY) = circle_point($StartDegrees, $ChartDiameter);


imageline($image, $ChartCenterX, $ChartCenterY,
floor($ChartCenterX + $ArcX),
floor($ChartCenterY + $ArcY), $CurrentColor);

list($ArcX, $ArcY) = circle_point($EndDegrees, $ChartDiameter);


imageline($image, $ChartCenterX, $ChartCenterY,
floor($ChartCenterX + $ArcX),
floor($ChartCenterY + $ArcY), $CurrentColor);

$MidPoint = round((($EndDegrees - $StartDegrees)/2) + $StartDegrees);


list($ArcX, $ArcY) = circle_point($MidPoint, $ChartDiameter/2);
imagefilltoborder($image, floor($ChartCenterX + $ArcX),
floor($ChartCenterY + $ArcY), $CurrentColor, $CurrentColor);
}
}

imagearc($image, $ChartCenterX, $ChartCenterY, $ChartDiameter,


$ChartDiameter, 0, 360, $colorBorder);

for($index=0; $index < count($ChartData); $index++)


{
$CurrentColor = $colorSlice[$index%(count($colorSlice))];
$LineX = $ChartDiameter + 20;
$LineY = 30 + ($index*($ChartFontHeight + 2));
imagerectangle($image, $LineX, $LineY, $LineX +
$ChartFontHeight, $LineY + $ChartFontHeight, $colorBorder);

imagefilltoborder($image, $LineX + 2,
$LineY + 2, $colorBorder, $CurrentColor);

$valeur=(int)($ChartData[$index]/10);
$valeur2=$ChartData[$index];
$pourcentage=round(($valeur/$total)*100);
imagestring($image, $ChartFont, $LineX + 5 + $ChartFontHeight,
$LineY, "$ChartData2[$valeur2]", $colorText);
imagestring($image, $ChartFont, $LineX + 5 + $ChartFontHeight+
23*$ChartFontWidth, $LineY, "$valeur", $colorText);

38
Langage PHP
imagestring($image, $ChartFont, $LineX + 5 + $ChartFontHeight+
31*$ChartFontWidth, $LineY, "$pourcentage %", $colorText);
}

imagegif($image);

?>
Cookies / En-têtes HTTP

Les en-têtes HTTP

Lors de chaque échange par le protocole HTTP entre votre navigateur et le serveur, des données dîtes d' en-têtes
contenant desinformations sur les données à envoyer (dans le cas d'une requête) ou envoyées (dans le cas d'une
réponse). Les informations en question, généralement sur une page web ou une image, suivent ces en-têtes. Les en-
têtes HTTP permettent aussi d'effectuer des actions sur le navigateur comme le transfert de cookies ou bien une
redirection vers une autre page.

Ces en-têtes sont les premières informations envoyées au navigateur (pour une réponse) ou au serveur (dans le cas
d'une requête), elles se présentent sous la forme:

en-tête : valeur
PHP fournit une fonction permettant d'envoyer très simplement des en-têtes HTTP manuellement du serveur au
navigateur (il s'agit alors d'une réponse HTTP. La syntaxe de cette fonction est la suivante:

booléen header(chaîne en-tête HTTP)

Etant donnée que les en-têtes HTTP sont les premières informations envoyées, la fonction header() doit
être utilisée avant tout envoi de données HTML au navigateur (le script qui la contient doit donc être
placé avant la balise <HTML> et avant toute fonction echo(),print ou printf())

Voici quelques utilisations possibles de la fonction header():


 pour rediriger le navigateur vers une nouvelle page:

 <?
 header("location : http://www.commentcamarche.net/");
 ?>
 Pour envoyer au navigateur une image créé à la volée (pour faire un compteur de statistiques ou bien un histogramme
dynamique par exemple) :

 <?
 header("Content-Type : image/gif");
 // code générant l'image
 imagegif($image); // envoi de l'image au navigateur
 ?>

Récupérer les en-têtes de la requête


Alors que la fonction header() permet d'envoyer des en-têtes HTTP au navigateur, PHP fournit une seconde fonction
permettant de récupérer dans un tableau l'ensemble des en-têtes HTTP envoyées par le navigateur. Voici la syntaxe
de cette fonction:

Tableau getallheaders();
Le tableau retourné par la fonction contient les en-têtes indexés par leur nom. Voici un script permettant par exemple
de récupérer des en-têtes particuliers.

<?
$entetes = getallheaders;
echo $entetes["location"];
?>

Présentation des cookies

39
Langage PHP
PHP permet de gérer très facilement les cookies (pour plus d'informations sur les cookies, veuillez vous reporter à cet
article), c'est-à-dire la création de petits fichiers texte chez le client permettant de mémoriser individuellement des
préférences pour chaque utilisateur sans le gérer du côté du serveur.

Créer le cookie
Pour créer un cookie sur une machine appelant un de vos scripts PHP, il faut utiliser la fonction setcookie() dans celui-
ci. La fonction SetCookie() permet d'envoyer les informations relatives aux cookies dans les en-têtes HTTP
Voici la syntaxe de la fonction setcookie:

booléen setcookie(chaîne NomDuCookie,


chaîne Valeur,
entier expiration,
chaîne chemin,
chaîne domaine,
entier securisé);
L'argument NomDuCookie est celui qui vous permettra de faire référence à un cookie spécifique stocké sur le disque
des utilisateurs. A chaque cookie correspond un nom auquel une valeur est attribuée.
Les arguments suivants servent à déterminer les conditions de validité du cookie:
 expiration: détermine le moment à partir duquel le cookie sera effacé du disque du client. Elle doit être passée
sous forme d'un entier indiquant le nombre de secondes à compter du 1 er janvier 1970 à partir desquelles le cookies
n'est plus valide. Il est généralement d'usage d'utiliser la fonction now() qui retourne le nombre de secondes de
cette date à maintenant et d'y ajouter le nombre de secondes de validités que l'on désire. Pour un cookie valide
pendant un an ce sera now()+31536000. Dans certains cas la fonction mktime() peut s'avérer elle aussi très
pratique
 chemin désigne le répertoire à partir de la racine de votre domaine pour lequel votre cookie est valide, c'est-à-dire
que si vous ne voulez utiliser le cookie que dans des scripts stockÉs dans le répertoire /commerce il faudra définir le
chemin /commerce/
 domaine il s'agit du domaine de votre serveur, celui-ci doit obligatoirement contenir 2 points (par exemple
www.commentcamarche.net). Par défaut (si vous omettez ce paramètre) le domaine qui a créé le cookie (donc le
votre) sera automatiquement inséré
 sécurisé lorsqu'il est mis à 1 indique que le cookie ne sera transmis que si la ligne est sécurisée (par SSL ou S-
HTTP

Quelques précisions sur les cookies


 La fonction setcookie() doit être utilisée avant tout envoi de données HTML vers le navigateur, même
si ces données sont envoyées avec echo, print ou équivalent (le script qui la contient doit donc être
placé avant la balise <HTML> et avant toute fonction echo(),print ou printf()).
 Le cookie n'est pas visible avant le prochain chargement de page.
 Avec PHP3 si vous envoyez plusieurs cookies de suite, les appels seront traités en ordre inverse, alors
qu'avec PHP4 il seront traités dans l'ordre.
 Il est possible d'utiliser des tableaux dans un cookie. Autant de cookies que d'éléments du tableau
seront alors envoyés, mais tout se fait de façon transparente, puisque à la lecture un tableau sera
créé. Il est quand même préférable d'utiliser les fonctions implode et explode pour envoyer ainsi qu'un
seul cookie.
 Il faut savoir que certains navigateurs ne traitent pas bien les cookies
o Microsoft Internet Explorer 4 avec le Service Pack 1 ne traite pas correctement les cookies qui
ont le paramètre chemin défini.

o Inversement Netscape Communicator 4.05 et Microsoft Internet Explorer 3.x ne traitent pas
correctement les cookies qui n'ont pas les paramètres chemin et expiration définis.

Exemple d'utilisation de cookies


Voilà donc un script permettant de savoir si un visiteur est déjà venu sur le site pendant le mois:

<?php
setcookie(
"Visites",
"Oui",
time()+2592000,
"/",
".commentcamarche.net",0);
?>
Quelques autres exemples:

40
Langage PHP

<?php
// Envoi d'un cookie qui disparaitra après la fermeture du navigateur
SetCookie("CcmUserSessionCookie","$login:$pass");

// Envoi d'un cookie qui restera présent 24 heures


SetCookie("CcmDejaVisite","1",time()+3600*24,"/",".phpfrance.com",0);

// Envoi d'un cookie qui s'effacera le 1er janvier 2001


SetCookie("CcmAn2000","1",mktime(0,0,0,1,1,2001),"/",".phpfrance.com",0);
?>

Récupérer les valeurs d'un cookie


Lorsqu'un cookie pour votre domaine est présent sur le disque du client, si celui-ci visite une de vos pages PHP dont
le chemin est inclut dans le paramètre chemin (si le chemin est / le cookie est valide pour toutes les pages de votre
site) le cookie sera automatiquement passé en paramètre à votre script et sa valeur sera directement accessible dans
la variable $NomDuCookie.
Voici le même script que précédemment permettant cette fois ci de compter le nombre de visite de la page par le
visiteur:

<?php
$Visites++;

setcookie(
"Visites",
$Visites,
time()+2592000,
"/",
".commentcamarche.net",0);
?>
A chaque appel de la page, le script récupère la valeur du cookie nommé Visites, l'incrémente, puis envoie le cookie
dont la valeur a été incrémentée.

Supprimer un cookie
Il peut éventuellement être utile de proposer à l'utilisateur de supprimer certains de ses cookies, ou bien de le faire
vous même de façon transparente.
Pour ceci il suffit de renvoyer le cookie grâce à la fonction setcookie() en spécifiant simplement l'argument
NomDuCookie:

<?php
setcookie("Visites");
?>
Une autre méthode consiste à envoyer un cookie dont la date d'expiration est passée:

<?php
setcookie("Visites","",0,"/","",0);
?>

Quelques réalisations avec les cookies


Lorsque vous souscrivez en tant que membre de CCM, un mot de passe et un login vous sont demandé. Après confirmation
de votre inscription en renvoyant simplement le mail qui vous a été automatiquement envoyé, vous pouvez utiliser
votre login et votre mot de passe dans la section s'identifier, activant un cookie sur votre disque dur, contenant un
numero d'identification ainsi qu'un numéro aléatoire permettant au site de vous reconnaître dans certaines sections
en comparant ces valeurs avec celles stockées dans une entrée de la base de donnée. Cela fait apparaître de
nouvelles options aux membres CCM sans gêner les non-membres...

Mail et réseau
PHP étant un langage consacré au Web, il possède bien évidemment des fonctions lui permettant de
communiquer avec le "monde extérieur" à l'aide de fonctions standards. Le service le plus utilisé sur Internet
étant la messagerie électronique, il est naturel que PHP permette d'envoyer des mails.

41
Langage PHP

La fonction mail()

En PHP3 il existe une fonction très simple qui permet d'envoyer un email. Voilà sa syntaxe

Entier mail(chaîne email_destinataire,


chaîne Sujet,
chaîne corps_du_message,
chaîne options);
Le dernier champ est facultatif, on en parlera juste après. Dans un premier temps nous allons envoyer un email de
base. Voilà le nouveau code du fichier traitant les données envoyées par le formulaire précédant :

<html?>
<body?>
<h4>Merci <?echo $nom;??></h4?>
<?
echo "<p>Votre commentaire : $texte</p?>";
mail(
"[email protected]",
"Commentaire sur CCM",
"$nom a laissé un commentaire à propos de commentcamarche.net: \n\n$texte"
);
?>
</body?>
</html?>
Les \n à l'intérieur du corps de m'email permettent d'aller à la ligne

Chez certains hébergeurs (dont Free) la fonction mail est désactivée car elle permet de simuler un envoi
de mail à partir de n'importe quelle adresse. Ainsi elle est parfois remplacée par la fonction email()

Les options / en-têtes


Le champ options de la fonction mail permet d'ajouter une en-tête au message que l'on envoie. On peut par exemple
y mettre la date, le logiciel utilisé pour envoyer l'email ou encore l'adresse de retour...
Voilà un exemple d'en-tête à utiliser lors d'un envoi de mail :

$from_email = "[email protected]";
$entetedate = date("D, j M Y H:i:s -0600"); // Offset horaire
$entetemail = "From: $from_email \n"; // Adresse expéditeur
$entetemail .= "Cc: \n";
$entetemail .= "Bcc: \n"; // Copies cachées
$entetemail .= "Reply-To: $from_email \n"; // Adresse de retour
$entetemail .= "X-Mailer: PHP/" . phpversion() . "\n" ;
$entetemail .= "Date: $entetedate";
La commande précédente équivaut donc à :

mail(
"[email protected]",
"Commentaire sur commentcamarche.net",
"$nom a laissé un commentaire à propos de commentcamarche.net: \n\n$texte",
$entetemail
);

La fonction email()
La fonction email() remplace parfois la fonction mail() chew certains hébergeurs (dont Free) car elle permet
uniquement d'envoyer des mails à partir de votre adresse email.
Elle s'utilise à peu près de façon similaire à la fonction mail() mais sa syntaxe est quelque peu différente:

email(chaîne compte,chaîne destinataire,chaîne titre,chaîne message[,options]);


Voici un exemple d'utilisation du site à partir du compte webmaster pour le domaine commentcamarche.net:

email("webmaster",

42
Langage PHP
"[email protected]",
"Bonjour Toto",
"Salut Toto\nvoici ton message");

Les fonctions IMAP


Le protocole IMAP (Internet Message Access Protocol) est un protocole (datant de 1986) permettant d'accèder à une
messagerie électronique. Beaucoup plus évolué que le protocole POP (Post Office Protocol), il a toutefois été supplanté
par ce dernier qui est plus simple.
Ainsi PHP implémente la version 4 de ce protocole et fourni des fonctions permettant de manipuler des boîtes aux
lettres directement sur le serveur IMAP, ainsi que sur des serveurs POP ou NNTP (serveurs de news).
La première fonction à utiliser est la fonction imap_open(), elle permet de se connecter à la boîte au lettre et retourne
un identifiant d'accès pour la boîte aux lettres, utilisable avec les autres fonctions IMAP. Sa syntaxe est la suivante:

Entier imap_open(chaîne boîte,


chaîne utilisateur,
chaîne mot_de_passe);
La boîte doit être spécifiée de la manière suivante (il s'agit ici de la boîte INBOX, celle dans laquelle les nouveaux
messages arrivent):

"{serveur:port}INBOX"
Le port utilisé par les serveurs IMAP est 143 par défaut.
Voici dans le cas de la newsletter de Comment ça Marche le script permettant d'ouvrir la boîte:

$mailbox = imap_open("{imap.pro.proxad.net:143}INBOX",
"[email protected]",
"password");
Une fois la boîte au lettre ouverte, il est possible (et généralement utile) de consulter les informations sur l'état de la
boîte aux lettres grâce à la fonction imap_check() dont la syntaxe est comme suit:

Entier imap_check(chaîne Boîte);


Celle-ci retourne un objet dont il est possible de connaître les propriétés, c'est-à-dire toutes les informations sur la
boîte au lettre passée en paramètre. Voici les propriétés de l'objet retourné par la fonction imap_check():
Propriété Description
Date Date du dernier message
Driver Version du pilote utilisé
Mailbox Nom associé à la boîte aux lettres
Nmsgs Nombre de messages dans la boîte
Recent Nombre de messages non lus
La fonction certainement la plus utile est la fonction imap_header() car c'est elle qui permet de lire les messages
contenus à l'aide de l'identifiant de la boîte et du numéro du message:

Objet imap_header(entier Boîte,


entier Message[,
entier Longueur_champ_from[,
entier Longueur_sujet]]);
Ainsi les propriétés de l'objet renvoyé par imap_header() sont les suivantes:
Propriété Description
Answered
bcc
bccadress
cc
ccaddress/td>
Date
date
Deleted
fetchfrom
from
in_reply_to
MailDate
message_id

43
Langage PHP
Msgno
newsgroups
Recent
references
remail
return_pathaddress
sender
senderaddress
Size
subject
Subject
to
toaddress
update
Unseen
Les propriétés de l'objet retourné par la fonction imap_header() sont accessible par la notation suivante:

$Nom_de_l_objet->Propriétés;
La fonction imap_num_msg() permet de savoir très facilement le nombre de messages sur le serveur.

Entier imap_num_msg(entier boîte);


Ainsi le script suivant permet d'afficher les mails contenus dans la boite INBOX du compte
[email protected] et supprime les mails dont le sujet contient "a détruire" ou les mails dont le corps
contient "destruction":

<?
$mailbox = imap_open("{imap.pro.proxad.net:143}INBOX",
"[email protected]",
"password");

$check = imap_check($mailbox);
$nMessages = imap_num_msg($mailbox);
echo "<table border=\"1\">
for($index=1; $index <= $nMessages; $index++){

$header = imap_header($mailbox, $index);

echo "<tr><td>$header->Subject</td></tr>\n";
$from = $header->from[0];

echo "<tr><td>$from</td></tr>\n";

$corps = imap_body($mailbox,$index);
echo "<tr><td>$corps</td></tr>\n";

if (eregi(".*a detruire.*",$header->Subject)||
eregi("destruction",$corps)) {
imap_delete($mailbox,$index,0);
}
echo "</table>\n";
}

imap_expunge($mailbox);
imap_close($mailbox);
?>

Moteur de Recherche

Idée générale

44
Langage PHP
Le moteur de recherche suivant a été mis au point par moi-même et ne correspond donc qu'à une idée possible de
moteur de recherche simple, ne gérant qu'un seul mot clé.

Le concept du fonctionnement de ce moteur est de créer une base de donnée contenant les mots clés de chaque page
du site stockés dans des balises spéciales appelées méta tags. Un premier script permet donc de "scanner" l'ensemble
des répertoires (et sous-répertoires) d'un site à la recherche de fichiers dont l'extension est .htm ou .html, puis de
scruter leur contenu à la recherche des balises méta keywords (les mots-cés), title (le titre de la page), puis de
stocker ces données, ainsi que l'emplacement du fichier sur le serveur, dans une base de données. Chaque fichier du
site devant être indexer devra comporter les balises méta suivantes:

<head>
<META NAME="ROBOTS" content="all">
<META NAME="keywords" content="mot clé 1,mot cle 2,Mot clé 3, Mots clefs">
<META NAME="title" content="titre de votre page">
<title>titre de votre page</title>
</head>
La balises ROBOTS permet de spécifier si le fichier doit être indexé ou non. Si vous ne voulez pas qu'une page de
votre site soit indexée, il suffit alors de lui incorporer la balise méta suivante:
<head>
<META NAME="ROBOTS" content="none">
</head>
Les balises précédentes ont l'avantage d'être utilisées aussi par les principaux moteurs du marché
(Yahoo!,Altavista,Voilà,...)
Dans un second temps, un script PHP permet d'exploiter la base de données ainsi créée en cherchant dans celle-
ci le mot clé saisi par l'utilisateur par l'intermédiaire d'un formulaire.

Création de la base de données


Le but est de créer une table comportant les champs nécessaires au stockage des enregistrements, c'est-à-dire
contenant les champs suivants:
 lien : URL (absolue ou relative) de la page
 keywords : mots clés
 titre : titre de la page

Il suffit donc de créer un petit script PHP dont le seul but sera de créer cette table, que l'on appelera search
<html>
<head>
<title>Creation de la table</title>
</head>
<body>

<?php
$host = "Votre serveur de base de données";
$user = "Votre nom d'utilisateur";
$password = "Votre mot de passe";
$bdd = "Votre base de données sur le serveur";
mysql_connect($host, $user, $password) or die ("Connexion au serveur impossible");

// on choisit la bonne base


mysql_select_db($bdd) or die ("Connexion a la base impossible");

$query = "CREATE TABLE search (


lien varchar(128) NOT NULL,
keyword blob,
titre varchar(128),
PRIMARY KEY (lien)
)";

mysql_query($query) or die ("Erreur de modification de la table");


// on ferme la base
mysql_close();
?>
</body>
</html>

45
Langage PHP

Remplissage de la base de données


Le script suivant est le script principal du moteur, car c'est lui qui permet de parcourir l'arborescence du site à la
recherche des fichiers HTML, de les scruter afin d déterminer s'ils doivent être ajoutés à la base et, le cas échéant,
stocker les données nécessaires à leur exploitation.
Afin de garantir une certaine "confidentialité" des données, l'exécution du script est protégé par un mot de passe.
Cela signifie qu'à la première utilisation, le script vérifie la présence de la variable $password, et affiche un formulaire
d'authentification si celle-ci n'est pas déclarée. Le formulaire s'envoie les variables $password et $user qui vont
permettre l'authentification de l'utilisateur.
Une fois l'utilisateur authentifié, le script va dans un premier temps supprimer les anciens enregistrements de la
table, puis lancer une procédure ayant pour rôle de parcourir l'arborescence à la recherche de fichier HTML.
Cette procédure est récursive, c'est-à-dire qu'elle s'appelle elle-même. Elle admet en paramètre le répertoire dans
lequel elle doit rechercher des fichiers, ainsi que le chemin d'accès relatif à ce répertoire. La procédure examine
chaque enregistrement du répertoire.
 S'il s'agit d'un répertoire (autre que le répertoire courant (.) ou parent (..)), alors la fonction examine le sous-
répertoire
 S'il s'agit d'un fichier dont l'extension est .htm ou .html, la fonction récupère l'ensemble des méta tags dans un
tableau associatif
o Si le méta tag ROBOTS contient la valeur NONE, la fonction passe son chemin
o Sinon, la fonction récupère les méta tags relatifs aux mots clés et au titre et les stocke dans la base

<?php

if (!$password) {
echo "
<p>\n
<table bgcolor=#EFF2FB border=\"0\" cellspacing=\"0\" cellpadding=\"1\" width=100%>\n
<tr><td>\n
<a name=\"#auth\"><h2>Authentification!</h2></a>\n
</td></tr>\n
</table>\n
<p>\n

Veuillez fournir votre identifiant:<p>\n


<form action=\"scan.php3\" method=\"post\">\n
<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n

<tr>\n
<td>Nom d'utilisateur:</td><td><input type=text size=\"30\" name=\"user\"></td>\n
</tr>\n
<tr>\n
<td>Mot de passe:</td><td><input type=password size=\"20\" name=\"password\"></td>\n
</tr>\n
<tr>\n
<td colspan=\"2\"><input type=submit value=\"Go!\"></td>\n
</tr>\n

</table>\n
</form>\n";
}

else{
echo "
<p>\n
<table bgcolor=#EFF2FB border=\"0\" cellspacing=\"0\" cellpadding=\"1\" width=100%>\n
<tr><td>\n
<a name=\"#index\"><h2>Indexation du site en cours</h2></a>\n
</td></tr>\n
</table>\n
<p>\n";

$host = "Le serveur de base de données";


$bdd = "Votre base de données";

46
Langage PHP

/* Connexion avec MySQL */


mysql_connect($host,$user,$password) or die ("Impossible de se connecter
au serveur de base de donnees");
mysql_select_db($bdd) or die ("Impossible d'accéder à la base $bdd");

$query = "DELETE FROM search";


mysql_query($query) or die ("Erreur de modification de la table");

function ScanDir($Directory,$Courant){

$MyDirectory = opendir($Directory);
while($Entry = readdir($MyDirectory)) {

if(is_dir($Entry)&& $Entry != "." && $Entry != "..") {


ScanDir($Entry,$Courant.$Entry."/");
}
else {
if (eregi(".htm",$Entry)){

$MetaTags = get_meta_tags($Directory."/".$Entry);

if ($MetaTags["robots"] == "all") {
$MetaKey = $MetaTags["keywords"];
$MetaKey = strtoupper($MetaKey);
echo "Meta($Directory/$Entry): $MetaKey
\n";
$MetaTitre = $MetaTags["title"];
echo "Meta($Directory/$Entry): $MetaTitre
\n";

$query = "INSERT INTO search (lien,keyword,titre)


VALUES(\"$Directory/$Entry\",\"$MetaKey\",\"$MetaTitre\")";
$mysql_result = mysql_query($query) or die ("Erreur
de modification de la table par la requete \"$query\"");
}

}
}
}
closedir($MyDirectory);
}

$open_basedir=".";
ScanDir(".","");
mysql_close();

?>

Exploitation de la base de données


Pour exploiter la base de données, il faut dans un premier temps créer un formulaire permettant à vos utilisateurs de
saisir un mot clé à chercher. Voici un exemple de formulaire simple leur permettant d'effectuer leur recherche:
<form method="post" action="search.php3">
Entrez un mot clé:<br>

47
Langage PHP
<input type="text" name="Mot" size="15">
<input type="button" value="Rechercher" alt="Lancer la recherche!">
</form>
Voici le résultat de ce code HTML:
Entrez un mot clé:

Puis il s'agit de créer le script PHP (le dernier) recherchant l'ensemble des enregistrements de la base de données
contenant la chaîne entrée par l'utilisateur. Ce script est simple, il effectue dans un premier temps une requête SQL
sélectionnant les enregistrements contenant la chaîne. Puis il affiche le nombre d'enregistrements retournés, et une
boucle while exploite ces enregistrements et les affiche les uns à la suite des autres.
<?php
$host = "Votre serveur de base de données";
$user = "Votre nom d'utilisateur";
$password = "Votre mot de passe";
$bdd = "Votre base de données sur le serveur";
mysql_connect($host, $user, $password) or die ("Connexion au serveur impossible");

// on choisit la bonne base


mysql_select_db($bdd) or die ("Connexion a la base impossible");

echo "
<html>
<head>
<title>Résultat de la recherche</title>
</head>

<body>";

if (($Mot == "")||($Mot == "%")) {


// Si aucun mot clé n'a été saisi, le script demande à l'utilisateur
// de bien vouloir préciser un mot clé
echo "
Veuillez entrer un mot clé s'il vous plaît!
<p>";
}

else {

// On selectionne les enregistrements contenant le mot clé dans les keywords ou le titre
$query = "SELECT distinct count(lien) FROM search
WHERE keyword LIKE \"%$Mot%\"
OR titre LIKE \"%$Mot%\"
";

$result = mysql_query($query);
$row = mysql_fetch_row($result);
$Nombre = $row[0];

// Si aucun enregistrement n'est retourné, on affiche un message adéquat


if ($Nombre == "0") {
echo "
<h2>Aucun résultat ne correspond à votre recherche</h2>
<p>
";
}

// Sinon, on affiche le nombre d'enregistrements correspondant et les résultats eux-mêmes


else {
$query = "SELECT distinct lien,keyword,titre FROM search
WHERE keyword LIKE \"%$Mot%\"
OR titre LIKE \"%$Mot%\" ORDER by titre ASC";

$result = mysql_query($query);
48
Langage PHP

// Si un seul enregistrement est trouvé, on affiche un message au singulier


if ($Nombre == "1") {
echo "
<a name=\"#resultat\"><h2>Résultat: Un article trouvé</h2></a>
<p>";
}

// Dans le cas contraire le message est au pluriel...


else {
echo "
<a name=\"#resultat\"><h2>Résultat: $Nombre articles trouvés</h2></a>
<p>";
}

while($row = mysql_fetch_row($result))
{

echo "
<p>\n
<b>$row[2]</b>\n
<br><a href=\"../$row[0]\">Visualiser l'article</a>\n
<p>\n
";
}
}

}
// on ferme la base
mysql_close();
?>
</body>
</html>

Remarques
Le moteur présenté ci-dessus permet de faire une recherche basique, il est donc possible de lui ajouter des
fonctionnalités, permettant par exemple de faire une recherche à partir de plusieurs mots-clés (comme les moteurs de
recherche courants). D'autre part, les résultats sont affichées de manière basique les uns à la suite des autres. Il vous
revient d'adapter la présentation des résultats à votre site, ainsi que celle du formulaire ou des messages
d'avertissement...

49

Vous aimerez peut-être aussi