Résumé

Un cours idéal pour assimiler la syntaxe et les concepts objet de PHP 5 et s’initier au développement d’applications web professionnelles

Ce manuel d’initiation vous conduira des premiers pas en PHP jusqu’à la réalisation d’un site Web complet interagissant avec une base de données MySQL ou SQLite.

Après avoir appris à installer PHP et à créer quelques pages simples, vous étudierez en détail la syntaxe du langage (variables, types de données, opérateurs, instructions, fonctions, tableaux…), avant de progresser rapidement vers des sujets de niveau plus avancé : programmation objet, manipulation des chaînes de caractères et expressions régulières, gestion des e-mails, sessions et cookies, accès aux bases de données MySQL et SQLite, traitements XML, etc.

Parmi les thèmes nouveaux abordés dans cette troisième édition de l’ouvrage : les nouveautés de PHP 5.4 dont les « Traits » (pseudo-héritage multiple) et l’accès objet à SQLite 3.

Des exercices corrigés et des travaux pratiques pour une mise en œuvre immédiate de vos connaissances

Pour vous aider à valider et mettre en œuvre vos connaissances, vous trouverez en fin de chaque chapitre une série d’exercices dont les corrigés et le code source sont disponibles sur les sites www.editions-eyrolles.com et www.funhtml.com. Vous découvrirez également en fin d’ouvrage quatre exemples de sites Web dynamiques présentés sous forme de travaux pratiques : à vous de développer ces applications à partir du cahier des charges et des indications données dans l’énoncé, en résistant à la tentation de télécharger trop rapidement les solutions données sur le site des éditions Eyrolles !

À qui s’adresse ce livre?

• Aux étudiants en cursus d’informatique ou de design Web.

• À toute personne ayant des bases de programmation Web (HTML, JavaScript…) et souhaitant s’autoformer à PHP.

• Aux enseignants et formateurs à la recherche d’une méthode pédagogique pour enseigner PHP.

Au sommaire

Premier contact avec PHP • Variables, constantes et types • Les instructions de contrôle (if-else, for, while…) • Les chaînes de caractères et les expressions régulières • Les tableaux classiques et objets • Les formulaires HTML5 • Les fonctions • Dates et calendriers • La programmation objet (classes et instances, héritage, traits, namespaces…) • Les images dynamiques • La gestion des fichiers • Cookies, sessions et e-mails • Rappels sur les bases de données relationnelles • Le langage SQL et phpMyAdmin • Accès procédural à MySQL • Accès objet à MySQL • PDO et MySQL • Accès objet à SQLite 3 • PHP et XML • Le framework PEAR • Travaux dirigés : site de rencontres, dictionnaire de citations interactif, site de commerce électronique, création d’un blog.

Biographie Auteur

Jean Engels

Enseignant en mathématiques, Jean Engels est auteur de nombreux ouvrages portant sur les technologies du Web : HTML, XHTML, CSS, JavaScript, PHP et MySQL.

www.editions-eyrolles.com

Jean Engels

PHP5

Cours et exercices

3eédition

ÉDITIONS EYROLLES
61, bd Saint-Germain
75240 Paris Cedex 05
www.editions-eyrolles.com

Avec la contribution de Olivier Salvatori pour la 1reédition.

En application de la loi du 11 mars 1957, il est interdit de reproduire intégralement ou partiellement le présent ouvrage, sur quelque support que ce soit, sans l’autorisation de l’Éditeur ou du Centre Français d’exploitation du droit de copie, 20, rue des Grands Augustins, 75006 Paris.
© Groupe Eyrolles, 2005, 2009,...

CHEZ LE MÊME ÉDITEUR

Du même auteur

J. ENGELS. – HTML5 et CSS3. Cours et exercices.
N°13400, 2012, 550 pages.

Autres ouvrages sur PHP

J.-M. DEFRANCE. – jQuery-Ajax avec PHP.
N°13720, 2e édition à paraître.

É. DASPET, C. PIERRE de GEYER, F. HARDY. – PHP 5 avancé.
N°13435, 6e édition, 2012, 870 pages.

C. PIERRE de GEYER, J. PAULI, G. PLESSI. – Performances PHP. Audit et optimisation LAMP.
N°12800, 2012, 300 pages.

D. SÉGUY, P. GAMACHE. – Sécurité PHP 5 et MySQL.
N°13339, 3e édition, 2011, 272 pages.

G. PONÇON. – Best practices PHP 5.
N°11676, 2005, 480 pages.

Autres ouvrages sur la conception et le développement Web

R. RIMELÉ. – HTML5. Une référence pour le développeur web.
N°13638, 2e édition, 2013, 752 pages.

R. GOETTER. – CSS avancées. Vers HTML5 et CSS3.
N°13405, 2e édition, 2012, 386 pages.

R. RIMELÉ. – Mémento HTML5.
N°13420, 2012, 14...

