Академический Документы
Профессиональный Документы
Культура Документы
Les instructions PHP sont runies dans un bloc entour de balises spcifiques du fichier HTML. Comme toutes les balises HTML celle ci commence par le symbole "<" et se termine par le symbole ">". Le bloc contenant du PHP est caractris par en dbut et fin par le symbole "?". Tout ce qui est l'extrieur de la balise PHP est transmis tel quel au navigateur ; seul les instructions PHP sont interprtes par le moteur PHP. Remarque le nouveau format XML demande que la balise d'ouverture des instructions PHP soit "?php" et non plus "?" seulement. Le langage PHP n'est pas un langage classique de programmation dans la mesure o les instructions, ne sont pas regroupes en programme ou procdure mais sont disperses dans la page HTML, entoures de balises appropries, le but de ces instructions tant de construire une page HTML "classique" aprs avoir pris en compte les demandes reues du client. L'instruction principale du langage consistera donc complter le fichier HTML, aprs soit des calculs soit des requtes une base de donnes, cette instruction commence par le mot cl echo, exemple affichage de la date dans une page HTML :
<html> <head> <title>Affichage Date</title> </head> <body> Nous sommes le <?php /* Affichage jour mois anne */ echo Date("d/m/y"); ?> </body> </html>
Seule la partie en italique sera interprte par le moteur PHP. La partie entre /* .*/ ne sera pas prise en compte : ce sont des commentaires senss amliorer la lisibilit du script, la seule instruction ici est l'instruction echo qui fait crire dans le fichier envoy au client ce qui se trouve derrire ce mot cl, ici le rsultat d'une fonction PHP qui donne la date du jour, la partie entre guillemets, l'intrieur des parenthses, indique comment doit tre crite cette date. La plupart du temps nous aurons traiter des donnes pour rpondre la demande du client, il est donc ncessaire de stocker ces donnes lmentaires dans des zones mmoire du serveur pour leur appliquer ces traitements, comme tous les langages de programmation, PHP utilise des variables pour ce faire. D'autre part les traitements peuvent tre soumis certaines conditions ou porter sur un ensemble important de donnes, en cas par exemple d'interrogation de base de donnes, le langage PHP est un langage structur qui fournit des structures conditionnelles et rptitives permettant de faire ces traitements.
Elments de PHP
1/54
Type de donnes
PHP n'est pas un langage dclaratif, les variables ne peuvent pas tre dclares par l'utilisateur, cependant suivant les valeurs prises par la variable PHP va lui attribuer un type. Ce type peut ventuellement tre chang par l'utilisateur, comme nous le verrons plus loin. Les types reconnus et associs aux variables par PHP sont les suivants : Le type chane de caractres (texte) Le type entier (numrique) Le type virgule flottante (rel, numrique) Le type boolen (Vrai ou Faux) Le type tableau Le type objet Le type ressource associ des oprations systme telles que connexion une base de donnes, ouverture d'un flux de fichier.
affichera : Boris Vian PHP, comme le langage C, autorise une notation abrge quand l'un des oprandes de la concatnation est aussi la variable rceptrice : $a.=$b; est quivalent $a=$a.$b; attention l'ordre de la concatnation! Remarque 1: Les doubles guillemets et les simples guillemets ne se comportent pas toujours de la mme faon, il faut donc tre trs prudent dans leur utilisation, par exemple l'instruction Echo "$nom"; Affichera Vian Tandis que Echo '$nom'; Affichera $nom Remarque 2 : la concatnation peut s'appliquer des variables non chanes de caractres, PHP fait alors la transformation de type (typecasting) : $num=40; echo $num." ans"; Affichera 40 ans
Enfin $a=$a+1; peut s'crire $a++; et $a=$a-1; peut s'crire $a--; ces dernires critures sont utilises frquemment dans les structures rptitives.
Oprateurs de comparaison
Les oprateurs de comparaison sont les suivants :
Exemple $a == $b $a === $b $a != $b $a <> $b $a !== $b $a < $b $a > $b $a <= $b $a >= $b Nom Egal Identique Diffrent Diffrent Diffrent Plus petit que Plus grand Infrieur ou gal Suprieur ou gal Rsultat TRUE si $a est gal $b. TRUE si $a est gal $b et s'ils sont de mme type TRUE si $a est diffrent de $b. TRUE si $a est diffrent de $b. TRUE si $a est diffrent de $b ou bien s'ils ne sont pas du mme type. TRUE si $a est strictement plus petit que $b. TRUE si $a est strictement plus grand que $b. TRUE si $a est plus petit ou gal $b. TRUE si $a est plus grand ou gal $b.
Exemple pour loprateur == : si vous dfinissez ainsi les deux variables $a et $b : $a=123 ; $b="123"; la comparaison $a==$b donnera TRUE, PHP faisant la conversion dans un mme type; tandis que la comparaison $a===$b donnera FALSE. Ces oprateurs de comparaison sont surtout utiliss dans les structures conditionnelles et rptitives.
Oprateurs boolens
PHP dispose des oprateurs boolens standards, dont la liste est donne ci-dessous :
Exemple ! $a $a && $b $a || $b $a and $b $a xor $b $a or $b Nom NON (Not) ET (And) OU (Or) ET (And) XOR (Xor) OU (Or) Rsultat TRUE si $a est faux. TRUE si $a ET $b sont vrais. TRUE si $a OU $b est vrai. TRUE si $a ET $b sont vrais. TRUE si soit $a soit $b est vrai, mais pas les deux en mme temps. TRUE si $a OU $b est vrai
La raison pour laquelle il existe deux types de "ET" et de "OU" est qu'ils ont des priorits diffrentes, le tableau donne les oprateurs en ordre dcroissant de priorit. Comme pour les autres oprateurs, il est possible dutiliser des notations abrges : $a&=$b ; pour $a=$a&&$b ; $a|=$b ; pour $a=$a||$ab ; $a^=$b ; pour $a=$a xor $ab ;
Le type tableau
En PHP, un tableau est en fait une association ordonne, c'est dire une correspondance entre une cl et une valeur, par dfaut les cls sont les entiers positifs (0,1,2,). Contrairement aux langages classiques pour un mme tableau :
Elments de PHP
4/54
Le tableau n'a pas besoin d'tre dimensionn, il ne peut donc y avoir de dbordement. La cl peut indiffremment tre une chane de caractre ou un entier positif. Le type des valeurs du tableau n'est pas ncessairement le mme pour toutes les cls et peut tre un tableau ce qui permet de crer des tableaux multidimensionnels. Ce type permet donc d'tre assimil plusieurs objets : vecteur matrice, liste, dictionnaire, arbre etc. Il existe deux mthodes principales pour crer un tableau, l'affectation directe de valeurs aux lments du tableau ou l'utilisation de la fonction array().
Dans le mme tableau, ici $array, il est possible donc d'avoir diffrents type de cls, chane de caractres ou entier, et diffrents type de valeurs associes ces cls : numriques entiers ou flottants, chanes de caractres, ou tableau ici pour la cl "livraison". Attention : il n'est pas donn de valeur par dfaut aux cls manquantes, mme pour les cls nombres entiers, c'est dire qu'ici une instruction du type : Echo $array[3] provoquera l'erreur : Notice: Undefined offset: 3 in g:\easyphp1-7\www\essais\plante1.php on line 21. Il est possible d'affecter de nouvelles valeurs un tableau sans prciser la cl, dans ce cas la cl gnre par PHP est la valeur entire maximum actuelle +1, 0 si aucune cl entire positive n'existe. Sur l'exemple prcdent, l'instruction : $array[]=345; crera une cl 6. Donc pour crer un tableau unidimensionnel "classique", dont les indices commencent 0, il suffit d'une suite d'instruction de type : $tableau[]=..; Pour tester si une valeur est affecte une cl du tableau on utilisera la fonction isset(). Pour supprimer un lment d'un tableau, on utilisera la fonction unset(), par exemple unset($array["livraison"]); supprimera les trois valeurs du tableau. Nous verrons dans le paragraphe sur les structures rptitives comment explorer toutes les valeurs d'un tableau.
Elments de PHP
5/54
Exemples :
$tableau=array(2,8,16); donnera $tableau[0]=2, $tableau[1]=8, $tableau[2]=16.
le fait que le dernier lment n'ait pas de cl explicite provoquera, comme dans le cas de cration par affectation, la cl 6. Remarque sur les cls : La dclaration d'une cl chane de caractre ne contenant que des chiffres entre guillemets n'est prise en compte comme telle que si le nombre commence par un 0. Par exemple "5" crera la cl numrique 5 et non pas la chane de caractres, tandis que "05" crera la cl chane de caractre associe.
si ce dernier n'est pas vide, il sera donc en fait ncessaire de faire un test. A titre d'exercice nous laissons au lecteur le cas symtrique de la queue, qui correspond une structure first in-first out, dfinie rcursivement par queue=[premier,queue] et celui de l'arbre binaire, dfinie par arbre=[arbre_gauche, nud, arbre_droit].
Elments de PHP
6/54
lister certaines de ces tableaux avec leurs cls les plus utiles. Nous ne parlerons ici que de la variable $_SERVER, laissant d'autres paragraphes, l'utilisation des variables $_POST, $_GET, $_COOKIE et $_SESSION.
La variable $_SERVER
Le tableau $_SERVER contient de nombreux renseignements utiles sur le serveur ou la page affiche. Prenons lexemple de lURL : "http://www.monsite.com/chemin/test.php ?param=valeur". Le tableau indique les clefs utilises dans $_SERVER["cl"] et le rsultat correspondant.
cl rsultat
/chemin/test.php www.monsite.com /chemin/test.php ?param=valeur param=valeur Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322) HTTP_ACCEPT_LANGUAGE fr DOCUMENT_ROOT exemple /home/monsite/www = la racine au niveau du systme de fichier SCRIPT_NAME /chemin/test.php SCRIPT_FILENAME /home/monsite/www/chemin/test.ph = $DOCUMENT_ROOT + $SCRIPT_NAME SERVER_ADDR Ladresse IP du serveur REMOTE_ADDR Ladresse IP du visiteur HTTP_REFERER La page qui a point vers la page actuelle (la page prcdente) REQUEST_METHOD La mthode ayant servi pour accder la page : GET, POST, HEAD, PUT Il existe d'autre cls pour ce tableau, le programme suivant vous permettra de les obtenir ainsi que les valeurs associes (voir le chapitre des structures pour la boucle sur le tableau) :
<? // essai de la variable server foreach($_SERVER as $i=>$value) { echo $i." , ".$_SERVER[$i]."<br>"; } ?>
Elments de PHP
7/54
Structure conditionnelle
Il existe deux types d'instructions conditionnelles la structure alternative et la structure choix multiples.
La structure alternative
La structure alternative consiste excuter certaines instructions si une condition est vrifie et d'autres si elle ne l'est pas ; il est possible que l'une des deux branches de l'alternative soit vide. L'instruction if L'instruction if permet d'excuter une ou plusieurs instruction si une condition est vrifie, sa syntaxe est la suivante :
<?php if (expression) instruction(s) ?>
o expression est une expression boolenne. Si il y a plusieurs instructions excuter si la condition est vrifie, ce instructions doivent tre regroupes en un bloc entre accolades. Exemple
<?php if ($a>$b) echo "$a est plus grand que b"; ?>
Remarque importante : pour l'galit les oprateurs usuels sont = = ou = = =, il faut faire attention l'oprateur d'affectation que l'on peut utiliser dans une condition :
if($a=$b){}
Pour l'instruction if{$a){.} $a est converti en boolen,dans le cas o il n'est pas boolen, sa valeur est FALSE si : $a est numrique et vaut 0
Elments de PHP
8/54
$a est une chane vide $a est un tableau vide Dans tous les autres cas $a est TRUE. L'instruction if else Si d'autre instructions sont excuter si la condition n'est pas vrifie, il faudra faire suivre l'instruction if d'une instruction else. La syntaxe est la suivante :
<?php if (expression) {instruction1(s)} else {instruction2(s)} ?>
Dans ce cas mme si instruction1 est unique elle doit tre entoure d'accolades, la mme rgle s'applique pour instruction2. Exemple :
<?php if ($a>$b) { $sup=$a; $inf=$b; } else { $sup=$b; $inf=$a; } ?>
Syntaxe particulire : dans le cas o instruction1 et instruction2 sont tous deux rduits une seule instruction, il est possible d'utiliser la syntaxe alternative : (condition) ? instruction1 : instruction2;
Seules les instructions correspondant la ralisation de la condition i sont excutes, si aucune des conditions n'est ralise, les instruction crites entre accolades aprs le else sont excutes.
Elments de PHP
9/54
Exemple :
<?php if ($a===$b) {echo "$a et $b sont gaux et de mme type";} elseif($a==$b) {echo "$a et $b sont gaux mais de types diffrents";} else {echo "$a n'est pas gal $b";} ?>
L'instruction switch Lorsque les conditions portent sur l'galit certaines valeurs, il est possible d'utiliser une autre syntaxe, l'instructions switch :
switch ($variable) { case value1: instruction1; break; case value2: instruction2; break; . default: instructionn: }
Remarque : si le mot cl break est omis dans chacun des cas des qu'une condition est vrifie toutes les instructions suivantes sont excutes, jusqu' la rencontre ventuelle du mot break ou la fin du switch.
L'instruction for
La boucle for n'est pas indispensable, mais elle permet une programmation plus aise que la boucle while quand chaque excution de la boucle, chaque itration, on passe l'itration suivante en ajoutant une valeur fixe entire (positive ou ngative) un compteur et que l'arrt de la boucle se fait quand le compteur dpasse une valeur donne. La syntaxe est la suivante :
<?php for(initialisation; continuation; incrmentation) instruction(s) ?>
si instructions comprend plusieurs instructions celles ci doivent tre mises entre accolades. - Initialisation est une instruction affectant une valeur initiale au compteur. - Continuation est une expression boolenne faisant intervenir le compteur, qui autorise la continuation de la boucle tant qu'elle est vraie. - Incrmentation est une instruction indiquant la faon dont le compteur est modifi chaque itration. Au dmarrage l'initialisation du compteur est effectue, puis le test de continuation est valu, si la valeur est FALSE, les instructions ne sont pas excutes et le programme sort de la boucle, sinon les instructions sont excutes et le compteur est incrment pour l'itration suivante. Le cas le plus courant est une boucle du type :
Elments de PHP
10/54
qui correspond l'ajout de 1 au compteur, chaque itration. Pour soustraire 1 au compteur chaque itration on utiliserait $compteur--, en lieu et place de $compteur++. Si l'on voulait utiliser un autre pas pour le compteur, on crirait :
<?php for($compteur=debut; $compteur<max; $compteur+=pas) instruction(s) ?>
Exemple de boucles for imbriques : construction d'un tableau HTML 5 lignes et 4 colonnes contenant les 20 premiers entiers.
<table border="1" align="center"> <?php // iniatilisation de l'lment mis dans le tableau HTML $element=0; //$li compteur de ligne for($li=0;$li<5;$li++) { //balise de dbut de ligne ?> <tr> <?php //$col compteur de colonnes for($col=0;$col<4;$col++) { //balise de dbut de cellule ?> <td> <?php $element++; //criture de l'lment echo $element; //balise de fin de cellule ?> </td> <?php //fin de la boucle sur $col } //balise de fin de ligne ?> </tr> <?php //fin de la boucle sur $li } //balise de fin de tableau ?> </table>
Elments de PHP
11/54
L'instruction while
La boucle while est une boucle plus gnrale. Un ensemble d'instruction est excut tant qu'une condition est vrifie. Cette boucle est trs utile quand on ignore combien de fois la boucle doit tre excute ou plus prcisment quand on ne pas lier l'excution de la boucle un compteur, par exemple lecture d'un fichier jusqu' la rencontre de la fin de fichier, traitement du rsultat d'une requte sur une base de donne etc. La syntaxe est la suivante :
<?php while (condition) instruction(s) ?>
si instructions comprend plusieurs instructions celles ci doivent tre mises entre accolades. Condition reprsente une expression boolenne qui doit, bien videmment, tre modifie chaque itration. Comme pour le if, la condition peut-tre une affectation suivie d'une conversion : while($a=$b){ }, il faut bien faire attention ce que $b soit modifi au cours des itrations. Exemple, ce petit programme compte le nombre de jour, entre le jour courant et le premier vendredi suivant :
<?php //rcupre le temps du jour en seconde ( partir du temps 0 du calendrier :1 janvier 1970) $jour=time(); // initialise 0 le nombre de jours $nb=0; //date("l",$jour) donne le nom du jour while (date("l",$jour)!="Friday") { // ajouter 1 au nombre de jours $nb++; //passer au jour suivant (60*60*24 secondes par jour) $jour=$jour+60*60*24; } echo "Il reste $nb jours"; ?>
L'instruction foreach
L'instruction foreach permet d'explorer tous les lments d'un tableau dont les cls sont inconnues aussi bien en nombre qu'en valeur. Cette instruction peut prendre deux formes suivant que l'on veuille ou non utiliser les cls du tableau. Dans tous les cas l'exploration du tableau se fait dans l'ordre de la cration des valeurs du tableau et non pas dans l'ordre croissant des cls. La premire forme permet d'explorer uniquement les valeurs du tableau. La syntaxe est la suivante :
<?php foreach($nomdutableau as $elementdutableau) instruction ?>
instruction tant une instruction simple ou un bloc d'instructions entre accolades. $nomdutableau est le nom de la variable associe un tableau existant, tandis que $elementdutableau est une variable qui va recevoir les diffrentes valeurs du tableau, valeurs qui seront utilise dans le bloc d'instruction.. Exemple :
<?php $arr[2]="l'ami"; $arr[3]="Martin";
Elments de PHP
12/54
provoquera l'affichage :
l'ami Martin Bonjour
Array correspondant au cas o l'une des valeurs est un tableau (ici la valeur correspondant la cl "livraison"). La deuxime forme de l'instruction foreach permet d'obtenir en plus la cl du tableau, la syntaxe est la suivante :
<?php foreach($nomdutableau as $cle=>$elementdutableau) instruction ?>
instruction tant une instruction simple ou un bloc d'instruction entre accolades. $nomdutableau est le nom de la variable associe un tableau existant, $cle est une variable qui va recevoir les diffrentes valeur de la cl, $elementdutableau est une variable qui va recevoir les diffrentes valeurs du tableau, valeurs qui seront utilise dans le bloc d'instruction.. Exemple :
<?php $arr[2]="l'ami"; $arr[3]="Martin"; $arr[1]="Bonjour"; foreach($arr as $cle=>$elt) echo "$cle - $elt<br>"; ?>
Mais le problme demeurera pour l'exemple du paragraphe sur les tableaux. Pour rsoudre ce problme il faut utiliser la notion de fonction rcursive, pour le lecteur averti voici une solution et l'affichage rsultant (la fonction gettype($variable) retournant une chane de caractres correspondant au type de la variable):
<?php //fonction rcursive d'criture d'un lment function ecrit($a) // on teste si le type de la variable est un tableau {if (gettype($a)=="array") //si oui on explore les lments du tableau avec un retrait positif gauche {echo "<blockquote>"; foreach ($a as $cle=>$elt) {echo "<li>$cle : "; ecrit($elt) ;} echo "</blockquote>";} // sinon on affiche l'lment else{echo "$a <br>";} }
Elments de PHP
13/54
//exemple d'application $arr= Array ( 0 => 12.5, 5 => "bonjour", "civilit" => "Monsieur", "livraison" => Array ( "rue" => "Avenue du bois", "numro" => 12, "code postal" => "94122" ), 345 ); ecrit($arr); ?>
le rsultat tant :
0 : 12.5 5 : bonjour civilit : Monsieur livraison : rue : Avenue du bois numro : 12 code postal : 94122 6 :345
Elments de PHP
14/54
Les formulaires
Les formulaires correspondent aux zones de saisie sur une page HTML, le contenu de ces zones peut-tre pass au serveur principalement sous deux formes, soit par l'URL aprs un "?", c'est la mthode GET, soit dans l'en-tte de la requte http envoye au serveur, c'est la mthode POST, c'est cette mthode que nous utiliserons. La balise de formulaire contient le nom de la page PHP requise pour la rponse (dans la proprit action), ainsi que la mthode utilise : <form method="POST" action="traite_formu.php" name="Saisie des donnes" > Un formulaire est compos de plusieurs lments de saisie, et sera cr l'aide d'un outil de construction de site web tel que Frontpage ou Dreamweaver. Chaque zone de saisie, appele contrle, comporte une balise qui correspond la nature du contrle, une proprit "name" qui sera utilis pour la rcupration des donnes, une proprit "value" qui correspond l'entre du client et quelquefois une proprit type qui spcialise le contrle. Le fichier correspondant la proprit action devra donc traiter ces valeur, aprs les avoir rcuprer dans une variable superglobale $_GET ou $_POST suivant la mthode employe.
Les espaces de texte Les espaces de texte permettent de saisir plusieurs lignes de texte. La balise de ce contrle est "textarea". La rcupration se fera comme pour la zone de texte. Les cases d'option Ces contrles, appels en anglais radio buttons, correspondent un choix unique parmi plusieurs possibilits, l'utilisateur cliquera sur l'un des choix. La balise de ce contrle est aussi "input", le type de ce contrle est "radio", tous les boutons correspondant l'ensemble des choix portent le mme nom, il est souvent commode d'affecter la proprit "value" de chaque bouton correspond l'intitul du choix. Pour indiquer un choix par dfaut on ajoutera checked au bouton correspondant.
Elments de PHP
15/54
Voici un script qui permet de crer un ensemble de cases d'option, avec les intituls correspondants:
Que prfrez vous?</p> <?php // tableau contenant les intituls mis en valeurs $lieux=array("Ville","Montagne","Mer","Campagne","Indiffrent"); for($i=0;$i<5;$i++) { ?> <input type="radio" value= <?php echo $lieux[$i]; // le choix par dfaut est le dernier if ($i==4){ //ici l'accolade est ncessaire pour insrer du HTML ?> checked <?php ;}// pour finir le if ?> name="choix"> <?php //criture de l'intitul sur la page HTML echo $lieux[$i]; } //fermeture de la boucle for ?>
Les lignes en italique correspondent du HTML, on voit ici qu'un script PHP peut ne pas tre en un seul morceau, mais tre interrompu par du langage HTML, ce qui limite la connaissance ncessaire de ce langage. Le rsultat de ce script sera :
La rcupration se fera plus simplement dans la mesure o la variable aura toujours une valeur, du moins si un dfaut a t fix :
<?php $choix=$_POST["choix"]; ?>
Les cases cocher Les cases cocher, correspondant la balise "input" et au type "checkbox", permettent des choix multiples. Ici contrairement aux cases d'options, il faudra donner un nom diffrent chaque case. Seules les cases coches seront envoyes au serveur. Si l'on a un nombre suffisant de choix, il est possible de stocker les valeurs dans un tableau PHP, dans ce cas le nom des cases cocher sera un nom de tableau c'est dire suivi de [], le mme pour l'ensemble des cases. L'exemple prcdent avec cette fois ci des cases cocher.
Que prfrez vous?</p> <?php // tableau contenant les intituls mis en valeurs $lieux=array("Ville","Montagne","Mer","Campagne","Etranger"); for($i=0;$i<5;$i++) { ?> <input type="checkbox" value=
Elments de PHP
16/54
<?php echo $lieux[$i]; ?> name="choix[]"> <?php //criture de l'intitul sur la page HTML echo $lieux[$i]; } //fermeture de la boucle for ?> </p>
Si les noms sont associs un tableau, on pourra pour le traitement des rsultats utiliser une boule foreach :
<?php if(isset($_POST["choix"])) { $choix=$_POST["choix"] foreach($choix as $elt) traiter elt } ?>
Les zones de liste droulante Ces zones, annonces par la balise "select" permettent l'utilisateur de choisir parmi une liste de choix prdfini, une valeur peut tre prslectionne. Leur cration peut se faire soit directement avec un outil de cration de page Web, soit par programme PHP sur un schma ressemblant celui vu prcdemment, mais dans ce cas, aprs la balise select de dfinition de la liste, chacune des options possibles est dclare dans une balise option sans proprit de nom puisque la valeur sera donne la balise "select". Ce qui conduit au programme suivant :
<form method=POST action=liste.php> Que prfrez vous?<select name="maliste"> <?php // tableau contenant les intituls mis en valeurs $lieux=array("Ville","Montagne","Mer","Campagne","Etranger"); for($i=0;$i<5;$i++) { ?> <option value= <?php echo $lieux[$i]." "; // par dfaut le premier choix if($i==1){ ?> selected <?php //fin du if ;} ?> > Remarque fermeture de la balise ouvrante option <? //affichage de la valeur
Elments de PHP
17/54
Pour rcuprer, sur le serveur, la valeur choisie par l'utilisateur on crira : <?php if(isset($_POST["maliste"])) $monchoix=$_POSY["maliste"]; ?> La zone cache Les informations entres par le client ne peuvent priori tre utilises que par le fichier correspondant la proprit action du formulaire. Si on doit utiliser ces informations dans un autre fichier, en complment de nouvelles informations, il ne faut videmment pas les redemander au client, une mthode consiste les mettre dans une zone cache du nouveau formulaire soumis au client. Cette zone est annonce par une balise "input" de type "hidden", sa valeur sera pratiquement toujours donne par programme :
<input type="hidden" name="mavar" value= <?php echo $mavar; ?> > remarque : fermeture de la balise input
La rcupration dans le fichier action se fait comme pour les zones de texte. La saisie d'un mot de passe Pour saisir un mot de passe, plutt que d'utiliser une zone de texte, on utilisera une zone qui ne fait pas apparatre en clair le texte tap par l'utilisateur. Ceci correspond une balise input de type "password". A l'cran n'apparaissent que des astrisques. Pour cela il suffit de crer une zone de texte et de changer le type dans la balise. On rcupre le mot de passe comme pour une zone de texte. Attention, le mot de passe n'est pas cod mais est transmis en clair Les boutons Pour dclencher l'envoi au serveur de la requte de l'URL rponse il est ncessaire de mettre dans le formulaire un ou plusieurs boutons. Ces boutons peuvent tre des boutons classiques : ou des images :
Pour les crer, on utilisera un outil de cration de page Web en insrant le contrle correspondant la balise "input" de type "submit" pour les boutons standards ou "image" pour
Elments de PHP
18/54
les images. Ne pas oublier de donner un nom ces contrles. Pour les boutons illustrs, on aurait les balises suivantes :
<input type="submit" value="Envoyer" name="Envoi"> <input type="submit" value="Rtablir" name="Retab"> <input type="image" src="poubelle.gif" name="poub" width="23" height="30">
Dans la page de rponse on utilisera le nom de ces contrles pour savoir lequel a t cliqu. Attention pour un contrle image, dans la variable $_POST, la cl correspondante est le nom du contrle suivi de "_x". Pour traiter dans le fichier de rponse les diffrents cas, il faudra avoir un code tel que :
<?php // bouton envoyer if(isset($_POST["Envoi"])) { traitement de l'envoi} // bouton rtablir elseif (isset($_POST["Retab"])) {traitement de rtablir) //image poubelle elseif (isset($_POST["poub_x"])) // attention au _x {traitement poubelle} ?>
Elments de PHP
19/54
pour cela qu'il est spcifi que domaine doit contenir au moins 2 points, pour viter l'envoi des gnriques tels que ".com". Le paramtre scuris vaut 1 pour l'envoi du cookie travers un protocole scuris, 0 sinon et par dfaut. La fonction setcookie ne renvoie pas d'indication sur l'acceptation du cookie par le client, il vous faut le vrifier la requte suivante. Exemple : envoi d'un cookie contenant la date du jour et expirant dans 10 jours :
< ?php $visite=date("d/m/y"); setcookie("visite", $visite, time()+60*60*24*10); ?>
Elments de PHP
20/54
Si le cookie est valeurs multiples, la variable $_COOKIE[] associe est alors un tableau.
Erreur viter
Les cookies sont envoys au navigateur dans les enttes HTTP, ce qui oblige les envoyer avant toute autre donne. Le script suivant :
<?php echo "Bonjour"; setcookie("essai", "essai_valeur"); ?>
va renvoyer : Bonjour Warning: SetCookie called after header has been sent in planco.php on line 3 Il faut donc que l'envoi de cookie se fasse sur les premires lignes. Le script suivant provoquera la mme erreur (les numros de ligne sont entre parenthses :
(1) (2) (3) (4) : : < ?php : setcookie("essai", "essai_valeur"); : ?>
Explication : ci-dessus, a la ligne 1, nous avons laiss un espace, donc cet espace tant avant la balise < ?, il sera renvoy tel quel au navigateur. Cet espace empche la cration du cookie. Tandis que le code suivant est correct :
(1) (2) (3) (4) < ?php : : setcookie("essai", "essai_valeur"); : ?>
La fonction session_start()
Cette fonction doit tre appele sur toutes les pages du site, elle permet de dmarrer une session ou d'appeler la session existante (rcuprer son identifiant). Il est ncessaire que cette fonction soit appele avant tout envoi au navigateur : pas de HTML, pas de fonction echo. Une bonne pratique est de la mettre en premire ligne de chaque page.
Elments de PHP
21/54
Tout ce qui est en italique concerne le code HTML. Ce fichier nomm "crevar.php", gre la fois le formulaire et le stockage des variables session. Aprs avoir dmarr ou appel la session, on vrifie que le pseudo a t rentr, si oui on effectue le stockage du pseudo et de l'heure de connexion puis on cre un lien (en HTML) vers un fichier de vrification (verif.php), sinon on affiche le formulaire. Voici les deux crans correspondant Formulaire Appel de la page de verif
Elments de PHP
22/54
et l'cran correspondant :
Pour supprimer une variable session, on utilisera la fonction unset(), exemple : unset($_SESSION["pseudo"]); Il est bien sr, possible de crer des variables session qui sont des tableaux, par exemple pour un panier on pourrait, par exemple, utiliser un tableau trois dimensions :
$_SESSION["panier"][$code_article]["quantit"]=$quant; $_SESSION["panier"][$code_article]["prix"]=$prix; .
Pour enlever du panier l'article de code stock dans la variable $code_article, il suffira alors de l'instruction :
unset($_SESSION["panier"][$code_article]);
Remarquez que l'on ne peut utiliser unset sur la variable $_SESSION, puisque c'est une variable superglobale, on dtruit uniquement son contenu avec un tableau vide.
Elments de PHP
23/54
La fonction mysql_connect() retourne un entier qui sera utilis dans d'autres fonctions, si PHP ne russit pas se connecter la fonction retourne FALSE. Dans le cas de non-connexion on obtient un message du type :
Il existe deux moyens pour viter ce message, le premier consiste utiliser la fonction die(message) qui arrte le script en envoyant un message indpendant de l'erreur de connexion et faire prcder l'usage de la fonction par un "@" qui bloque les messages d'erreur. @$icon=mysql_connect("localhost","root","") or die("Connexion impossible"); En cas d'chec la connexion on aura le rsultat suivant :
Si la connexion se passe correctement le script excutera les instructions suivantes. Toutefois dans ce cas on ne sait pas ce qui provoque l'chec de la connexion. Pour tre plus prcis, il est possible d'utiliser, aprs un test, la fonction mysql_error() qui retourne le message prcis de l'erreur puis la fonction exit qui arrte l'excution :
<?php if(! @ $icon=mysql_connect("localhost","root","jenesaispas")) {echo mysql_error(); exit();} instructions en cas de connexion; ?>
Elments de PHP
24/54
La connexion prend fin l'excution du script, il est donc ncessaire de se reconnecter dans chaque page.
Base est le nom de la base de donnes, connexion est l'identifiant retourn par la fonction mysql_connect. Le rsultat est un boolen TRUE si la base est trouve, FALSE sinon. Le script complet de connexion la base pourra tre le suivant :
<?php if(! @ $icon=mysql_connect("localhost","root","")) {echo mysql_error(); exit();} mysql_select_db("CDtheque",$icon) or die("Base inconnue"); ?>
2)Requte d'ajout d'un compositeur et de sa nationalit, le champ commentaire n'est pas rempli. Attention dans ce cas les valeurs, qui sont des chanes de caractres doivent tre guillemets :
<?php $nom="Puccini"; $natio="Italien"; $myquer='INSERT INTO `compositeurs` ( `Nom_C` , `Nationalit` ) VALUES ("'.$nom.'","'.$natio.'" ); '; //noter les " pour les chanes! if(!mysql_query($myquer))echo "Ajout impossible"; ?>
Elments de PHP
25/54
qui, chaque appel, donne un tableau, correspondant une nouvelle ligne de la table, indic partir de 0 pour chacun des lments de la ligne, ou la fonction :
mysql_fetch_array(rsultat de la requte);
qui,elle, donne un tableau associatif de la ligne o la cl est soit le nom du champ, soit comme pour la fonction prcdente un indice commenant 0. Cette dernire fonction rend les scripts plus lisibles si on utilise la cl. Quand on arrive la fin de la table, la fonction retourne un tableau vide qui peut tre converti en boolen FALSE, d'o la structure d'analyse du rsultat d'une requte :
While(enr=mysql_fetch_array($result)){traitement}
Illustrons cette analyse en affichant le titre du CD, sa rfrence, son compositeur dans le cas du paragraphe prcdent. Avec la fonction mysql_fetch_row :
<?php $editeur="Deutsche Grammophon"; $myquer='SELECT * FROM `cd` WHERE `n_editeur`LIKE "'.$editeur.'"'; $result=mysql_query($myquer); while($enr= mysql_fetch_row($result)) echo "titre:$enr[1] Rfrence:$enr[5] Compositeur:$enr[3]<br>"; ?>
Avec la fonction mysql_fetch_array, on pourrait utiliser le mme script, mais en utilisant les cls, il faut alors utiliser l'oprateur de concatnation puisque ces cls sont des chanes de caractres :
<?php $editeur="Deutsche Grammophon"; $myquer='SELECT * FROM `cd` WHERE `n_editeur`LIKE "'.$editeur.'"'; $result=mysql_query($myquer); while($enr= mysql_fetch_array($result)) echo "titre:".$enr["titre_cd"]." Rfrence:".$enr["Reference"]." Compositeur:".$enr["n_compo"]."<br>"; ?>
Remarque : les noms des champs, ou l'ordre des champs, ne correspondent pas ncessairement la base qui vous a t donne. Il existe aussi une fonction donnant le nombre de lignes dans la table rsultat de la requte, ce qui est utile pour vrifier qu'il existe au moins un enregistrement correspondant celle ci : $nblignes=mysql_num_rows($result);
Elments de PHP
26/54
Elments de PHP
27/54
Exemple, lecture d'un fichier se trouvant dans le rpertoire "Monautresite" du mme domaine :
<?php $fichier="../Monsite_1/Berlioz.jpg"; @$fh=fopen($fichier,"r") or die( "Impossible d'ouvrir le fichier"); $p=fread($fh,filesize($fichier)); Traitement fclose($fh); ?>
Remarques : 1. Il est possible de lire en entier un fichier sans utiliser de handle avec la fonction file(nom du fichier) qui retourne les octets dans un tableau. Chaque lment du tableau correspond une ligne du fichier. Il faut dans ce cas s'assurer avant d'utiliser la fonction file() que le fichier existe bien par la fonction file_exists(nom du fichier). Exemple :
<?php $fichier="montest.txt"; if(file_exists($fichier)) { $p=file($fichier); for($i=0;$i<count($p);$i++) echo $p[$i]."<br>"; } ?>
2. Si l'on veut lire un fichier et uniquement l'afficher (par exemple une image), on peut utiliser la fonction fpassthru(handle). En fait cette fonction permet d'afficher le reste du fichier partir du point o en est la lecture. Cette fonction retourne le nombre d'octets lus. Exemple :
<?php $fichier="../Monsite_1/Berlioz.jpg"; @$fh=fopen($fichier,"r") or die( "Impossible d'ouvrir le fichier"); fpassthru($fh); fclose($fh); ?>
Elments de PHP
28/54
Remarques sur le script : $premat donne la position du premier @ $deuxat cherche un deuxime @, donc la position de dbut est $premat+1 Pour que l'adresse soit acceptable, il faut que la premire recherche soit fructueuse (donc un rsultat transform en boolen TRUE) et que la deuxime retourne la valeur FALSE.
Elments de PHP
29/54
Lors du premier appel du fichier on obtient l'cran suivant (rempli par l'utilisateur):
Elments de PHP
30/54
is_dir() permet de savoir si le fichier dont le nom est pass en paramtre correspond un rpertoire is_dir(Nom du fichier); La fonction is_dir() renvoie TRUE s'il s'agit d'un rpertoire, FALSE dans le cas contraire is_executable() permet de savoir si le fichier dont le nom est pass en paramtre est excutable is_executable(Nom du fichier); La fonction is_executable() renvoie TRUE si le fichier est excutable, FALSE dans le cas contraire is_file() permet de savoir si le fichier dont le nom est pass en paramtre ne correspond pas un rpertoire. is_file( Nom du fichier); La fonction is_file() renvoie TRUE s'il s'agit d'un fichier, FALSE dans le cas contraire fileatime() permet de connatre la date et l'heure du dernier accs au fichier. fileatime(Nom du fichier) La fonction fileatime() retourne la date et l'heure du dernier en nombre de secondes depuis le 1 janvier 1970, il vous faut donc utiliser la fonction date() pour visualiser facilement ce rsultat. Exemple :
<?php $fichier="montest.txt"; $date=fileatime($fichier); $cdate=date("l d/m/y H:m:s",$date); echo "le dernier accs a eu lieu le : $cdate"; ?>
filemtime() permet de connatre la date et l'heure de la dernire modification du fichier. filemtime(Nom du fichier) La fonction filemtime() retourne la date et l'heure du dernier en nombre de secondes depuis le 1 janvier 1970, il vous faut donc utiliser la fonction date() pour visualiser facilement ce rsultat. unlink() permet de supprimer un fichier. unlink(Nom du fichier)
Elments de PHP
31/54
et l'apparence :
Remarque : vous pouvez limiter la taille maximum du fichier tlcharg en ajoutant au formulaire de saisie un champ cach fixant la constante MAX_FILE_SIZE. Ici par exemple pour limiter 100Koctets :
<input type="hidden" name="MAX_FILE_SIZE" value="100000">
Le script de rponse
Le script de rponse reoit dans la variable superglobale $_FILES un tableau contenant les informations suivantes : $_FILES["fichier"]["name"] : fournit le nom d'origine du fichier. $_FILES["fichier"]["type"] : fournit le type MIME du fichier. $_FILES["fichier"]["size"] : fournit la taille en octets du fichier. $_FILES["fichier"]["tmp_name"] : fournit le nom temporaire du fichier. $_FILES["fichier"]["error"] : fournit le code d'erreur associ au tlchargement. La taille maximum d'un fichier tlchargeable est fixe par la directive upload_max_filesize du fichier php.ini et est par dfaut de 2Mo. Les codes erreurs sont des constantes dfinies par PHP, toutefois il est plus simple d'utiliser la fonction is_uploaded_file() qui retourne TRUE si le tlchargement s'est bien pass, FALSE sinon : is_uploaded_file($_FILES["fichier"]["tmp_name"]) C'est le nom du fichier temporaire qui est utilis comme paramtre dans cette fonction boolenne. Si le chargement s'est pass correctement, pour sauvegarder le fichier sur le serveur on utilisera la fonction move_uploaded_file() qui a deux paramtres le nom du fichier temporaire, le nom du fichier destination : move_uploaded_file(fichier temporaire, fichier destination) qui retourne TRUE si le dplacement se passe bien, FALSE sinon. Cette fonction ne peut-tre utilise qu'avec la mthode POST. Voici le script de rponse :
<?php if (isset($_FILES["fichier"])) { // le tlchargement est-il OK? if(is_uploaded_file($_FILES["fichier"]["tmp_name"])) {// dplacement du fichier dans le rpertoire images avec le nom d'origine $destination="images/".$_FILES["fichier"]["name"]; //on garde ventuellement la taille $taille=$_FILES["fichier"]["size"]; move_uploaded_file($_FILES["fichier"]["tmp_name"], $destination); traitement ventuel du fichier destination } else {echo "Le tlchargement a chou";} } ?>
Elments de PHP
32/54
Elments de PHP
33/54
Remarque nous avons utilis ici la fonction DEFINE pour dfinir une constante du script, la syntaxe de cette fonction est : DEFINE(nom de la constante(chane de caractres), valeur)
Elments de PHP
34/54
La fonction include
La fonction include permet d'inclure dans un script PHP un autre script sauvegard dans un fichier php. La syntaxe de la fonction est : include("nom du fichier inclure"); Par exemple, dans la mesure o la plupart des scripts vont faire appel la connexion la base de donnes, on peut conserver les instructions de connexion dans un fichier nomm connect.php et l'inclure dans les autres scripts. Le fichier connect.php, contiendra sera :
<? mysql_connect("host","utilisateur","mot de passe") or die(mysql_error()); mysql_select_db("mabase") or die(mysql_error()); ?>
Les autres fichiers du site contiendront alors dans le script PHP, l'instruction
include("connect.php");
Cette fonction peut aussi tre utilise, par exemple, pour avoir une prsentation standard des diffrentes pages du site, sous forme de tableau, une structure gnrale pouvant tre :
<table width="100%"> <tr> <td colspan="2"> <? //en tte standard aprs fusion de deux cellules include("entete.php"); ?></td> </tr> <tr> <td width="100"> <? //menu gauche largeur de 100 pixels include("menu.php"); ?> </td> <td> <? //lecontenu de la page include("page_contenu.php"); ?> </td> </tr> <tr> <td colspan="2"> <? // bas de page standard aprs fusion des deux cellules include("bas_page.php"); ?> </td> </tr> </table>
Elments de PHP
35/54
La fonction str_replace
Cette fonction permet de remplacer des chanes de caractres dans un texte, la syntaxe de cette fonction est : $chaine=str_replace(cible, remplacement, texte); Les trois lments peuvent tre soit des chanes de caractres soit des tableaux. Si cible et remplacement sont deux chanes de caractres toutes les occurrences de cible dans texte ( ou tous les lments du tableau texte) sont remplacs par remplacement. Si cible seul est un tableau, chaque occurrence d'un des lments de cible est remplac par remplacement dans texte. Si cible et remplacement sont des tableaux, le nombre d'lments de remplacement (pris en compte) est infrieur ou gal au nombre d'lment de cible. Chaque occurrence du premier lment de cible est remplace dans texte par le premier lment de remplacement, puis le second etc.. Si le nombre d'lments de remplacement est infrieur au nombre d'lments de cible, les lments surnumraires de cibles sont remplacs par une chane vide.
$tableau[0]="gil.dupond" et $tableau[1]=ici.com La fonction implode est la duale de la fonction explode, elle permet de recoller les lments d'un tableau en une chane de caractres, chaque lment tant spar du suivant par le sparateur choisi. La syntaxe de la fonction est : $chaine=implode("sparateur","tableau"); Par exemple, on pourra construire une adresse mel, partir du nom et du domaine avec le sparateur "@". Avec le tableau prcdent : $adresse=implode("@",$tableau); donnera : $adresse=gil.dupond@ici.com
La fonction strtok
La fonction strtok est une extension de la fonction explode vue prcdemment dans la mesure o l'on peut utiliser plusieurs sparateurs, la dcomposition de la chane de caractres se fait alors en jetons, c'est dire en lments se trouvant entre deux sparateurs (identiques ou non). Contrairement la fonction explode, qui extrait tous les lments dans un tableau, la fonction strtok extrait au fur et mesure les jetons, et doit donc tre appele plusieurs fois pour extraire tous les jetons, la syntaxe de la fonction est diffrente selon que l'on extrait le premier jeton ou les suivants. Pour extraire le premier jeton, on utilisera la syntaxe : $mot=strtok("phrase","liste des sparateurs"); o liste des sparateurs est la suite des caractres sparateurs (par exemple " ,." pour l'espace, la virgule ou le point). Dans les appels suivants, pour extraire les autres jetons, on utilisera la syntaxe : $mot=strtok("liste des sparateurs"); A la fin de la chane de caractres analyser, la fonction retourne la valeur boolenne FALSE, qu'il faudra tester avec === ou !==, pour viter d'arrter avec un jeton vide (par exemple deux espaces conscutifs dans l'exemple prcdent). Exemple : comptage des mots d'un texte : <?
// Le texte analyser a t entr dans une zone de texte $texte=$_POST["texte"]; // les sparateurs : espaces, virgule, point, point virgule, parenthse, deux points $separateur=" ,.;():"; // extraction du premier token $mot=strtok($texte,$separateur); while ($mot!==FALSE) { // si le token n'est pas vide if($mot) { // initialisation du compteur ou incrmentation(le mot est mis en minuscule) $mot=strtolower($mot); if (isset($compteur[$mot]) ) {$compteur[$mot]++;} else {$compteur[$mot]=1;} } // on passe au token suivant $mot=strtok($separateur); } //Ecriture des rsultats foreach($compteur as $token=>$nb) echo "$token : $nb<br>"; ?>
Elments de PHP
37/54
Elments de PHP
38/54
Remarque : sur ces exemples nous avons vu que certains caractres : ?, [, {, \,], } avait une signification particulire dans le modle, si nous voulions les retrouver dans un modle il faudrait les faire prcder du caractre d'chappement \, nous reviendrons sur ce cas plus loin. Expressions rgulires pour signes distincts Dans une chane de caractres, il est possible rechercher un caractre dtermin rechercher plusieurs caractres dtermins rechercher un caractre d'un passage dtermin Ces expressions ne sont pas suffisantes par elles mmes mais doivent tre combines comme dans les exemples prcdents. Expression Interprtation a contient un 'a' [ab] contient un 'a' ou un 'b' [A-Z] contient une majuscule (sans accent ni cdille) [0-9] contient un chiffre \d contient un chiffre - exactement \D contient un caractre qui n'est pas un chiffre [-\d] contient un chiffre ou le caractre moins [\[\]] contient un crochet [a-zA-Z0-9_] contient un caractre du type lettre (sans accent ni cdille), de type chiffre ou tiret de soulignement \w contient un caractre des types lettre, chiffre ou tiret de soulignement (presqu'exactement comme le prcdent; si ce n'est que les caractres avec accent peuvent tre reconnus suivant la configuration du systme \W contient un caractre qui n'est ni une lettre, ni un chiffre, ni un tiret de soulignement les caractres avec accent peuvent tre exclus, dpend de la configuration du systme [^a-zA-Z] contient un caractre qui n'est pas une lettre (sans accent) Quand le signe recherch est un signe rserv l'intrieur d'expressions rgulires, comme par exemple un +,, vous devez le faire prcder de la barre oblique inverse (\+).Les signes rservs sont : +?.*^$()[]{}|\. Expressions rgulires pour chanes de caractres Ces expressions permettent de spcifier : une chane de caractres dtermine une chane de caractres avec des oprateurs de remplacement (jokers) une chane de caractres au dbut ou la fin d'un mot une chane de caractres au dbut ou la fin d'une ligne Ce genre d'expressions rgulires intervient dans la construction d'un modle pour la recherche de l'occurrence d'un certain mot, d'une chane de caractres partielle. Les expressions rgulires sont ainsi constitues de mots relis par des rgles grammaticales, la liaison se faisant par des oprateurs. La forte compression du langage le rend prime abord assez hermtique. Expression rgulire Effet aus la recherche doit contenir 'aus' comme dans 'pause' ou 'Gauss' aus? la recherche doit contenir soit 'aus' soit 'au' a. la recherche doit contenir une chane de deux caratres
Elments de PHP
39/54
a+ a* te.s te.+s te.?s x{10,20} x{10,} x.{2}y Jean\b \bvers \bvers\b \bvers\B ^Jean Jean$ (jpg|gif|bmp) $Nom
commenant par 'a' la recherche doit contenir au moins une fois la lettre 'a' la recherche doit contenir pas de ou un nombre quelconque de lettres 'a' la recherche doit contenir une chane de 4 lettres commenant par te et finissant par s. la recherche doit contenir une chane d'au moins 4 caractres commenant par te et finissant par s la recherche doit contenir une chane d'au moins 3 caractres commenant par te et finissant par s la recherche doit contenir entre 10 et 20 'x' la suite la recherche doit contenir au moins 10 'x' la suite la recherche doit contenirune chane de 4 caractres commenant par x et finissant par y la recherche doit contenir 'Jean' mais pas 'Jeannot' (limite du mot) la recherche doit contenir 'verser' ou 'versatile' mais pas 'envers' (limite du mot) la recherche doit contenir 'vers' mais pas 'envers' ni 'verser' (limite du mot) la recherche doit contenir 'verser' mais ni 'vers' et ni 'envers' (limite du mot et limite du mot "ngative") la recherche doit contenir 'Jean' seulement au dbut du passage parcourir la recherche doit contenir 'Jean' seulement la fin du passage parcourir la recherche doit contenir 'jpg' ou gif ou bmp interprte le contenu de la variable $Nom comme expression
Utilisation et utilit des parenthses dans un modle. Les parenthses sont utilises dans les expressions rgulires deux fins, exceptes bien sur dans le cas o elles sont prcdes de la barre oblique inverse auquel cas l'expression rgulire considre le caractre ( ou ) comme faisant partie de la recherche. Tout d'abord les parenthses peuvent tre utilises comme une mise en facteur d'lments, c'est ce que nous avons vu sur l'exemple du numro de tlphone ci-dessus ou dans le cas de recherche disjonctive. L'utilit des parenthses est aussi une aide la rcupration de chanes dans la mesure o un niveau de variables (indice d'un tableau) sera associ au mme niveau de parenthse. Par exemple, le modle /code postal : (\d{5})/ permettra de rcuprer dans la variable de niveau 0, toute la chane "code postal : 75001", tandis que la variable de niveau 1 ne rcuprera que le code postal seul :75001. Exemple modle pour retrouver les fichiers images dans une fichier HTML Nous ne nous intresserons ici qu' la balise image du fichier (pas au image de fond de page par exemple)le fichier image est dfini aprs la proprit scr, le nom du fichier est entre guillemets et se termine par jpg, gif ou png. Le modle sera alors le suivant : /src="([\w].*\.(jpg|gif|png))"/Ui Explications : on spcifie que le nom de fichier doit commencer par un caractre autoris (lettre, chiffre ou soulignement) puis un nombre quelconque de caractres, suivi du point
Elments de PHP
40/54
(noter la barre oblique inverse) et de l'extension. La "gourmandise" est limite la premire occurrence de ce type de chane pour ne pas dpasser le nom du fichier par exemple si deux images sont sur la mme ligne. Il est de plus spcifi que l'on ne tient pas compte de la casse. Il est laiss au lecteur la modification de ce modle pour prendre en compte d'ventuels espaces entre le signe = et le mot cl scr ou le premier guillemet. Enfin le nom de fichier est conserv dans la variable de niveau 1, la variable de niveau 0 contenant l'ensemble de la chane trouve. Les fonctions preg_match et preg_match_all Ces deux fonctions permettent de rechercher dans un texte et ventuellement de stocker dans un tableau multidimensionnel les rsultats de la recherche d'une chane de caractres suivant un modle. Ces fonctions retournent le nombre d'occurrences, correspondant au modle, trouves dans le texte. La syntaxe de ces fonctions est : $noc=preg_match_all($modele,$texte,$result); $nb=preg_match($modele,$texte,$result); o $modele correspond la chane de caractre servant de modle, $texte est la chane explorer et $result est un tableau contenant les chanes de la variable $texte satisfaisant le modle. Dans le cas de preg_match la recherche s'arrte la premire correspondance, la valeur retourne est donc 0 ou 1, dans le cas de preg_match_all la recherche se poursuit jusqu' la fin du texte. La fonction preg_match est donc surtout utilise pour vrifier l'adquation un modle, tandis que preg_match_all sera plutt utilis pour extraire des informations du texte. Exemple 1 : vrification d'un numro de tlphone au format standard. Le script suivant permet de vrifier qu'un numro entr par l'utilisateur peut correspondre un numro de tlphone :
<body> <?php //On vrifie que l'utilisateur a cliqu sur le bouton de validation if(isset($_POST["valid"])) { $modele="/0[1-68][-. ]?(\d{2}[-. ]?){3}\d{2}/"; $nb=preg_match ($modele,$_POST["Tel"],$result); if($nb) { //Le numro est valide echo "Nous avons bien not que votre Tel est :".$result[0][0]; exit(); } //Sinon affichage d'un message et demande nouveau du numro else echo "<b> Votre numro est mal entr, veuillez recommencer</b>"; } ?> <form method="POST" action="tel.php"> <p>N Tel <input type="text" name="Tel" size="26"> <input type="submit" value="OK" name="valid"></p> </form> </body>
Le formulaire est affich dans deux cas : avant toute entre et en cas de non conformit du numro entr. Le modle utilis est celui qui a t prsent en introduction, si le numro est valide on l'affiche, remarquez les deux indices du tableau $result, le premier correspond au tableau du premier niveau de parenthses, le second est l'indice (la cl) du seul lment de ce tableau.
Elments de PHP
41/54
Exemple 2 : extraction des noms des fichiers images d'une page HTML. Nous utiliserons ici le modle dfini prcdemment, les noms de fichiers seront stocks dans le tableau d'indice 1 correspondant au niveau de parenthse du nom de fichier. La fonction utilise sera preg_match_all, puisque nous voulons tous les noms de fichiers, on liminera les doublons avec la fonction array_unique (voir ci dessous). Le script est le suivant :
<?php if($f=@fopen("index.htm","r")) { // lecture du fichier htm $text=fread($f,filesize("index.htm")); fclose($f); } else { //Erreur l'ouverture echo "Impossible d'ouvrir le fichier"; exit; } $modele='/src="([\w].*\.(jpg|gif))"/Ui'; $nb=preg_match_all ($modele, $text, $images); //Suppression des doublons dans les noms de fichier (indice 1 du tableau rsultat) $nomfic=array_unique($images[1]); echo "$nb correspondances et".count($nomfic)." fichiers distincts<br>"; //Affichage des noms des diffrents fichiers foreach($nomfic as $value) echo "$value <br>"; ?>
Les noms de fichiers se trouvent dans le tableau $result[1], le tableau $result[0] contenant l'ensemble de la chane de caractres src="". Avec comme fichier index.htm :
<body> <p><img border="0" src="images/logohec.gif" width="140" height="70"><font size="7">Le dpartement SIAD</font><img border="0" src="images/logohec.gif" width="140" height="70"></p> <p>Les membres du dpartement :</p> <table border="1" width="100%"> <tr> <td align="center"> <img border="0" src="images/YP.jpg" width="60" height="71"></td> <td align="center"> <img border="0" src="images/MT.jpg" width="60" height="71"></td> <td align="center"> <img border="0" src="images/MHD.jpg" width="60" height="71"></td> <td align="center"> <img border="0" src="images/PLM.jpg" width="60" height="71"></td> </tr> <tr> <td align="center"> <img border="0" src="images/BLM.jpg" width="60" height="71"></td> <td align="center"> <img border="0" src="images/HT.jpg" width="60" height="71"></td> <td align="center"> <img border="0" src="images/JO.jpg" width="60" height="71"></td> <td align="center"> <img border="0" src="images/GM.jpg" width="60" height="71"></td> </tr> <tr> <td align="center"> <img border="0" src="images/JMG.jpg" width="60" height="71"></td>
Elments de PHP
42/54
La fonction array_unique
La fonction array_unique permet d'liminer les doublons dans un tableau, la fonction renvoie un tableau aprs suppression des doublons,en prservant les cls, en cas de doublon la premire cl est conserve. La syntaxe est la suivante : $tablo=array_unique($montablo); Par exemple le script suivant donnera comme rsultat un tableau 3 lments dont les cl seront 0,1,4 et les lments 1,2,7 :
<?php $montab=array(1,2,1,2,7,7,1); $ntab=array_unique($montab); print_r($ntab); ?>
le rsultat du script est : Array ( [0] => 1 [1] => 2 [4] => 7 )
Elments de PHP
43/54
Remarque : si l'on veut retrouver les cls "naturelles" numriques conscutives (0,1,), on utilisera la fonction array_values, qui remplace les cls par des entiers conscutifs, le script suivant :
<?php $montab=array(1,2,1,2,7,7,1); $ntab=array_unique($montab); $ntab=array_values($ntab); print_r($ntab); ?>
Le rsultat de ce programme sera alors : Array ( [0] => boy [1] => child [2] => girl [3] => man [4] => woman ) Tri sur les valeurs avec conservation des cls Comme il est souvent utile de conserver les cls, PHP possde deux fonctions de tri sur les valeurs avec conservation de cls, ce sont les fonction asort (tri croissant) et arsort (tri dcroissant), dont la syntaxe est identique celle de sort : asort($tabo,type de comparaison);
Elments de PHP 44/54
La sortie correspondante sera : La valeur : boy pour la cl : garon La valeur : child pour la cl : enfant La valeur : girl pour la cl : fille La valeur : man pour la cl : homme La valeur : woman pour la cl : femme Tri sur les cls Il est aussi possible de trier un tableau par rapport ses cls, pour cela on utilise la fonction ksort pour un tri croissant ou la fonction krsort pour un tri dcroissant. La syntaxe de ces fonction est identique celle de sort : asort($tabo,type de comparaison); ou arsort($tabo,type de comparaison); Le script suivant utilise la fonction krsort :
<?php $voca=array( "homme"=>"man", "femme"=>"woman", "enfant"=>"child", "garon"=>"boy", "fille"=>"girl" ); //tri dcroissant sur les cls krsort($voca); foreach($voca as $cle=>$valeur) echo "A la cl $cle est associe la valeur $valeur<br>"; ?>
et la sortie correspondante : A la cl homme est associe la valeur man A la cl garon est associe la valeur boy A la cl fille est associe la valeur girl A la cl femme est associe la valeur woman A la cl enfant est associe la valeur child Tri sur plusieurs valeurs Quand on utilise un tableau deux dimensions, c'est dire un tableau de vecteurs, il est possible de faire un tri multicritre, c'est dire que l'on trie d'abord sur un vecteur et en cas
Elments de PHP
45/54
d'ex quo, sur un deuxime vecteur, et ainsi de suite. En fait la fonction de PHP, n'impose pas que les vecteurs soient dans un mme tableau, mais simplement que les vecteurs aient le mme nombre de composants. La syntaxe de la fonction est la suivante : array_multisort(vecteur1,sens1,vecteur2,sens2,); o sens1 est une constante indiquant si le tri sur le vecteur le prcdant est en ordre croissant ou dcroissant, cette constante est dfinie par PHP : SORT_ASC croissant SORT_DESC dcroissant Exemple, on veut trier la liste des employs par dpartement, puis par nom l'intrieur des dpartements. Le tableau suivant donne cette liste : Nom Prnom Dpartement Leroy Emile Finance Moi Gilles Compta Lui Alain Finance Dupont Mathieu Compta Dupont Grard Compta Le script suivant trie ce tableau en ordre croissant sur les dpartements, dcroissant sur les noms et croissant sur les prnoms, puis affiche le rsultat dans un tableau :
<?php $lesgens=array( "Nom"=>array("Leroy","Moi","Lui","Dupont","Dupont"), "Prenom"=>array("Emile","Gilles","Alain","Mathieu","Grard"), "Dpt"=>array("Finance","Compta","Finance","Compta","Compta") ); array_multisort( $lesgens["Dpt"],SORT_ASC, $lesgens["Nom"],SORT_DESC, $lesgens["Prenom"],SORT_ASC); ?> <table border=1> <tr><td align="center">Nom</td> <td align="center">Prnom</td> <td align="center">Dpartement</td></tr> <?php foreach($lesgens["Nom"] as $cl=>$valeur) { echo "<tr>"; foreach($lesgens as $pcl=>$stab) echo "<td>".$lesgens[$pcl][$cl]."</td>"; echo "</tr>"; } ?> </table>
Elments de PHP
46/54
Remarques : 1. il serait plus "naturel" que les sous tableaux correspondent aux caractristiques d'un individu c'est dire que la dclaration du tableau $lesgens soit plutt :
$lesgens=array( array("Nom"=>"Leroy","Prnom"=>"Emile","Dpartement"=>"Finance"), array("Nom"=>"Moi","Prnom"=>"Gilles","Dpartement"=>"Compta"), array("Nom"=>"Lui","Prnom"=>"Alain","Dpartement"=>"Finance"), array("Nom"=>"Dupont","Prnom"=>"Mathieu","Dpartement"=>"Compta"), array("Nom"=>"Dupont","Grard"=>"Mathieu","Dpartement"=>"Compta"), );
mais dans ce cas nous ne pourrions pas utiliser la fonction array_multisort. 2. Il est indispensable de mettre comme paramtres de la fonction tous les sous tableaux sinon les tableaux absents ne seraient pas aligns sur le tri. En particulier, il est impossible en cas d'ex quo, de ne pas trier sur un des vecteurs restants. Nous verrons plus loin comment traiter ce problme.
Elments de PHP
47/54
Syntaxe
La syntaxe est la suivante : function nom_fonc(param1,param2,) { corps de la fonction return (valeur__retourner) ; } Lappel de la fonction se faisant par une instruction du type : monresult=nom_fonc(p1,p2,..) La fonction suivante permet de retrouver toutes les cls correspondant la valeur maximale dun tableau : function clemax($tablo) { $max=max($tablo); foreach ($tablo as $cle=>$valeur) if ($valeur==$max) $mcle[]=$cle; return($mcle); } Lexcution par le programme suivant : $mont=array(1,5,2,4,5,1,5,2); print_r(clemax($mont)); donnera : Array ( [0] => 1 [1] => 4 [2] => 6 ) Les cls 1,2 et 6 tant les cls correspondant au maximum (5) du tableau.
Valeur de $a modifie avant la sortie : 2 Aprs retour de la fonction $a vaut : 1 Pour prendre en compte la variable $a du script, il faut la dclarer comme globale dans la fonction, le script modifi : <?php $a=1; //variable globale du script function demo() { Global $a ; // permet daccder la variable du script echo 'Valeur de $a en entre : ',$a,"<br />"; $a=2; echo 'Valeur de $a modifie avant la sortie : ',$a,"<br />"; } demo(); echo 'Aprs retour de la fonction $a vaut : ',$a,"<br />"; ?> donnera : Valeur de $a en entre : 1 Valeur de $a modifie avant la sortie : 2 Aprs retour de la fonction $a vaut : 2
Rcursivit
PHP supporte la rcursivit ce qui permet dcrire certaines fonctions de faon plus lgante. On appelle rcursive toute fonction qui de faon directe ou indirecte fait appel elle-mme. Exemple : la fonction puissance nime (pour n>=0) d'un nombre x peut tre dfinie par : x0=1 et xn=x*xn-1 Ce qui se traduit en PHP par la fonction suivante : function puissance($n,$x) { if(n>0) { return ($x*puissance($n-1,$x)) ;} else {return(1) ;} } Remarque importante : La procdure est arrte par le test conditionnel else (1). Dans toute fonction rcursive, il doit y avoir une condition d'arrt, qui empche toute boucle "infinie" (ici il serait bon de vrifier que n est positif ou nul). Excution d'une procdure ou fonction rcursive : Nous allons suivre ici l'excution de l'instruction de lappel $y = puissance( 3, 5) ; Premire phase : cration de la pile 1. Une premire "copie" de la fonction est cre en mmoire avec des variables locales $x =5 et $n=3. L'excution est suspendue l'instruction (return($x*) car puissance(2,5) est inconnue 2. Une deuxime copie de la fonction est alors cre avec les variables locales $x=5 et $n=2. L'excution est suspendue l'instruction (return($x*)
Elments de PHP
49/54
3. Une troisime copie de la fonction est cre avec les variables locales $x=5 et $n=1 4. L'excution est suspendue l'instruction (return($x*) 5. Cette fois ci, avec $x=5 et $n=0, la copie s'excute est retourne puissance(0,5)=1 Deuxime phase : dpilage 6. La troisime copie peut se terminer et retourne alors puissance(1,5)=5 7. La deuxime copie peut se terminer et retourne alors puissance(2,5) = 25 8. La premire copie se termine et retourne a linstruction dappel puissance(3,5)=125 La rcursivit permet de programmer de faon plus simple et souvent plus lisible , mais en revanche cette mthode utilise plus de mmoire que les mthodes classiques et le temps dexcution dun programme peut rapidement dgnrer : par exemple pour le calcul des nombre de Fibonacci (dfinis par fibo(1)=fibo(2)=1 et fibo(n)=fibo(n-1)+fibo(n-2) pour n>=3), on pourra comparer les deux programmes suivants : function fiborecur($n) { if ($n<3) {return (1) ;} else {return (fiborecur($n-1)+fiborecur($n-2)) ;} } et function fiboboucle($n) { $x=1 ; //initialisation pour $n=1 $y=1 ; //initialisation pour $n=2 for($i=3 ;$i<=$n ;$i++) { $a=$x ; //tampon pour ne pas craser $x ; $x=$y ; $y=$a+$y ; } return($y) ; } le script dappel suivant permet de comparer les temps de calcul en secondes : $d1=time(); echo fiborecur(34),"<br />"; echo "Temps d'excution rcursif :",time()-$d1,"s<br />"; $d1=time(); echo "<br />", fiboboucle(34),"<br />"; echo "Temps d'excution non rcursif :",time()-$d1,"s<br />";
Fonction de comparaison
Une relation d'ordre total tant dfinie sur des lments, une fonction de comparaison est une fonction qui admet comme paramtre deux lments a et b et qui retourne les valeurs 1, 0 ou -
Elments de PHP
50/54
1 suivant que a est plus grand, gal ou plus petit que b. Par exemple considrons la relation d'ordre dfinie sur les chanes de caractre par : S1 S 2 si le nombre de caractres de S1 est infrieur au nombre de caractres de S2. Par exemple "Grand" est infrieur "Petite", mais gal "Petit". La fonction de comparaison associe cette relation d'ordre s'crit : function compar_nb_car($a,$b) { $na=strlen($a); $nb=strlen($b); if($na>$nb) {return(1);} elseif($na<$nb) {return(-1);} else {return(0);} }
Utilisation de usort
La syntaxe de usort est : usort($tab,"nom_fonction") o le premier paramtre est un array et le second la chane de caractres donnant le nom de la fonction de comparaison. Nous allons illustrer cette utilisation avec quelques exemples. Avec la fonction prcdente Le programme suivant include("comp_nb_car.php");// fichier contenant la fonction $montab=array("Maurice","Jean-Paul","Leopoldine", "Jules","Albert", "Louis", "Laurence","Jean","Gilles","Robert","Thodore","Francis"); usort($montab,"compar_nb_car"); //appel de la fonction avec la fonction de comparaison for($i=0;$i<count($montab);$i++) { echo $montab[$i],"<br />"; } donnera comme rsultat : Jean Jules Louis Robert Gilles Albert Francis Maurice Laurence Thodore Jean-Paul Leopoldine Fonction de comparaison modifie Nous allons traiter spcialement le cas d'galit, en rangeant alphabtiquement les noms de mme longueur :
Elments de PHP
51/54
function compar_nb_car2($a,$b) { $na=strlen($a); $nb=strlen($b); if($na>$nb) {return(1);} elseif($na<$nb) {return(-1);} else { // traitement de l'galit If($a==$b){return(0);} Else{return( ($a < $b) ? -1 : 1;)} } } Le programme appelant include("comp_nb_car2.php");// fichier contenant la fonction $montab=array("Maurice","Jean-Paul","Leopoldine", "Jules","Albert", "Louis", "Laurence","Jean","Gilles","Robert","Thodore","Francis"); usort($montab,"compar_nb_car2"); //appel de la fonction avec la fonction de comparaison for($i=0;$i<count($montab);$i++) { echo $montab[$i],"<br />"; } donnera alors : Jean Jules Louis Albert Gilles Robert Francis Maurice Laurence Thodore Jean-Paul Leopoldine Tri multicritre d'un tableau Les cls critres du tri sont stocks dans un tableau not $cles et le sens du tri dans un autre tableau $sens, ces deux tableaux sont globaux. La fonction de comparaison (compmul) appelle une fonction rcursive (compare) : en cas d'galit seulement on fait appel au critre suivant. function compare($tab1,$tab2,$ind) { global $cles; global $sens; $la=$cles[$ind]; $dir=$sens[$ind]; $indmax=count($cles)-1;
Elments de PHP
52/54
if ($tab1[$la]<$tab2[$la]) {return(-$dir);} elseif($tab1[$la]>$tab2[$la]) {return($dir);} Else //cas d'galit sur le critre { if($ind<$indmax) //s'il reste d'autres critres {return(compare($tab1,$tab2,$ind+1));} else return(0); } } function compmul($tab1,$tab2) { return(compare($tab1,$tab2,0)); } Le script suivant permet de tester cette fonction : <?php include("comparemul.php"); $exemple= array( array("Dpartement"=>"Finance","Nom"=>"Dupont","Prnom"=>"Jules","Age"=>20), array("Dpartement"=>"Compta","Nom"=>"Machin","Prnom"=>"Gilles","Age"=>59), array("Dpartement"=>"Finance","Nom"=>"Dupont","Prnom"=>"Alain","Age"=>40), array("Dpartement"=>"Market","Nom"=>"Dupont","Prnom"=>"Claude","Age"=>30), array("Dpartement"=>"Compta","Nom"=>"Lui","Prnom"=>"Jacques","Age"=>28), array("Dpartement"=>"Finance","Nom"=>"Dupont","Prnom"=>"Pierre","Age"=>27) ); $cles=array("Dpartement","Nom","Age"); // les critres de tri $sens=array(1,-1,1); // le sens ascendant=1, descendant=-1 usort($exemple,"compmul"); ?> <table border=1> <<?php $titre=array_keys($exemple[0]); echo "<tr>"; foreach($titre as $valeur) echo "<td>".$valeur."</td>"; echo "</tr>"; for($i=0;$i<count($exemple);$i++) { echo "<tr>"; foreach($exemple[$i] as $valeur) echo "<td>".$valeur."</td>"; echo "</tr>"; }
?> </table>
Elments de PHP
53/54
L'excution donnera le rsultat suivant : Dpartement Compta Compta Finance Finance Finance Market Nom Machin Lui Dupont Dupont Dupont Dupont Prnom Gilles Jacques Jules Pierre Alain Claude Age 59 28 20 27 40 30
Elments de PHP
54/54