Avant-propos

Cet ouvrage est destiné en priorité à ceux qui veulent se former à PHP 5 et aux bases de données MySQL et SQLite pour créer des pages web dynamiques et interactives. Nous y présentons à la fois les bases du langage, qui étaient celles de PHP 4, et les importantes nouveautés de la version 5, qui représentent une évolution majeure. Depuis la parution de la version 5.0, PHP s’est encore enrichi dans la version 5.4, objet de cette troisième édition, en particulier dans le domaine des objets avec, entre autres, l’apparition des namespaces (espaces de noms) y compris l’emploi du mot-clé use, du namespace global, des alias et des appels de variables statiques. La création de...

1

Introduction

Le sigle PHP signifiait à l’origine Personal Home Page. Pour Rasmus Lerdorf, l’auteur de ce qui allait devenir le langage de script côté serveur incorporable dans tout document HTML que nous connaissons, il s’agissait alors d’ajouter quelques fonctionnalités à ses pages personnelles. PHP signifie aujourd’hui Php Hypertext Preprocessor car il renvoie à un navigateur un document HTML construit par le moteur de script Zend Engine 2 de PHP, dont nous allons voir le fonctionnement. Il permet de créer des pages web dynamiques et interactives.

Imaginez que vous soyez fan de moto et que vous vouliez présenter les photos de vos modèles préférés et leurs caractéristiques techniques. La création de quelques pages HTML statiques, agrémentées de liens pour naviguer d’une page à l’autre, peut suffire. Imaginez maintenant que vous soyez rejoint par d’autres personnes qui partagent la même passion et que votre site présente des centaines de modèles et une rubrique de petites annonces et de contacts entre membres. La quantité d’informations à présenter ne permet plus de naviguer dans le site au moyen de liens mais réclame, dès la page d’accueil, un moteur de recherche. L’utilisateur saisit un ou plusieurs critères de recherche, à partir desquels le code d’un script PHP crée une page contenant les informations recherchées et seulement elles. Chaque visiteur et chaque besoin particulier génèrent donc des pages différentes, personnalisées, construites dynamiquement.

PHP permet en outre de créer des pages interactives. Une page interactive permet à un visiteur de saisir des données personnelles. Ces dernières sont ensuite transmises au serveur, où elles peuvent rester stockées dans une base de données pour être diffusées vers d’autres utilisateurs. Un visiteur peut, par exemple, s’enregistrer et retrouver une page adaptée à ses besoins lors d’une visite ultérieure. Il peut aussi envoyer des e-mails et des fichiers sans avoir à passer par son logiciel de messagerie. En associant toutes ces caractéristiques, il est possible de créer aussi bien des sites de diffusion et de collecte d’information que des sites d’e-commerce, de rencontres ou des blogs.

Pour contenir la masse d’informations collectées, PHP s’appuie généralement sur une base de données, généralement MySQL mais aussi SQLite avec PHP 5, et sur des serveurs Apache. PHP, MySQL et Apache forment d’ailleurs le trio ultradominant sur les serveurs Internet. Quand ce trio est associé sur un serveur à Linux, on parle de système LAMP (Linux, Apache, MySQL, PHP). PHP est utilisé aujourd’hui par plus de la...

2

Variables, constantes et types

Comme tout langage, PHP manipule des données. Pour un site dynamique, ces données sont variables. De plus, elles peuvent être de types différents, tel du texte sous forme de chaîne de caractères, comme vous en avez utilisé avec l’instruction echo, sous forme de nombres entiers ou décimaux ou encore sous forme de valeurs booléennes vrai ou faux (TRUE ou FALSE). Ces types de base sont les plus employés, mais il en existe d’autres, qui peuvent être des types composés, comme les tableaux et les objets, ou des types particuliers, comme resource ou NULL.

Les variables

Une variable est le conteneur d’une valeur d’un des types utilisés par PHP (entiers, flottants, chaînes de caractères, tableaux, booléens, objets, ressource ou NULL).

Chaque variable possède un identifiant particulier, qui commence toujours par le caractère dollar ($) suivi du nom de la variable. Les règles de création des noms de variable sont les suivantes :

•  Le nom commence par un caractère alphabétique, pris dans les ensembles [a-z], [A-Z] ou par le caractère de soulignement (_).

•  Les caractères suivants peuvent être les mêmes plus des chiffres.

•  La longueur du nom n’est pas limitée, mais il convient d’être raisonnable sous peine de confusion dans la saisie du code. Il est conseillé de créer des noms de variable le plus « parlant » possible. En relisant le code contenant la variable $nomclient, par exemple, vous comprenez davantage ce que vous manipulez que si vous aviez écrit $x ou $y.

•  La déclaration des variables n’est pas obligatoire en début de script. C’est là une différence notable avec les langages fortement typés comme Java ou C. Vous pouvez créer des variables n’importe où, à condition bien sûr de les créer avant de les utiliser, même s’il reste possible d’appeler une variable qui n’existe pas sans provoquer d’erreur.

•  L’initialisation des variables n’est pas non plus obligatoire et une variable non initialisée n’a pas de type précis.

•  Les noms des variables sont sensibles à la casse (majuscules et minuscules). $mavar et $MaVar ne désignent donc pas la même variable.

Les noms de variables suivants sont légaux :

$mavar

$_mavar

$mavar2

$M1

$_123

Les suivants sont illégaux :

$5mamar

$*mavar

$mavar+

Affectation par valeur et par référence

L’affectation consiste à donner une valeur à une variable. Comme expliqué précédemment, lors de la création d’une variable, vous ne déclarez pas son type. C’est la valeur que vous lui affectez qui détermine ce type. Dans PHP, vous pouvez affecter une variable par valeur ou par référence. Vous verrez que les méthodes et les conséquences de ces deux types d’affectation sont différentes et peuvent amener des résultats inattendus, si vous n’y prenez garde.

L’affectation par valeur se fait à l’aide de l’opérateur =, soit après la création de la variable, soit en même temps.

Dans l’exemple suivant :

$mavar = expression;

la variable $mavar prend la valeur de l’expression, qui peut être une valeur numérique, par exemple, une chaîne de caractères littérale, mais aussi une autre variable ou encore une expression PHP valide contenant des fonctions.

Dans les affectations suivantes :

$mavar=75;

$mavar="Paris";

$mavar=7*3+2/5-91%7; //PHP évalue l'expression puis affecte le résultat

$mavar=mysql_connect($a,$b,$c); //la fonction retourne une ressource

$mavar=isset($var&&($var==9)); //la fonction retourne une valeur booléenne

remarquez l’utilisation du même nom de variable alors que les valeurs affectées sont de type différent.

Dans l’affectation par valeur à l’aide de l’opérateur =, l’opérande de gauche, c’est-à-dire la variable à affecter, prend la valeur de l’expression contenue dans l’opérande de droite, et voilà tout. Toute modification ultérieure de l’opérande de droite, même s’il est lui-même une variable, n’a aucune incidence sur la variable affectée.

Dans l’exemple suivant :

$mavar1="Paris";

$mavar2="Lyon";

$mavar2=$mavar1;

$mavar1="Nantes";

à la fin du code, la variable $mavar2 contient la chaîne "Paris", puisque vous lui avez affecté la valeur de l’expression $mavar1, et $mavar1 vaut "Nantes", puisque sa valeur a été modifiée à la fin du script.

Avec l’affectation par référence, toujours réalisée au moyen de l’opérateur =, l’opérande de droite est une variable qui doit être précédée du caractère & (esperluette).

Dans l’exemple suivant :

$mavar1="Paris";

$mavar2="Lyon";

$mavar2 = &$mavar1;

$mavar1="Nantes";

la variable $mavar2 devient un alias de la variable $mavar1, et les modifications opérées sur $mavar1 sont répercutées sur $mavar2. Plus déroutant encore pour le novice, et plus dangereux aussi, toute modification apportée à la valeur de $mavar2 est répercutée dans $mavar1 puisque $mavar2 est un alias de $mavar1. C’est ce qu’illustre le script de l’exemple 2-1.

   Exemple 2-1. Affectation par valeur et par référence

<?php

//Affectation par valeur de $mavar1 et $mavar2

$mavar1="Paris";

echo "\$mavar1= ",$mavar1,"<br />";

$mavar2="Lyon";

echo "\$mavar2= ",$mavar2,"<br />";

//Affectation par référence de $mavar2

$mavar2 = &$mavar1;

echo "Affectation par référence de \$mavar2 <br />";

echo "\$mavar1= ",$mavar1,"<br />";

echo "\$mavar2= ",$mavar2,"<br />";

echo "modification de \$mavar1 <br />";

$mavar1="Nantes";

echo "\$mavar1= ",$mavar1,"<br />";

echo "\$mavar2= ",$mavar2,"<br />";

echo "modification de \$mavar2 <br />";

$mavar2="Marseille";

echo "\$mavar1= ",$mavar1,"<br />";

echo "\$mavar2= ",$mavar2,"<br />";

?>

Le résultat de l’exécution de ce script montre l’évolution des valeurs des deux variables après plusieurs affectations.

$mavar1= Paris

$mavar2= Lyon

affectation par référence de...

3

Les instructions de contrôle

On retrouve dans PHP la plupart des instructions de contrôle des scripts. Indispensables à la gestion du déroulement d’un algorithme quelconque, ces instructions sont présentes dans tous les langages. PHP utilise une syntaxe très proche de celle du langage C.

Ceux qui ont déjà pratiqué un langage tel que le C ou plus simplement JavaScript seront en pays de connaissance. Pour les autres, une adaptation sera sans doute nécessaire. La version 5 de PHP a vu l’apparition de nouvelles instructions dédiées à la gestion des exceptions, comme try…catch ou throw, qui lui faisaient défaut jusqu’à présent. La version 5.4 a même vu le retour de l’ancestrale instruction goto, très controversée dans tous les langages.

Les instructions conditionnelles

Comme tout langage, PHP dispose d’instructions conditionnelles qui permettent d’orienter le déroulement d’un script en fonction de la valeur de données.

L’instruction if

L’instruction if est la plus simple et la plus utilisée des instructions conditionnelles. Présente dans tous les langages de programmation, elle est essentielle en ce qu’elle permet d’orienter l’exécution du script en fonction de la valeur booléenne d’une expression.

Sa syntaxe est la suivante :

if (expression) instruction;

Si l’expression incluse dans les parenthèses est évaluée à la valeur booléenne TRUE, l’instruction qui suit est exécutée. Dans le cas contraire, l’exécution passe directement à la ligne suivante.

L’instruction if peut être suivie d’un bloc d’instructions délimité par des parenthèses qui sera entièrement exécuté dans les mêmes conditions :

if(expression)

{

//bloc de code

}

La rédaction de l’expression est importante. Elle peut devenir complexe lorsqu’elle comprend des opérateurs logiques associant ses différents composants.

Dans le code suivant :

<?php

$a=6;

if(is_integer($a) && ($a<10 && $a>5) && ($a%2==0) ) {echo "Conditions satisfaites";}

?>

l’expression composée :

(is_integer($a) && ($a<10 && $a>5) && ($a%2==0))

est évaluée à TRUE si $a répond simultanément aux trois conditions suivantes : être un entier, être compris entre 5 et 10 et être divisible par 2, soit pour $a les valeurs possibles de 6 et 8 uniquement. Le message ne s’affiche donc que dans ces cas.

PHP réalise une évaluation booléenne d’un grand nombre d’expressions qui ne contiennent pas en elles-mêmes de variables booléennes. Il admet, par exemple, des expressions du genre :

$a = 25;

if($a) {echo "La condition est vraie <br />";}

Dans ce cas, ce n’est pas la valeur de la variable $a qui est prise en compte mais son évaluation booléenne, qui vaut TRUE. Nous avons déjà abordé ce point au chapitre 2. Le lecteur pourra se reporter au tableau 2-6 pour revoir les conditions d’évaluation dans les différents cas.

Ne pas se tromper d’opérateur

Une erreur courante consiste à confondre l’opérateur de comparaison == avec l’opérateur d’affectation =. Dans les expressions conditionnelles, pour tester l’égalité de deux valeurs il faut employer l’opérateur == ou encore === pour tester l’identité (même valeur et même type).

L’instruction if…else

L’instruction if…else permet de traiter le cas où l’expression conditionnelle est vraie et en même temps d’écrire un traitement de rechange quand elle est évaluée à FALSE, ce que ne permet pas une instruction if seule. L’instruction ou le bloc qui suit else est alors le seul à être exécuté. L’exécution continue ensuite normalement après le bloc else.

L’exemple 3-1 suivant calcule le prix net après une remise variable en fonction du montant des achats selon les critères suivants :

•  Si le prix total est supérieur à 100 euros, la remise est de 10 %. Cette condition est traitée par l’instruction if (repère ).

•  Pour les montants inférieurs ou égaux à 100 euros, la remise est de 5 %. Cette condition est traitée par l’instruction else (repère ).

   Exemple 3-1. L’instruction if…else

<?php

$prix=55;

if($prix>100) ←

{

  echo "<b>Pour un montant d'achat de $prix &euro;, la remise est de 10 % </b>

  <br />";

  echo "Le prix net est de ",$prix*0.90;

}

else ←

{

  echo "<b>Pour...

4

Les chaînes de caractères

Dans un site web, vous manipulez constamment des chaînes de caractères, qui constituent l’essentiel du contenu de la plupart des pages. Quand le contenu est créé dynamiquement à partir de fichiers ou d’une base de données, ce sont encore pour une part importante des chaînes de caractères qui sont manipulées. De plus, toutes les variables issues de l’envoi d’un formulaire par le poste client sont de type string.

Affichage des chaînes

Vous avez vu à l’œuvre à plusieurs reprises la fonction echo pour afficher des données. Cette fonction est utilisable de plusieurs façons quand il s’agit d’afficher plusieurs chaînes ou variables à la suite l’une de l’autre afin de ne pas multiplier les appels à echo.

Vous pouvez utiliser l’opérateur de concaténation entre chaque expression, comme dans l’exemple suivant :

$nom = "Schultz";

echo "Bonjour Monsieur ". $nom. " nous sommes le ". date('d');

Dans le code, vous réalisez successivement la concaténation d’une chaîne littérale, d’une variable de type string, d’une deuxième chaîne puis de la valeur retournée par une fonction, qui est ici de type string. Après quoi, echo affiche l’ensemble dans le navigateur.

Le même résultat pourrait être obtenu sans concaténation, en séparant chaque expression par une virgule, comme ci-dessous :

echo "Bonjour Monsieur ", $nom," nous sommes le ",date('d');

Il n’est pas possible d’inclure de fonction dans une chaîne unique, comme ci-dessous :

echo "Bonjour Monsieur $nom nous sommes le date('d')" ;

Si la variable $nom est bien évaluée, la fonction date() ne pourrait pas l’être.

La « fonction » print() est quasiment similaire à echo. Vous pouvez écrire, par exemple :

print ("Bonjour Monsieur $nom nous sommes le ". date('d') );

ou :

print ("Bonjour Monsieur $nom nous sommes le "). date('d');

Dans ces deux cas, vous obtenez la valeur retournée par la fonction date().

Affichage formaté

Un affichage formaté permet d’obtenir des résultats uniformes, par exemple, pour aligner des chaînes sur plusieurs lignes ou des nombres dans un format particulier, comme un nombre de décimales fixe et une superposition correcte des chiffres en colonnes pour des montants financiers.

Vous disposez de deux fonctions pour cela, printf() et sprintf().

La syntaxe de printf() est la suivante :

void printf(string "format", string $ch1, string $ch2, ..… $chN)

Cette fonction affiche directement le contenu des chaînes $ch1, $ch2, …, $chN selon le format spécifié dans la chaîne "format".

La syntaxe de sprintf() est la suivante :

string sprintf(string "format",string $ch1, string $ch2, ..… $chN)

Elle retourne une chaîne unique, qui peut être composée de une ou plusieurs fois les chaînes $ch1, $ch2, …, $chN formatées selon le modèle défini dans la chaîne "format", comme précédemment.

Les fonctions vprintf et vsprintf, dont la syntaxe est la suivante :

void vprintf(string "format" , array $tab)

string vsprintf (string "format", array $tab)

jouent des rôles équivalant respectivement à printf() et sprintf(), mais avec pour particularité que les chaînes sont passées en argument dans un tableau.

Le plus difficile est ici de bien définir la chaîne de formatage. Celle-ci peut être composée d’un texte ordinaire, généralement explicatif, et de directives d’affichage. Ces dernières sont constituées de caractères spéciaux qui indiquent la manière dont les variables passées en paramètre doivent être incorporées dans la chaîne. C’est cette chaîne qui est affichée directement ou retournée, selon la fonction utilisée.

Les directives d’affichage sont composées, dans l’ordre, du caractère % suivi de :

•  Un caractère de remplissage, utilisé pour compléter la chaîne quand on lui impose une longueur fixe. Pour définir un caractère autre que 0 ou l’espace (valeur par défaut), il faut le préfixer par une apostrophe (').

•  Un caractère moins (–), pour indiquer un alignement à droite. Par défaut, l’alignement se fait à gauche.

•  Un nombre, indiquant le nombre de caractères pour la chaîne formatée.

•  Un point suivi d’un entier, indiquant le nombre de décimales à afficher pour les décimaux.

•  Une lettre, indiquant la spécification du type de la valeur à afficher. Le tableau 4-1 donne la liste et les définitions de ces caractères.

Tableau 4-1 – Les caractères de formatage du type de donnée

Caractère | Signification
%b | Interprète la chaîne $ch comme un entier et l’affiche en binaire :
| $ch="89";
| printf ("En binaire $ch s'écrit %b <br />", $ch);
| // Affiche: En binaire 89 s'écrit 1011001
%c | Interprète la chaîne $ch comme un entier et affiche le caractère dont le code ASCII correspond à ce nombre :
| $ch="115";
| printf (" Le caractère de code $ch est %c <br />", $ch);
| // Affiche : Le caractère de code 115 est s
%d | Interprète la chaîne $ch comme un entier signé et l’affiche comme un nombre en base 10 :
| $ch = "-25";
| printf ("La valeur de \$ch est %d", $ch); // Affiche -25
%f | Interprète la chaîne $ch comme un nombre de type double et l’affiche avec sa partie décimale à 6 chiffres. Les caractères non numériques de $ch ne sont pas pris en compte :
| $ch = "25.52 mètres";
| printf ("La longueur est de %f m", $ch);// Affiche: La longueur est de 25.520000 m
%o | Interprète le chaîne $ch comme un entier et l’affiche en octal :
| $ch = 252;
| printf ("En octal le nombre $ch s’écrit %o", $ch);
| // Affiche: En octal le nombre 252 s'écrit 374
%s | Interprète $ch comme une chaîne et l’affiche telle quelle :
| $ch1 = "Monsieur " ; $ch2 =

...

5

Les tableaux

Comme expliqué au chapitre 3, consacré aux types de données accessibles dans PHP, les tableaux représentés par le type array sont d’une utilisation courante dans les scripts. La possibilité de stocker un grand nombre de valeurs sous un seul nom de variable offre des avantages appréciables, notamment une grande souplesse dans la manipulation des données. Les nombreuses fonctions natives de PHP applicables aux tableaux permettent les opérations les plus diverses dans la gestion des tableaux.

Dans ce chapitre, vous verrez :

•  les différentes façons de créer des tableaux ;

•  les méthodes de lecture des éléments de tableau ;

•  les fonctions de manipulation des tableaux.

Créer des tableaux

La fonction array()

La fonction array() permet de créer de manière rapide des tableaux indicés ou associatifs. C’est elle qui sera le plus souvent utilisée pour la création de tableaux. Depuis la version 5.4, elle peut être remplacée par une syntaxe courte en écrivant simplement [] à la place de la fonction array().

Les tableaux indicés

La façon la plus élémentaire de créer un tableau indicé consiste à définir individuellement une valeur pour chacun des ses éléments, et ce de la manière suivante :

$tab[n] = valeur;

où n est un indice entier quelconque, et valeur un scalaire ou une variable de type integer, double, boolean, string ou array.

Cette manière de procéder se révèle rapidement rébarbative dès qu’il s’agit de définir un nombre plus important d’éléments. Pour créer un tableau composé de plusieurs éléments en une seule opération, vous disposez heureusement de la fonction array(), dont la syntaxe est la suivante :

$tab = array(valeur0,valeur1,…,valeurN);

Ou encore avec la syntaxe courte :

$tab=[valeur0,valeur1,…,valeurN];

La variable $tab est ici un tableau indicé dont les valeurs d’indice varient de 0 à N. Ce tableau a donc N + 1 éléments, accessibles par la notation habituelle $tab[0], $tab[1], …, $tab[N], dont les valeurs respectives peuvent avoir l’un quelconque des types précités.

Premier indice

Avec ce mode de création de tableau, le premier indice a, une fois encore, toujours la valeur 0. Il ne faut pas oublier d’en tenir compte lors des opérations de lecture des éléments.

Les tableaux associatifs

La même fonction array() permet aussi de créer rapidement un tableau associatif en définissant pour chacun de ses éléments une clé et une valeur.

La syntaxe avec la fonction array() est la suivante :

$tabasso = array("cléA"=>valeurA, "cléB"=>valeurB,… "cléZ"=>valeurZ)

La syntaxe courte est :

$tabasso = ["cléA"=>'valeurA', "cléB"=>'valeurB',"cléZ"=>'valeurZ'];

Comme vous l’avez vu au chapitre 2, chaque clé est une chaîne de caractères délimitée par des guillemets.

Pour lire valeurA, vous écrivez :

$tabasso["cléA"]

de la même façon que lorsque chaque élément est créé individuellement.

Dans un tableau associatif, la notion d’ordre des éléments perd la valeur qu’elle peut avoir dans un tableau indicé. Les clés ne sont pas numérotées, par exemple. Vous pourriez énumérer clés et valeurs dans un ordre différent sans que cela gène la lecture individuelle de chaque élément.

Vous auriez donc pu créer le même tableau en écrivant :

$tabasso = array("cléZ"=>valeurZ, "cléY"=>valeurY,… "cléA"=>valeurA)

qui correspond à l’ordre inverse. Vous pouvez en fait effectuer la création dans un ordre quelconque, sans changer quoi que ce soit à l’accès aux valeurs à l’aide de leur clé. Cela confirme la souplesse d’utilisation des tableaux associatifs en comparaison des tableaux indicés. Cette souplesse se révèle particulièrement utile dans les opérations de suppression d’éléments ou de tri sur des tableaux, lesquelles peuvent faire perdre les associations entre indices et valeurs.

Les tableaux multidimensionnels

Contrairement aux langages dans lesquels vous déclarez les variables et leur type, comme ASP.Net utilisé avec C#, PHP ne comporte pas de méthode explicite de création de tableaux multidimensionnels. C’est tout l’avantage de ce langage que d’autoriser qu’un élément de tableau puisse être un tableau lui-même. La création de tableau comportant un nombre quelconque de dimension en est d’autant facilitée.

Un tableau multidimensionnel est similaire à une matrice, au sens mathématique du terme. La structure d’un tableau à deux dimensions peut se représenter sous la forme d’un tableau à double entrée, comme l’exprime le listing de l’exemple 5-1, dont le résultat est illustré à la figure 5-1.

Figure 5-1

Visualisation d’un tableau multidimensionnel

Les valeurs des éléments ont été choisies de manière à montrer clairement par la suite comment accéder à une valeur particulière. Le premier chiffre est celui de la ligne, et le second celui de la colonne. Chaque ligne est à la fois un élément du tableau principal, qui contient quatre éléments, et est elle-même un tableau à trois éléments.

Vous obtenez au total douze valeurs dans le tableau, mais il n’a que quatre éléments.

De même que pour repérer un élément dans un espace à n dimensions il faut utiliser N coordonnées, pour lire une valeur dans un tableau à n dimensions, il faut utiliser N indices, ou clés, différents.

Par exemple, pour récupérer dans la variable $a la deuxième valeur (indice 1) de la troisième ligne (indice 2) du tableau précédent $tabmulti, écrivez :

$a = $tabmulti[2][1]

Dans cet exemple, chaque élément du tableau est un tableau ayant autant d’éléments que les autres, ce qui réalise une matrice rectangulaire 4 × 3. Il est évidemment possible de créer des tableaux multidimensionnels non symétriques, dans lesquels le premier élément pourrait être, par exemple, une valeur entière ou une chaîne de caractères, le deuxième élément un tableau à dix éléments, le troisième un tableau avec un nombre d’éléments différents puis tout autre combinaison possible. Quoique parfaitement réalisable, ce type de tableau, qui est irrégulier, risque de se révéler difficile à lire avec une boucle, comme vous le verrez dans les exemples présentés dans la suite du chapitre.

Pour en savoir plus

Les boucles sont abordées en détail au chapitre 3.

Le listing 5-1 utilise deux boucles de lecture pour afficher le contenu du tableau. Vous pouvez très bien envisager de créer de la même façon des tableaux à trois, quatre dimensions et bien plus encore, mais la visualisation en devient vite difficile.

Pour créer le tableau de la figure 5-1, utilisez la fonction array() de la façon suivante :

$tabmulti=array(

array("ligne 0-colonne 0","ligne 0-colonne 1","ligne 0-colonne 2"),

array("ligne 1-colonne 0","ligne 1-colonne 1","ligne 1-colonne 2"),

array("ligne 2-colonne 0","ligne 2-colonne 1","ligne 2-colonne 2"),

array("ligne 3-colonne 0","ligne 3-colonne 1","ligne 3-colonne 2")

);

Ou encore avec la syntaxe courte :

$tabmulti=[ ["ligne 0-colonne 0","ligne 0-colonne 1","ligne 0-colonne 2"],["ligne 1-colonne 0",

 "ligne 1-colonne 1","ligne 1-colonne 2"],["ligne 2-colonne 0","ligne 2-colonne 1","ligne 2-colonne 2"],

 ["ligne 3-colonne 0","ligne 3-colonne 1","ligne 3-colonne 2"]];

Afin de visualiser la structure complète du tableau $tabmulti, vous pouvez, dans les phases de test des scripts, utiliser la fonction print_r($tabmulti), qui affiche la structure suivante :

Array (

[0] => Array ( [0] => ligne 0-colonne 0 [1] => ligne 0-colonne 1 [2] => ligne 0-colonne 2)

[1] => Array ( [0] => ligne 1-colonne 0 [1] => ligne 1-colonne 1 [2] => ligne 1-colonne 2)

[2] => Array ( [0] => ligne 2-colonne 0 [1] => ligne 2-colonne 1 [2] => ligne 2-colonne 2)

[3] => Array ( [0] => ligne 3-colonne 0 [1] => ligne 3-colonne 1 [2] => ligne 3-colonne 2)

)

Vous retrouvez bien les différents éléments du tableau et leur contenu.

La fonction var_dump($tabmulti) permet d’afficher un ensemble d’informations encore plus complètes sur le tableau. Elle donne le nombre d’éléments et la description de chacun d’eux, ainsi que le type et le contenu de chaque valeur. Vous obtenez ainsi pour le même tableau :

array(4) { [0]=> array(3) { [0]=> string(17) "ligne 0-colonne 0" [1]=> string(17)

"ligne 0-colonne 1" [2]=> string(17) "ligne 0-colonne 2" }

[1]=> array(3) { [0]=> string(17) "ligne 1-colonne 0" [1]=> string(17) "ligne 1-colonne 1"

[2]=> string(17) "ligne 1-colonne 2" }

[2]=> array(3) { [0]=> string(17) "ligne 2-colonne 0" [1]=> string(17) "ligne 2-colonne 1"

[2]=> string(17) "ligne 2-colonne 2" }

[3]=> array(3) { [0]=> string(17) "ligne 3-colonne 0" [1]=> string(17) "ligne 3-colonne 1"

[2]=> string(17) "ligne 3-colonne 2" } }

Dans cette description, array(4) signifie que la variable $tabmulti est un tableau à quatre éléments. Vient ensuite la description de tous les éléments sur le même principe. Les expressions du type :

[0]=> array(3)

signifient que le premier élément du tableau est lui-même un tableau à trois éléments. Les accolades qui suivent donnent le type et la valeur de chacun des éléments de ce dernier tableau. Dans la suite de la description, nous trouvons :

[0]=> string(17) "ligne 0-colonne 0"

qui indique que l’élément d’indice 0 est une chaîne de dix-sept caractères, dont la valeur est "ligne 0-colonne 0".

L’utilisation de ces fonctions sert au programmeur à des fins de débogage des scripts. Il serait maladroit de les employer pour créer un affichage à destination de l’utilisateur final, qui les trouverait pour le moins obscures et peu « parlantes ».

   Exemple 5-1. Création d’un tableau multidimensionnel

<?php

$tabmulti=[ ["ligne 0-colonne 0","ligne 0-colonne 1","ligne 0-colonne 2"],

["ligne 1-colonne 0","ligne 1-colonne 1","ligne 1-colonne 2"],["ligne 2-colonne 0",

"ligne 2-colonne 1","ligne 2-colonne 2"],["ligne 3-colonne 0","ligne 3-colonne 1",

"ligne 3-colonne 2"]];

echo "<h3>Tableau multidimensionnel</h3><table border='1' width=\"100%\"> <tboby>";

for ($i=0;$i<count($tabmulti);$i++)

{

for($j=0;$j<count($tabmulti[$i]);$j++)

{

echo "<td><h3>.. ",$tabmulti[$i][$j]," ..</h3></td>";

}

echo "</tr>";

}

echo " </tbody> </table>";

?>

Le résultat obtenu est celui de la figure 5-1.

Créer des suites

Pour créer des tableaux dont les éléments sont des suites de nombres et éventuellement de lettres, comme vous le verrez à l’exemple 5-2, vous pourriez envisager d’utiliser une boucle for. PHP propose toutefois une fonction range(), qui permet de réaliser cette opération en une seule ligne de code. Sa syntaxe est la suivante :

array range(int mini,int maxi)

Cette fonction retourne un tableau indicé contenant tous les...

8

Dates et calendriers

Les fonctions de date de PHP permettent d’afficher le jour, la date et l’heure sur les pages web, qu’elles soient statiques ou créées dynamiquement.

La gestion du temps se révèle non moins utile pour déterminer la durée de validité des cookies, stocker dans une base de données des informations de date de commande ou calculer un délai.

Les dates

La révolution du système décimal, il y a deux siècles, n’a pas atteint la gestion du temps. Vieux des premiers âges babyloniens, le système sexagésimal, consistant à diviser le jour en vingt-quatre heures de soixante minutes de soixante secondes, continue donc d’empoisonner nos calculs de durée.

Les informaticiens ne pouvaient se contenter d’un système dans lequel l’ajout d’une seconde peut amener à changer d’heure, de jour, d’année et même de siècle ou de millénaire. Pour pallier les difficultés de ce système, les informaticiens ont défini une date d’origine arbitraire, correspondant au 1er janvier 1970 00 h 00 m 00 s. À partir de cette date, le temps est compté en secondes. Ce nombre de secondes est nommé timestamp, ou instant Unix.

Timestamp négatif

L’inconvénient de ce système est de fournir des timestamps négatifs pour les dates antérieures à l’origine. De plus, sous Windows, aucune des fonctions de date de PHP n’accepte comme paramètres les instants Unix négatifs, alors que les serveurs sous Linux les autorisent.

La fonction time(), que vous utiliserez souvent par la suite, retourne le timestamp de l’instant présent. Cette valeur n’est pas affichée au visiteur du site. Elle sert seulement d’intermédiaire sous-jacent pour calculer des durées et déterminer des dates futures ou passées. Le timestamp est alors passé à d’autres fonctions, qui réalisent l’affichage en clair de la date désirée. Un timestamp permet par ailleurs de stocker plus facilement une date à un seul nombre et constitue le moyen le plus sûr pour conserver une date dans une base de données.

L’exemple 8-1 montre la manière d’utiliser cette fonction pour afficher le timestamp en cours directement avec la fonction time() (repère ) ainsi que celui de dates futures (repère ) et passées (repère ). Il suffit pour cela d’ajouter ou d’enlever le nombre de secondes désiré. Pour calculer le nombre d’heures ou de jours correspondant au timestamp de l’instant en cours, il suffit de diviser la valeur donnée par la fonction time() par 3 600 pour le nombre d’heures (repère ) et par 3 600 puis 24 pour le nombre de jours (repère ).

Décalage horaire

Le timestamp retourné par la fonction time() est bien sûr celui qui est calculé côté serveur. Il n’est pas forcément identique à celui du poste client. Il faut donc tenir compte du décalage horaire éventuel.

   Exemple 8-1. La fonction time()

<?php

echo "À cet instant précis le timestamp est : ", time(),"<br />";

echo "Dans 23 jours le timestamp sera : ", time()+23*24*3600,

"<br />";

echo "Il y a 12 jours le timestamp était : ", time()-12*24*3600,"<br />";

echo"Nombre d'heures depuis le 1/1/1970...