SOMMAIRE • Vue d’ensemble de PHP
• Structure de base • Prog. Orientée Objet • • • • • • •
Formulaires et Superglobales Ressources et Supports de données Cockies et Sessions Modélisation UML pour PHP XML et PHP Sécurité Frameworks 1
Références Ressources d’aide francophones •
L’Afup (Association française des utilisateurs de PHP) est une association dont le principal objectif est de promouvoir le langage PHP auprès des professionnels. (site Internet : http://www.afup.org).
2
Références PHPFrance.com •
PHPFrance est l’espace avec lequel de nombreux développeurs PHP d’aujourd’hui se sont formés il y a quelques années. (site Internet : http://www.phpfrance.com).
3
Références PHPIndex.com •
PHPIndex est l’un des sites pionniers français sur le PHP. Ce portail propose de nombreuses ressources et informations sur des sujets pointus (site Internet : http://www.phpindex.com).
4
Références PHPScripts-fr.net •
•
PHPScripts offre de nombreuses ressources sur le PHP. Son principal atout est son annuaire de scripts. Il contient des ressources dans tous les domaines : administration de base de données, agenda, annuaire, authentification, etc. site Internet : http://www.phpscripts-fr.net).
5
Références PHP Solutions •
PHP Solutions est un magazine papier dédié à PHP et MySQL. Il rassemble de nombreux articles intéressants en français. D’origine polonaise, le magazine est traduit dans de nombreuses langues (site Internet : http://www.phpsolmag.org).
6
Références
7
Références
8
Références
9
Références
10
Editeurs Eclipse • L’éditeur Eclipse accompagné du plug-in PHP Eclipse constitue une des solutions les plus complètes à disposition des développeurs de projets de grande taille. • http://www.phpeclipse.de Zend Studio • Un éditeur similaire à Eclipse, également écrit en Java par la société Zend Technologies. • http://www.zend.com/store/products/zend-studio/ Maguma Open Studio/Maguma Studio • Un bon éditeur, qui existe maintenant en deux versions, une open-source et une commerciale. • http://www.maguma.com Komodo Professional • Komodo est un éditeur stable, qui possède une interface agréable et intuitive • http://www.activestate.com/Products/Komodo/ PHPEdit • PHPEdit est un bon éditeur commercial spécialisé pour PHP. • http://www.waterproof.fr
11
Documentation en ligne • Pour obtenir en ligne toute la documentation officielle (en français) sur une commande, tapez l’URL suivante dans la barre d’adresse de votre navigateur Internet : • http://fr.php.net/ • Et rajouter en fin d’URL le nom de la commande. • Exemple : • http://fr.php.net/echo
12
Comment ça fonctionne sans PHP
1
public/www 2
Serveur http 3
client
index.html
4
support
Le répertoire
13
Comment ça fonctionne avec PHP/MySQL
SGBD MySQL
1
public/www
client 4
fichier.php
2
Serveur http 3
Génération du code html
Module PHP Fichier_bis.php 14
Serveur http • Il existe différents serveurs http – Apache • http://httpd.apache.org – IIS • www.microsoft.com – Information sur le protocole http • www.w3.org/Protocols/
• Echange d’information entre serveur et clients – Pour echanger des informations entre le serveur et, les clients on utilise le protocole HTTP (ensemble de règles de codes).
– Nestcape Navigator, Microsoft Internet Explorer, lynx, iCab, …
15
Introduction PHP est un langage interprété (un langage de script) exécuté du côté serveur (comme les scripts CGI, ASP, ...) et non du côté client (un script écrit en Javascript ou une applet Java s'exécute sur votre ordinateur...). La syntaxe du langage provient de celles du langage C, du Perl et de Java. Ses principaux atouts sont: Une grande communauté de développeurs partageant des centaines de milliers d'exemples de script PHP La gratuité et la disponibilité du code source (PHP est distribué sous licence GNU GPL) La simplicité d'écriture de scripts
La possibilité d'inclure le script PHP au sein d'une page HTML (contrairement aux scripts CGi, pour lesquels il faut écrire des lignes de code pour afficher chaque ligne en langage HTML) La simplicité d'interfaçage avec des bases de données (de nombreux SGBD sont supportés, mais le plus utilisé avec ce langage est MySQL, un SGBD gratuit disponible sur de nombreuses plateformes : Unix, Linux, Windows, MacOs X, Solaris, etc...) L'intégration au sein de nombreux serveurs web (Apache, Microsoft IIS, etc.).
16 H. Mouncif, Dep. Info. FSAC 2005
Notes de cours : Technologies du web
Serveur Web locale: EasyPHP
Pourquoi EasyPHP? Seul un serveur web peut générer le PHP. Le client ne peut pas interpréter les scripts PHP. Il va donc falloir trouver un moyen pour compiler les scripts PHP localement. Vous pourrez alors travailler dessus pour réaliser votre site en PHP. EasyPHP est en fait un "package" qui contient tous les programmes nécessaires pour pouvoir traiter du PHP ! Le site web de EasyPHP est : www.easyphp.org
17
Serveur Web locale: EasyPHP voici les programmes qu'installe EasyPHP : • Apache : c'est le programme qu'utilisent les serveurs. Il permet au serveur de distribuer des pages web... mais il ne connaît que le HTML ! • PHP : PHP est comme un "plugin" de Apache. Il a besoin d'Apache pour fonctionner, et grâce à lui Apache saura travailler sur des pages PHP. En clair, Apache + PHP = un serveur PHP • MySQL : c'est un SGBD(OPEN) pour la gestions des bases de données. • PHPmyAdmin : Interface utilisateur qui permette de faciliter la gestion des bases de données.
18
Serveur Web locale: EasyPHP Installez le programme qui se trouve dans le ZIP, comme vous le feriez pour n'importe quel autre programme. A la fin, on vous proposera deux options. Moi tout ce que je vous demande c'est de lancer EasyPHP, alors vous pouvez cocher la case "Lancer EasyPHP".
Configurer EasyPHP Dernière étape : il faut configurer EasyPHP. Je vous rassure de suite c'est très rapide et très simple. Faites un clic droit sur l'icône EasyPHP dans la barre des tâches. Un petit menu s'ouvre : C'est "Administration" qui va nous servir. Cela permet de configurer EasyPHP.
19
Serveur Web locale: EasyPHP
1. Apache > Alias : c'est là qu'on va se rendre pour configurer EasyPHP. Cela permet d'indiquer les sites web que vous avez sur votre disque dur, pour que EasyPHP les reconnaisse. 2. PhpMyAdmin > Gestion BDD : c'est par ici que vous pourrez gérer votre base de données. On verra ce que c'est dans la partie II de ce cours. 20
Serveur Web locale: EasyPHP
1. Nom de l'alias : c'est le nom de votre site. Il faut bien lui donner un nom quoi :p. Dans notre exemple, on mettra "TestsPHP". 2. Le chemin du répertoire : il faut indiquer dans quel dossier se trouve votre site. Si vous avez fait comme je vous l'ai dit, vous devriez avoir créé un dossier "Tests PHP" dans "Mes documents". 3. Paramètres par défaut du répertoire : dès que vous voyez des mots bizarres en anglais, vous faites comme moi : vous n'y touchez pas 4. OK : une fois que tout est rempli, cliquez sur ce petit bouton et c'est bon
21
Syntaxe de base Les instructions PHP peuvent être insérées dans les commandes HTML, ce qui facilite le développement des sites web dynamiques. Lorsque PHP commence à traiter un fichier, il ne fait qu'afficher le texte HTML qu'il rencontre. Un fichier, qu’il soit « .html » ou « .php », fonctionnera exactement de la même façon. Si on veut insérer des commandes PHP dans un fichier, il faut indiquer à PHP le début d'une telle séquence, en passant en mode PHP comme tel : Ou /* Instructions PHP */ ?> (short_open_tag = on) Autres syntaxes d’intégration : <script language= "php" >……< /script> Ou <%..... %> (asp_tags = on) Tout ce qui se trouve entre ces balaises sera considéré par le serveur Web comme étant des commandes PHP. 22
Syntaxe de base Le code de base PHP
Affichage du texte Code Source 1: Affichage du texte
Notre première instruction : echo <meta http-equiv="Content-Type" content="text/html; charset=iso8859-1" />
Affichage de texte avec PHP
Cette ligne a été écrite entièrement en (x)HTML.
23
Syntaxe de base La fonction echo La fonction echo est la fonction de base de toute page PHP. Elle permet d’afficher une ou plusieurs chaînes et donc d’inclure du texte dans la page HTML envoyée au navigateur. Syntaxe : echo (texte) echo texte1, texte2 Le séparateur d’instruction En PHP, toutes les instructions doivent se terminer par un point-virgule. Exemple : 24
Les commentaires Plusieurs manières de définir des zones de commentaires : /*forme de commentaires 1 */ Attention pas d’imbrication Comme en langage C # formme de commentaires 2 Ce type de commentaire à la Unix est très peux utilisé // forme de commentaires 3 Comme en langage C++
25
Constantes Définition • La fonction define permet de définir une constante. Une constante est une zone mémoire identifié par un nom qui contient une valeur lisible mais non modifiable. Syntaxe Booléen define(Identificateur, valeur, booleén) – Identificateur : Nom de la constante – Valeur : valeur de la constante – booleén : indique si le nom de la constante est sensible à la casse (TRUE – Valeur par défaut), ou non (FALSE). La fonction define retourne true en cas de succés et false en cas d’erreur.c 26
Constantes •L’utilisateur peut définir des constantes dont la valeur est fixée une fois pour toute. Les constantes ne portent pas le symbole $ (dollars) en début d’identificateur et ne sont pas modifiables. •define(‘’var’’,valeur) : définit la constante var (sans $) de valeur valeur
•Exemple 1 : •define(‘’author’’,’’Foobar’’); •echo author; // affiche ‘Foobar’ •Exemple 2 : •define(MY_YEAR,1980); •echo MY_YEAR; // affiche 1980
27
Fonctions utiles La fonction defined • La fonction defined permet de savoir si une constante est définie ou non. Syntaxe – Booléen defined(texte) – Defined retourne TRUE si la constante est définie et FALSE dans le cas contraire.
La fonction constant • La fonction constant permet de retourner la valeur d’une constante dont le nom est passé en paramètre. Syntaxe – Constant(Identificateur) Identificateur : Nom de la constante 28
Variables Les variables Une variable est un objet repéré par son nom, qui peut être nombre, texte ou autre. Les variables conservent temporairement des valeurs, qui pourront être modifiées lors de l'exécution du programme.
PHP supporte quatre types scalaires : Booléen, entier, nombre à virgule flottante, chaîne de caractères. PHP supporte deux types composés : Tableau, objet. PHP supporte deux types spéciaux : Ressource, null.
29
Variables Le typage des variables est implicite en PHP. Il n’y a donc pas besoin de les déclarer ni même de les initialiser avant leur utilisation, toutefois, les noms de variables doivent répondre à certaines règles syntaxiques: Tout nom de variable doit obligatoirement être précédé du caractère dollar ($). Tout nom de variable doit commencer par une lettre (majuscule ou minuscule) ou un "_", mais jamais un chiffre. Un nom de variable peut comporter des lettres, des chiffres et le caractère _ (les espaces ne sont pas autorisés). Les noms de variables sont sensibles à la casse. On affecte des valeurs aux variables à l’aide du signe égale (=) En PHP3 les variables sont assignées uniquement par valeurs En PHP4 les variables peuvent être assignées par références Elles deviennent un alias 30
Fonctions utiles •empty($var) : renvoie vrai si la variable est vide •isset($var) : renvoie vrai si la variable existe •unset($var) : supprime une variable •var_dump($var):affiche des informations sur une variable •gettype($var) : retourne le type de la variable •settype($var, ’’type’’) : convertit la variable en type type (cast) •is_long(), is_double(), is_string(), is_array(), is_object(), is_bool(), is_float(), is_numeric(), is_integer(), is_int()… 31
Fonctions utiles •
Il existe quelques fonctions ayant attrait au type des variables : – string gettype(var) : renvoie le type de la variable sous forme de chaîne Le code ci-dessus affichera string integer boolean.
32
Fonctions utiles bool is_type(var) : renvoie True si la variable testée est du type
var_dump(var) : retourne les informations structurées d’une variable, y compris sont type et sa valeur. Le code ci-dessus affichera int(15)
33
Fonctions utiles • Il existe une miriade de fonctions mathématiques. • • • • • • •
abs($x) : valeur absolue ceil($x) : arrondi supérieur floor($x) : arrondi inférieur pow($x,$y) : x exposant y round($x,$i) : arrondi de x à la ième décimale max($a, $b, $c …) : retourne l’argument de valeur maximum pi() : retourne la valeur de Pi
• Et aussi : cos, sin, tan, exp, log, min, pi, sqrt… • Quelques constantes : • M_PI : valeur de pi (3.14159265358979323846) • M_E : valeur de e (2.7182818284590452354) 34
Variables Les
variables sont précédées du signe $ $bonjour = "Hello"; $nom = "Hello"; $nomcomplet = "Paul &nom"; $email = "kilain". "."."kilain";
Les variables référencées (&) $nomcomplet = "Paul".&$nom; en PHP4 Exemple : 35
Variables •
Le type d’une variable est à liaison superficielle
36
Les chaînes de caractères • Une variable chaîne de caractères n’est pas limitée en nombre de caractères. Elle est toujours délimitée par des simples quotes ou des doubles quotes. • Exemples : • $nom = ‘’Etiévant’’; • $prenom = ‘Hugo’; • Les doubles quotes permettent l’évaluation des variables et caractères spéciaux contenus dans la chaîne (comme en C ou en Shell) alors que les simples ne le permettent pas. • Exemples : • echo ‘’Nom: $nom‘’; // affiche Nom: Etiévant • echo ’Nom: $nom‘; // affiche Nom: $nom • Quelques caractères spéciaux : \n (nouvelle ligne), \r (retour à la ligne), \t (tabulation horizontale), \\ (antislash), \$ (caractère dollars), \’’ (double quote). • Exemple : echo ‘’Hello Word !\n’’; 37
Les chaînes de caractères • Opérateur de concaténation de chaînes : . (point) • • • •
Exemple 1 : $foo = ‘’Hello’’; $bar = ‘’Word’’; echo $foo.$bar;
• Exemple 2 : • $name = ‘’Henry’’; • $whoiam = $name.‘’IV’’; • Exemple 3 : • $out = ‘Patati’; • $out .= ‘’ et patata…’’; 38
Les chaînes de caractères • • • • • •
Affichage d’une chaîne avec echo: Exemples: echo ‘Hello Word.’; echo ‘’Hello ${name}\n’’; echo ’’Nom : ’’, $name; echo(‘’Bonjour’’);
• • • • • •
Quelques fonctions: strlen($str) : retourne le nombre de caractères d’une chaîne strtolower($str) : conversion en minuscules strtoupper($str) : conversion en majuscules trim($str) : suppression des espaces de début et de fin de chaîne substr($str,$i,$j) : retourne une sous chaîne de $str de taille $j et débutant à la position $i • strnatcmp($str1,$str2) : comparaison de 2 chaînes • addslashes($str) : déspécialise les caractères spéciaux (‘, ‘’, \) • ord($char) : retourne la valeur ASCII du caractère $char
39
Portée des variables La portée d'une variable dépend du contexte dans lequel la variable est définie. Les constantes, les fonctions et classes sont partout visible donc accessible. Variable globales Les variables globales ne peuvent être utilisées telles quelles au niveau du corps des fonctions. Une variable globale ne peut être au sein d’une fonction que si elle est précédée du mot réservé global. Variable locales Elles sont définies au niveau du corps des fonctions
40
Portée des variables Toute variable utilisée dans une fonction est par définition, locale. Par exemple :
Le script n'affichera rien à l'écran car la fonction echo utilise la variable locale $a, et celle−ci n'a pas été assignée préalablement dans la fonction.
41
Portée des variables En PHP, une variable globale doit être déclarée à l'intérieur de chaque fonction afin de pouvoir être utilisée dans cette fonction. Par exemple: Le script ci−dessus va afficher la valeur "3". En déclarant globales les variables $a et $b locales de la fonction somme(), toutes les références à ces variables concerneront les variables globales. Il n'y a aucune limite au nombre de variables globales qui peuvent être manipulées par une fonction.
42
Portée des variables Une autre caractéristique importante de la portée des variables est la notion de variable static . Une variable statique a une portée locale uniquement, mais elle ne perd pas sa valeur lorsque le script appelle la fonction. Prenons l'exemple suivant: Cette fonction est un peu inutile car à chaque fois qu'elle est appelée, elle initialise $a à 0 et affiche "0". L'incrémentation de la variable ($a++) ne sert pas à grand chose, car dès que la fonction est terminée la variable disparaît.
Pour faire une fonction de comptage utile, c'est−à−dire qui ne perdra pas la trace du compteur, la variable $a est déclarée comme une variable statique (voir script audessus). L’appel de la fonction Test() affichera une valeur de 43 $a incrémentée de 1.
Référence sur une variable •On peut à la manière des pointeurs en C faire référence à une variable grâce à l’opérateur & (ET commercial). •Exemple 1 : •$toto = 100; // la variable $toto est initialisée à la valeur 100 •$foobar = &$toto; // la variable $foobar fait référence à $toto •$toto++; // on change la valeur de $toto •echo $foobar; // qui est répercutée sur $foobar qui vaut alors 101
•Exemple 2 : •function change($var) { • $var++; // la fonction incrémente en local l’argument •} •$nbr = 1; // la variable $nbr est initialisée à 1 •change(&$nbr); // passage de la variable par référence •echo $nbr; // sa valeur a donc été modifiée
44
Conversion de type
La fonction gettype() permet de lire le type d’une variable. On peut assigner les types suivants
Array Class Double Integer String
La fonction settype() permet de changer le type d’une variable 45
Les opérateurs arithmétiques
Avec PHP on peut utiliser les différents opérateurs arithmétiques comme dans les exemples suivants : Exemple $a + $b $a − $b $a * $b $a / $b $a % $b
Nom Addition Soustraction Multiplication Division Modulo
Résultat Somme de $a et $b. Différence de $a et $b. Produit de $a et $b. Quotient de $a et $b. Reste de $a divisé par $b.
L'opérateur de division ("/") retourne une valeur entière (le résultat d'une division entière) si les deux opérandes sont entiers (ou bien des chaînes converties en entier. Si l'un des opérandes est un nombre à virgule flottante, ou bien le résultat d'une opération qui retourne une valeur non entière, un nombre à virgule flottante sera retourné.
46
Les opérateurs d’assignation
L'opérateur d'assignation est le signe "=". Il signifie que l'opérande de gauche se voit affecter la valeur de l'expression qui est à droite du signe égal. En plus, il existe des "opérateurs combinés" pour tous les opérateurs arithmétiques et pour les opérateurs sur les chaînes de caractères. Cela permet d'utiliser la valeur d'une variable dans une expression et d'affecter le résultat de cette expression à cette variable. Par exemple:
// affecte la valeur 8 à la variable $a. // correspond à l'instruction '$a = $a + 5'); $b = "Bonjour"; $b .= "tout le monde!"; // affecte la valeur "Bonjour tout le //monde!" à la variable $b // identique à $b = $b." tout le monde!"; ?> 47
Les opérateurs de comparaison
Les opérateurs de comparaison, comme leur nom l'indique, vous permettent de comparer deux valeurs. Exemple $a == $b $a != $b $a < $b $a > $b $a <= $b $a >= $b
Nom Résultat Égal Vrai si $a est égal à $b. Différent Vrai si $a est différent de $b. inférieur Vrai si $a est inférieur strict à $b. grand Vrai si $a grand strict à $b. Inf ou égal Vrai si $a est inf ou égal à $b. Sup ou égal Vrai si $a est sup ou égal à $b.
Un autre opérateur conditionnel est l'opérateur ternaire (":?"), qui fonctionne comme en langage C Cette expression renvoie la valeur de l'expression expr2 si l'expression expr1 est vraie, et l'expression expr3 si l'expression expr1 est fausse.
48
Les structures de contrôles
if, else, elseif switch, case, default
For While do…while foreach(PHP4) break, continue
49
Les structures de contrôles If else elseif Syntaxe: If(expression) { bloc; } Elseif(expression 2) { bloc2; } ……….. else { dernier block }
50
Les tableaux Les tableaux Les tableau (array) représentent la structure de données la plus importante du langage PHP Les tableaux sont en PHP d’une seule dimension La seule manière de construire des tableaux multidimensionnel est d’utiliser des tableaux de pointeurs. L’indexation d’un tableau commence toujours à l’indice 0 (zéro) Deux types d’indexation: indexage numérique indexage associatif
51
Les tableaux Indexation numérique Indexation explicite • $couleur[0] = "blanc", $couleur[1] = "bleu", $couleur[2] = "rouge"; Indexation automatique • $couleur[] = "blanc", $couleur[] = "bleu", $couleur[] = "rouge"; Avec array sans indice • $couleur = array("blanc", "bleu", "rouge"); Avec array + indice • $couleur = array(5=>"blanc", "bleu", "rouge"); Indexation associative $personne = array("nom" =>"LeMouel", "prenom"=>"Yann", "age"=>30); $couleur = array(1=>"blanc", 3=>"bleu", 5=>"rouge"); 52
Les tableaux $couleur2[2]"; $couleur3 = array(5=> "blanc", "bleu", "rouge"); echo "
$couleur3[6]"; $personne = array("nom"=> "LeMouel", "prenom"=> "Yann", "age"=> 30); echo "
$personne[prenom]"; $couleur4 = array(1=> "blanc", 3=> "bleu", 5=> "rouge"); echo "
$couleur4[5]"; ?>
53
Les tableaux Parcours d’un tableau : for indic $index=> $couleur[$index]"; } ?>
54
Les tableaux Tableaux multidimensionnels Deux notations peuvent être utilisées pour construire un tableau multidimensionnel, sous forme $tableau[…]=$tableau_intérieur ou, $tableau[…][…]=valeur. Méthode 1 :
$villes_maroc[]= "Rabat"; $villes_maroc[]= "Temara"; $villes_maroc[]= "Casablanca"; // stockage du tableau des villes de Maroc dans le tableau des villes
$villes["Maroc"]=$villes_maroc; //tableau de tableau //viles de France
$villes_france[]= "Paris"; $villes_france[]= "Brest"; $villes_france[]= "Quimper"; // stockage du ville de France
$villes["France"]=$villes_france; ?>
55
Les tableaux Tableaux multidimensionnels
Méthode 2 :
56
Les tableaux Tableau multidimensionnels En utilisant la fonction array:
Méthode 1 : $villes_maroc,"France"=>$villes_france); ?> Méthode 2 : array("Rabat", "Temara", "Casablanca"), "France"=>array("Paris", "Brest", "Quimper")); ?> 57
Les tableaux La structure de parcours de tableau foreach La forme foreach reste la plus adaptée pour passer en revue les éléments d’un tableau. Il y a deux syntaxes possibles : Première syntaxe : A chaque itération de la boucle, $valeur contient la valeur de l’élément du tableau $tableau. Cette syntaxe permet de parcourir le tableau de début à la fin. Deuxième syntaxe : $value) instructions; ?> la clé courante est stockée dans la variable $clé et la valeur dans la variable dans $valeur. 58
Les tableaux Exemple d’utilisation de la structure foreach 0, "un"=>1, "deux"=>2); echo "Première syntaxe :
"; foreach($tab as $nombre) { echo " $nombre
"; } echo "deuxième syntaxe :
"; foreach($tab as $cle=>$nombre) { echo " $clé=>$nombre
"; } ?>
59
Les tableaux La structure de parcours de tableau while Syntaxe : While(list(variable_clé, variable_valeur)=each(tableau)) { instructions ; } Pour passer en revue les éléments d’un tableau, nous devrons le faire à l’aide de trois fonctions complémentaires : – reset permet de pointer sur le premier élément du tableau – list permet d’affecter une série de variables à un tableau ou l’inverse (affecter un tableau à une série de variables).
–
each retourne le couple clé/valeur en cours, et pointe sur l’élément suivant du tableau.
60
Les tableaux Les tableaux
Exemple d’utilisation de la structure while 0, "un"=>1, "deux"=>2); reset($tab); While (list($clé, $valeur) = each ($tab)) echo "$clé=>$valeur
"; ?>
La fonction each permet de passer d’un élément à l’autre en pointant sur un élément différent à chaque itération. La fonction list permet de récupérer la valeur et la clé de l’élément courant.
61
Les tableaux La structure de parcours do ..while synatxe: do { instructions… } while(next(tableau)) Pour parcourir le tableau, nous avons besoin des fonctions suivantes: La fonction key (nom du tableau) renvoie le nom de la clé de la paire clé/valeur courante, La fonction current (nom du tableau) renvoie la valeur de l’élément courant. Le pointeur est initialement sur l’indice de la première paire clé/valeur, La fonction next(nom du tableau) déplace le pointeur interne vers l’élément suivant et renvoie la valeur de cet élément. A la fin du tableau false est renvoyée,
62
Les tableaux Exemple d’utilisation de la structure do …while "Mouel", "prenom"=>"Yann", "age"=>30); do { echo "
indice" , key($personne), "==>", current($personne); } while(next($personne)) ?>
63
Fonctions 1 Introduction PHP offre la possibilité de définir des fonctions avec tous les avantages associés. Les fonctions en PHP peuvent prendre des arguments sans spécifier leurs types. Elles peuvent de façon optionnelle retourner une valeur.
2 Déclaration et appel Le mot clé function permet d’introduire la définition d’une fonction qui peut être définie selon la syntaxe suivante :
?> nom_function doit respecter les règles des noms de variable
64
Fonctions 1 Introduction PHP offre la possibilité de définir des fonctions avec tous les avantages associés. Les fonctions en PHP peuvent prendre des arguments sans spécifier leurs types. Elles peuvent de façon optionnelle retourner une valeur.
2 Déclaration et appel Le mot clé function permet d’introduire la définition d’une fonction qui peut être définie selon la syntaxe suivante :
?> nom_function doit respecter les règles des noms de variable 65
Fonctions Exemple:
function Somme($a, $b) { return $a+$b; } $res = Somme(10, 11); echo "$res= " , $res; // fonction avec un tableau comme paramètre
function takes_array($input) { echo "$input[0] + $input[1] = ", $input[0]+$input[1]; } //fonction sans paramètre qui affiche “Ceci est un exemple“ function Afficher_message(){ echo "ceci est un message
"; } Afficher_message();
?>
66
Fonctions Valeurs de retour Il est possible de retourner plusieurs valeurs d’une fonction sous forme d’un tableau. Dans l’appel de cette fonction, il faudra affecter le tableau retourner à la procédure list() qui prend en paramètre la taille de ce tableau. On affecte à list() le retour de la fonction.
" ; echo " soustraction : $a2
" ; echo " produit : $a3
" ; ?> 67
Fonctions Visibilité de la fonction Une fonction est utilisable uniquement dans le script où elle est définie. Pour l’employer dans plusieurs scripts, il faut, soit recopier sa définition dans les différents scripts, soit la définir dans un fichier inclus partout où la fonction est nécessaire.
Exemple : Fichier fonctions.inc contenant des définitions de fonctions : Script utilisant les fonctions définies dans fonctions.inc : 68
Fonctions Fonction variable PHP propose une fonction variable qui permet de stocker un nom de fonction dans une variable, et d’appeler la variable dans une instruction. Dans ce cas, PHP remplace la variable par sa valeur et cherche à exécuter la fonction correspondante. Exemple :
function division($arg1,$arg2){ if($arg2==0) echo "division par zero !!! else return $arg1/$arg2; }
function calculer($opération, $arg1,$arg2) { return $opération($arg1,$arg2) ; } // utilisation de la fonction calculer echo calculer("somme",1,2)
"; echo "
"; echo calculer("division",1,2); ?> 69
Fonctions Paramètres avec valeur par défaut Les paramètres sont passés par copie et les résultas sont retournés par copie. Même sans paramètre, un entête de fonction doit en porter. Comme en C++, il est possible d’indiquer qu’un paramètre possède une valeur par défaut grâce à la syntaxe suivante : La valeur par défaut d’un paramètre doit être une expression littérale et ne peut être, ni une variable, ni une fonction, ni une expression composée. $titre"); } affiche("couleur noire"); affiche("couleur bleu", "red"); affiche("couleur!", "#aaff55"); 70 ?>
Fonctions Passage d’arguments par valeur, par référence Le passage d’arguments par référence permet à une fonction de modifier les variables passées en paramètres. Pour passer un argument par référence, il suffit d’utiliser l’opérateur de référence & devant le nom du paramètre dans la déclaration de la fonction.
"; echo "\$cmp = $cmp
"; } } $i=1 ; $i=1 ; // initialisation echo "\$i avant appel = $i
"; echo "\$i avant appel = $i
"; incr_valeur($i) ; incr_valeur($i) ; echo "\$i après appel =$i
"; echo "\$i après appel =$i
"; ?> ?> 71
Fonctions Récursivité PHP permet d’utiliser la récursivité, c-à-d, la possibilité d’une fonction de s’appeler par elle-même. Exemple :
72
Formulaires 1 Introduction Les formulaires servent essentiellement pour la gestion interactive d’un site. Les formulaires sont à la base des pages web dynamiques. 2 Mise en œuvre d’un formulaire Un formulaire XHTML est défini entre les balises
action : le script qui va traiter le formulaire. method : Mode de transmission vers le serveur des informations saisies dans le formulaire. Get : les données du formulaire sont transmises dans l’URL. Post : les données du formulaire sont transmises dans le corps de la requête. 73
Formulaires 3 Les méthodes Get et Post La transmission d’un formulaire s’effectue selon l’une des deux méthodes d’envoi : GET ou POST. Si l’option register_globals est activée, lors de la soumission du formulaire à une page de traitement, chaque élément de saisie est assimilé à une variable PHP dont le nom est constitué par la valeur de l’attribut name et son contenu par la valeur de l’attribut value. Si, au contraire, l’option register_globals est invalidée, chaque élément de saisie est assimilé à une variable PHP au sein du tableau associatif dépendant de la méthode d’envoi employée. - Si la méthode GET a été choisie, on retrouve les variables au sein de la superglobale $_GET. - Si la méthode POST a été choisie, les variables sont contenues au sein de la superglobale $_POST. Pour obtenir les valeurs des variables en utilisant les superglobale, procédez comme suit : Syntaxe $valarg =$_GET[‘nomarg’]; //GET $valarg =$_POST[‘nomarg’]; //POST 74
Formulaires La méthode Get La méthode GET envoie les données sous forme d’une suite de couples nom/valeur ajoutés à l’URL de la page appelée. La partie d’une URL précédée par le caractère point d’interrogation (?) est appelée chaîne de requête. Si la chaîne de requête contient plusieurs éléments, alors chaque élément/valeur doit être séparé par le caractère &. Par ailleurs, elle ne peut pas dépasser 255 caractères. Les données transmises au serveur par la méthode GET sont visibles par les utilisateurs directement dans la barre d’adresse du navigateur. Exemple: http://www.monsite.com/infos.php?jour=27&mois=07&annee=20 03&titre=Informations 4 variables seront créées : $_GET['jour'] = 27; $_GET['mois'] = 07; $_GET['annee'] = 2003; $_GET['titre'] = "Informations"; 75
Formulaires Exemple : infos.php
Lien vers la page appel.php, avec des variables aux valeurs différentes:
Lien vers cible.php?nom=YossefDupont&prenom=Amine
appel.php
Bonjour !
Votre nom est , et votre prénom est .
Faites un autre essai, cliquez ici pour revenir à infos.php
76
PHP : Les bases Formulaires La méthode Post La méthode POST place les informations directement à la suite de l’adresse URL de la page appelée. La partie d’une URL regroupe les informations dans l’en-tête d’une requête HTTP. Ainsi, les données transmises par un formulaire restent confidentielles et n’apparaissent pas dans l’URL. La fonction isset() est très pratique lorsqu’on écrit des traitements de formulaires. Elle permet de déterminer si une variable est affectée (0 compris mais ni NULL ni FALSE). En utilisant cette fonction, il est possible de déterminer les champs d’un formulaire n’ayant pas été renseignés par l’utilisateur. Mais isset() présente une difficulté : le test d’une chaîne de caractères vide renvoie TRUE.
77
Formulaires Exemple : Transmettre en utilisant un formulaire form.php
cible.php
Bonjour !
Je sais comment tu t'appelles. Tu t'appelles !
Si tu veux changer de prénom, clique ici pour revenir à form.php
78
Formulaires 4 LE FORMULAIRE ET LE SCRIPT PHP
PHP peut intervenir à deux endroits par rapport au formulaire : Pour la construction du formulaire, si ce dernier doit contenir des informations dynamiques ; Pour le traitement du formulaire ; Les méthodes utilisables pour faire interagir un formulaire et un script PHP sont : Placer le formulaire dans un document xHTML, dans ce cas le formulaire ne contient aucun élément dynamique, et indiquer le nom de script qui doit traiter le formulaire dans l’option action de la balise
"); echo(""); ?>
80
Formulaires traitement.php
81
Formulaires Exemple: Variables de formulaires complexes '; print_r($_POST); echo '
Essayez à nouveau'; echo ''; } else { ?>
82
Formulaires
83
POO en PHP
La notion d'objet dans le langage du PHP à un aspect très limité contrairement au langages de référence tel que le C++.
Le concept objet doit être pris dans le sens de "module", sous ce nom, se cache un ensemble de commandes visant à exécuter des actions, un objet est une entité, un peu comme si l'on voulait diviser notre programme en sous-tâches.
Vocabulaire du concept objet en PHP • Objet :Représentant de la classe dans l'application, il se nomme instance de classe. • Classe : Entité contenant toutes les méthodes et attributs. • Méthode : Nom donné aux fonctions contenu dans la classe. • Attribut : Nom donné aux variables globales de la classe, définis aux début. • constructeur: Nom donné à la méthode lancé lors de l'instanciation de la classe, elle porte le même nom que la classe. • destructeur:Nom donné à la méthode lancé lors de la destruction de la classe, cet notion, n'existe pas vraiment dans l'implémentation du concept objet en PHP.
84
POO en PHP Déclaration d’une classe en PHP class nom_classe { var $variable1;
}
// Variable sans valeur
var $variable2 = "Variable 2";
// Variable avec valeur
var $tableau = array();
// Tableau
...
On utilise le mot clé var pour introduire un attribut, vous pouvez laissez cette variable indéfini, ou lui donner une valeur.
85
POO en PHP Introduction des méthodes class nom_class { var $variable1; var $variable2 = "Variable 2"; var $tableau = array() function nom_classe ($var, $autre_var) // Le constructeur de la classe { ... } function Fonction1 () // Fonction1 { }
...
} La définition de méthodes dans une classe se fait de la même manière que les fonctions dans le code source PHP, 86
POO en PHP Mise en œuvre de la classe variable1 = "Variable 1"; $objet->fonction2("valeur"); ?> • La création d’une instance de la classe nom_classe utilise le mot-clé new.
• Pour initialiser l’attribut $variable1, on utilise l'objet suivi d'un tiret - puis d'un signe supérieur > et on ajoute le nom de la variable (qui est à l'intérieur de la classe) sans le signe dollar $. • L'utilisation des fonctions (méthodes) de la classe se fait de la même manière que les variables (attributs) comme nous le voyons pour la méthode fonction2().
87
POO en PHP Exemple : class Voiture { // déclaration de la classe var $couleur; // déclaration d’un attribut var $belle = TRUE; // initialisation d’un attribut function voiture() { // constructeur $this->couleur = ‘’noire’’; } // le mot clé $this faisant référence à l’objet est obligatoire function Set_Couleur($couleur) { $this->couleur = $couleur; } } $mavoiture = new Voiture(); // création d’une instance $mavoiture->Set_Couleur(‘’blanche’’); // appel d’une méthode $coul = $mavoiture->couleur; // appel d’un attribut 88
POO en PHP Le système de classes de PHP est très succinct, il ne gère que l’héritage simple. Exemple : class Voituredeluxe extends Voiture { // déclaration de la sous classe var $couleur; function voituredeluxe() { // constructeur $this->Voiture(); } function Set_Couleur($couleur) { $this->couleur = $couleur; } function Get_Couleur() { return $this->couleur; } } La nouvelle classe Voituredeluxe hérite de tous les attributs et méthodes de la classe parente Voiture dont elle est une extension (extends). Il est possible de 89 surcharger les méthodes, d’en déclarer de nouvelles, etc.
POO en PHP Quelques fonctions : get_declared_classes() : retourne un tableau listant toutes les classes définies class_exists($str) : vérifie qu'une classe dont le nom est passé en argument a été définie get_class($obj): retournent le nom de la classe de l’objet $obj get_class_methods($str) : retourne les noms des méthodes de la classe $str dans un tableau get_class_vars($str) : retourne les valeurs par défaut des attributs de la classe $str dans un tableau associatif get_object_vars($obj) : retourne un tableau associatif des attributs de l’objet $obj les clés sont les noms des attributs et les valeurs sont celles des attributs si elles Existent. is_subclass_of($obj,$str) : détermine si l’objet $obj est une instanciation d’une sous-classe de $str, retourne VRAI ou FAUX method_exists($obj,$str) : vérifie que la méthode $str existe pour une classe dont 90 $obj est une instance, retourne VRAI ou FAUX
POO en PHP • Tout objet instancié est une variable et peut à se titre être passé en argument à une fonction ou bien être un retour de fonction ou encore être sauvegardée en donnée de session. • Il n’existe pas de destructeur : comme en C++, les objets qui cessent d’être utilisés sont automatiquement détruits.
• Il n’y a pas de notion de visibilité : tous les attributs et méthodes sont publiques et une classe hérite forcément de tous les attributs et méthodes de sa classe mère. • Une classe fille hérite de tous les attributs et méthodes de la classe parente dont elle est une extension (d’ou la syntaxe extends). Il est possible de surcharger les méthodes, d’en définir de nouvelles… 91
Fichiers Nom
Rôle
fopen
Ouvrir un fichier
fclose
Fermer un ficheir
fread
Lire le contenu d’un fichier (dans une chaîne)
file
Lire le contenu d’un fichier (dans un tableau)
fwrite
Ecrire dans un fichier
file_get_contents
Ouvrir, lire et fermer un fichier
file_put_contents
Ouvrir, ecrire et fermer un fichier
copy
Copier un fichier
unlink
Supprimer un fichier
rename
Renommer un fichier
file_exists
Tester l’existence d’un fichier
filesize
Lire la taille d’un fichier 92
Fichiers Exemple typique d’affichage du contenu d’un fichier : $file impossible."); } ?> 93
Fichiers La fonction fopen permet d’ouvrir des fichiers dont le chemin est relatif ou absolu. Elle permet aussi d’ouvrir des ressources avec les protocoles HTTP ou FTP. Elle renvoie FALSE si l’ouverture échoue. Exemples : $fp = fopen(‘’../docs/faq.txt’’, ‘’r’’); $fp = fopen(‘’http://www.php.net/’’, ’’r’’); $fp = fopen(’’ftp://user:
[email protected]/’’, ‘’w’’); Les modes d’ouverture • 'r' Ouvre en lecture seule, 'r+' Ouvre en lecture et écriture (pointeur est placé au début) • 'w' Ouvre en écriture seule, 'w+' Ouvre en lecture et écriture; (pointeur est placé au début avec création du fichier si il n’existe pas) • 'a' Ouvre en écriture seule; place le pointeur de fichier à la fin du fichier file. Si le fichier n'existe pas, on tente de le créer. • 'a+' Ouvre en lecture et écriture; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer. 94
Fichiers
95
Fichiers Description • int fwrite ( resource $handle , string $string [, int $length ] ) • fwrite() écrit le contenu de la chaîne string dans le fichier pointé par handle . Si la longueur length est fournie, l'écriture s'arrêtera après length octets, ou à la fin de la chaîne (le premier des deux). • fwrite() retourne le nombre d'octets écrits ou FALSE en cas d'erreur
96
Fichiers Description string fread ( resource $handle , int $length )
fread() lit jusqu'à length octets dans le fichier référencé par handle . La lecture s'arrête lorsque length octets ont été lus, ou que l'on a atteint la fin du fichier. Retourne la chaîne lue ou FALSE si une erreur survient. 97
Fichiers
Description bool copy ( string $source , string $dest ) copy() fait une copie du fichier source vers le fichier dest . Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
98
Accès aux dossiers (I) Il est possible de parcourir les répertoires grâce à ces quelques fonctions :
chdir($str) : Change le dossier courant en $str. Retourne TRUE si succès, sinon FALSE. getcwd() : Retourne le nom du dossier courant (en format chaîne de caractères). opendir($str) : Ouvre le dossier $str, et récupère un pointeur $d dessus si succès, FALSE sinon et génère alors une erreur PHP . closedir($d) : Ferme le pointeur de dossier $d. readdir($d) : Lit une entrée du dossier identifié par $d. C’est-à-dire retourne un nom de fichier de la liste des fichiers du dossier pointé. Les fichiers ne sont pas triés. Ou bien retourne FALSE s’il n’y a plus de fichier. rewinddir($d) : Retourne à la première entrée du dossier identifié par $d.
99
Accès aux dossiers (I) "; chdir('home');
// dossier courant echo getcwd() . "
"; ?>
Description bool chdir ( string $directory ) chdir() change le dossier courant de PHP en directory . 100
Accès aux dossiers (I) Exemple : \n"; if(is_dir($file) && !in_array($file, array(".",".."))) { list_dir($file); } } closedir($dir); } } list_dir("."); ?>
101
Accès aux dossiers (I) La classe dir La classe dir contient les propriétés et méthodes permettant de parcourir un dossier pour en lister les fichiers. Propriété
Description
Handle Path
Valeur du pointeur vers le dossier Chemin du dossier ouvert (chaîne de caractères)
Méthode
Description
dir($str)
Constructeur de la classe, ouvre le dossier défini par le chemin $str (chaîne de caractères) et retourne une instance de la classe dir. Lecture d'une entrée du dossier ouvert Fermeture du dossier
read() close()
102
Accès aux dossiers (II) Exemple 1: \n"; echo "Chemin: ".getcwd()."
\n"; while($file = readdir($dir)) { echo "$file
\n"; } closedir($dir); } ?> $dir est un pointeur vers la ressource dossier $file est une chaîne de caractères qui prend pour valeur chacun des noms de fichiers retournés par readdir() 103
Accès aux dossiers (IV) Exemple 2 : handle.’’
’’; echo ‘’Chemin: ‘’.$d->path.’’
’’; while($entry = $d->read()) { // lecture d’une entrée echo $entry.’’
’’; } $d->close(); // fermeture du dossier ?> Cet exemple est équivalent au précédent. Ils listent tous les deux les fichiers et sous répertoires du dossier courant.
104
Dates et heures (I) Les fonctions de dates et heures sont incontournables sur Internet et sont indispensables pour la conversion en français des dates fournies par la base de données MySQL qui les code au format anglophone (YYYY-DD-MM hh:mm:ss).
Quelques fonctions :
date("$format") : retourne une chaîne de caractères contenant la date et/ou l’heure locale au format spécifié getdate() : retourne un tableau associatif contenant la date et l’heure checkdate($month, $day, $year) : vérifie la validité d’une date mktime($hour, $minute, $second, $month, $day, $year) : retourne le timestamp UNIX correspondant aux arguments fournis c’est-à-dire le nombre de secondes entre le début de l'époque UNIX (1er Janvier 1970) et le temps spécifié time() : retourne le timestamp UNIX de l’heure locale 105
Dates et heures (II) Exemple 1 : echo date(''Y-m-d H:i:s''); /* affiche la date au format MySQL : ‘2002-03-31 22:30:29’ */ Exemple 2 : if(checkdate(12, 31,2001)) echo"La St Sylvestre existe même chez les anglais !!!"; Exemple 3 : $aujourdhui = getdate(); $mois = $aujourdhui['mon']; $jour = $aujourdhui['mday']; $annee = $aujourdhui['year']; echo ''$jour/$mois/$annee'';
// affiche ‘31/3/2002’ 106
Dates et heures (III) Les formats pour date : • • • • • • • • • • •
d Jour du mois sur deux chiffres [01..31] j Jour du mois sans les zéros initiaux l Jour de la semaine textuel en version longue et en anglais D Jour de la semaine textuel en trois lettres et en anglais w Jour de la semaine numérique [0..6] (0: dimanche) z Jour de l'année [0..365] m Mois de l'année sur deux chiffres [01..12] n Mois sans les zéros initiaux F Mois textuel en version longue et en anglais M Mois textuel en trois lettres Y Année sur 4 chiffres
• • • • • • • • • • • • •
h Heure au format 12h [01..12] g Heure au format 12h sans les zéros initiaux H Heure au format 24h [00..23] G Heure au format 24h sans les zéros initiaux i Minutes [00..59] s Secondes [00.59] a am ou pm A AM ou PM L Booléen pour savoir si l'année est bisextile (1) ou pas (0) S Suffixe ordinal anglais d'un nombre (ex: nd pour 2) t Nombre de jour dans le mois donné [28..31] U Secondes depuis une époque Z Décalage horaire en secondes [43200..43200] 107
Dates et heures (IV) Les clés du tableau associatif retourné par getdate : seconds secondes minutes minutes hours heures mday jour du mois wday jour de la semaine, numérique mon mois de l'année, numérique year année, numérique yday jour de l'année, numérique weekday jour de la semaine, textuel complet en anglais month mois, textuel complet en anglais
108
Entêtes HTTP (I) Le rôle des entêtes est d’échanger des méta informations entre serveur et client à Propos du document, de la connexion, etc. Il est possible d’envoyer des entêtes particuliers du protocole HTTP grâce à la commande header.
Description void header ( string $string [, bool $replace [, int $http_response_code ]] )
header() permet de spécifier l'en-tête HTTP string lors de l'envoi des fichiers HTML. Reportez-vous à « HTTP/1.1 Specification » pour plus d'informations sur les en-têtes HTTP. Les entêtes doivent obligatoirement être envoyées avant l’affichage de tout caractère dans la page en cours. Car l’affichage force l’envoi des entêtes de base. • headers_sent() : Retourne TRUE si les entêtes ont déjà été envoyées, FALSE sinon. 109
Entêtes HTTP (III) Exemple pratique 1 :
Ce script effectue une redirection vers une autre page. C’est-à-dire que le navigateur du client en voyant cet entête Location va charger directement la page indiquée sans regarder la suite du script. La fonction exit est là pour parer au cas impossible où le script continuerait son exécution. Note: en règle générale, le format d’un entête est le suivant • Champ: valeur • Avec un espace entre les deux points ‘:‘ et la ‘valeur’. 110
Entêtes HTTP Exemple pratique 2 : "; echo "Votre mot de passe :".$_SERVER["PHP_AUTH_PW"];} ?> •
•
Cet exemple fait intervenir les variables d’environnement $PHP_AUTH_USER et $PHP_AUTH_PW qui contiennent le login et mot de passe d’un utilisateur préalablement identifié. Si l’utilisateur n’est pas identifié, alors on demande au navigateur d’afficher une boite de saisie de mot de passe et on spécifie que l’accès est interdit. Une fois que l’utilisateur est identifié on peut contrôler la validité des login et mot de passe et s’ils sont corrects afficher des données sensibles. Attention, cette méthode ne fonctionne pas lorsque PHP est installé en tant que module d’Apache mais seulement lorsqu’il est compilé en même temps que le serveur Apache. 111
Sessions
Les sessions sont un moyen de sauvegarder et de modifier des variables tout au cours de la visite d’un internaute sans qu’elles ne soient visibles dans l’URL et quelque soient leurs types (tableau, objet…).
Cette méthode permet de sécuriser un site, d’espionner le visiteur, de sauvegarder son panier (e-commerce), etc.
Les informations de sessions sont conservées en local sur le serveur tandis qu’un identifiant de session est posté sous la forme d’un cookie chez le client (ou via l’URL si le client refuse les cookies).
Quelques fonctions : session_start() : démarre une session session_destroy() : détruit les données de session et ferme la session session_register("var") : enregistre la variable $var dans la session en cours, attention!!!, ne pas mettre le signe $ (dollars) devant le nom de variable session_unregister("var") : détruit la variable $var de la session en cours 112
Sessions Le mécanisme des sessions est vraiment extrêmement simple. Prenons un premier exemple pour voir comment s'enregistre une variable dans une session avec un formulaire simple pour sauvegarder le nom du client qui s'est connecté.
Vous avez un simple formulaire HTML qui va poster au script page2.php le contenu de la variable nom. 113
Sessions page2.php Bienvenue sur ce site .
Regardons ce qui se passe sur la
page suivante.
Dans ce script, nous avons donc le démarrage de la session puis l'enregistrement dans une variable $nom de la valeur postée par le formulaire. Enfin, nous enregistrons $nom dans une variable de session. 114
Sessions(Initialisation) Page 3.php Vous êtes toujours parmi nous.
Dans ce script nous avons toujours le démarrage de session avec cette fois, la récupération de la variable nom depuis le tableau superglobal de session.
115
Sessions (Effacement) Nous avons vu que l'enregistrement de variables était vraiment très facile. Pour effacer une variable de session, c'est tout aussi simple. Page3.php Vous êtes toujours parmi nous .
Effacement de votre nom en cliquant
ici.
Continuons en créant notre 4 script. . . 116
Sessions (Effacement) L'effacement d'une variable de session se fait de la même manière qu'avec une variable classique. Vous utilisez la commande unset() suivie du tableau superglobal et de l'index contenant votre variable : Page4.php
Repartons en
arrière.
117
Sessions (Effacement Total) Dans notre exemple, nous n'avons qu'une seule valeur stockée dans notre session. Cependant, il peut arriver de vouloir réinitialiser toutes les variables sans pour autant vouloir changer de session. Pour effacer l'ensemble des valeurs d'une session, vous avez deux possibilités : Utiliser la commande session_unset() qui ne prend aucun paramètre et ne retourne aucune valeur. session_unset(); Vider le tableau superglobal des sessions.
$_SESSION = array(); Remarque : Il est recommandé par la Communauté PHP d'utiliser la seconde possibilité avec l'effacement du tableau superglobal. 118
Sessions (Destruction) Nous avons vu que l'enregistrement de variables était vraiment très facile. Pour effacer une variable de session, c'est tout aussi simple. Page3.php Vous êtes toujours parmi nous.
Effacement de votre nom en cliquant
ici.
Effacement de votre session en cliquant
ici.
– Continuons en créant notre 5 script. . .
119
Sessions (Destruction) Page5.php votre session a été détruite
Session détruite. . .
120
Expressions régulières Les expressions régulières sont un outil puissant pour la recherche de motifs dans une chaîne de caractères.
Fonctions : eregi($motif, $str) : teste l’existence du motif $motif dans la chaîne $str eregi_replace($motif, $newstr, $str) : remplace les occurrences de $motif dans $str par la chaîne $newstr split($motif, $str) : retourne un tableau des sous-chaînes de $str délimitées par les occurrences de $motif Les fonctions eregi, eregi_replace et split sont insensibles à la casse (c’està-dire ne différencient pas les majuscules et minuscules).
121
Expressions régulières
Description int eregi ( string $pattern , string $string )
eregi() est identique à ereg(), hormis le fait qu'elle ignore la casse des caractères lors de la recherche sur les caractères alphabétiques. 122
Expressions régulières Les motifs peuvent être très complexes et contenir des caractères spéciaux: [abcdef] : intervalle de caractères, teste si l’un d’eux est présent [a-f] : plage des caractères, teste la présence de tous les caractères minuscules entre ‘a’ et ‘f’ [^0-9] : exclusion des caractères de ‘0’ à ‘9’ \^ : recherche du caractère ’^’ que l’on déspécialise par l’antislash \ . : remplace un caractère ? : rend facultatif le caractère qu’il précède + : indique que le caractère précédent peut apparaître une ou plusieurs fois * : pareil que + Mais le caractère précédent peut ne pas apparaître du tout {i,j} : retrouve une chaîne contenant entre au minimum i et au maximum j fois le motif qu’il précède {i,} : idem mais pas de limite maximum {i} : retrouve une séquence d’exactement i fois le motif qu’il précède ^ : le motif suivant doit apparaître en début de chaîne $ : le motif suivant doit apparaître en fin de chaîne 123
Expressions régulières Exemples de motifs : ‘’[A-Z]’’ : recherche toutes les majuscules ‘’[a-zA-Z]’’ : recherche toutes les lettres de l’alphabet minuscules ou majuscules ‘’[^aeyuio]’’ : exclu les voyelles ‘’^Le ’’ : toute chaîne commençant par le mot ‘’Le‘‘ suivi d’un espace ‘’$\.com’’ : toute chaîne se terminant par ’’.com’’ (déspécialise le point) Exemples : if( ereg("^.*@wanadoo\.fr", $email) ) { echo"Vous êtes chez Wanadoo de France Télécom."; } $email = eregi_replace("@", "-nospam@", $email); Ce dernier exemple remplace "
[email protected]" en "
[email protected]". 124
Mail (I) La fonction mail envoie un message électronique. Syntaxe : • mail($recipient, $subject, $message[, $headers, $params]); Exemple : • $message = "salam tout le monde."; • mail("
[email protected]", "Aide sur PHP", $message); Les arguments obligatoires sont le destinataire, le sujet du message ainsi que le message proprement dit. Les entêtes et paramètres additionnels sont facultatifs. Note: cette fonction ne marche que si un programme de messagerie électronique (appelé « mailer ») est préalablement installé sur le serveur.
125
Mail (II) Exemple plus complet : , ‘’; $recipient .= ‘’Pais
’’; $subject = ‘’Notre rendez-vous’’; $message = ‘’Je vous propose le samedi 15 juin \n’’; $message .= ’’--\r\n’’; // Délimiteur de signature $message .= ‘’salam terre’’; $headers = ‘’From: Huto Etiopant \n’’; $headers .= ‘’Content-Type: text/html; charset=iso-8859-1\n’’ ; $headers .= ‘’Cc: [email protected]\n’’; mail($recipient, $subject, $message, $headers); ?>
126
Mail (III) Quelques entêtes : • From: Hugo Etiévant \n • X-Mailer: PHP\n // maileur • X-Priority: 1\n // Message urgent! • X-Files: Truth is out there\n // entête fantaisiste ! • Return-Path: \n// @ retour pour erreurs • Content-Type: text/html; charset=iso-8859-1\n // Type MIME • Cc: [email protected]\n // Champs CC • Bcc: [email protected], [email protected]\n // Champs BCC • Reply-To: // @ de retour Format général des entêtes : • Nom-Entete: valeur\n 127
Évaluation d’une portion de code PHP La fonction eval($str) évalue la chaîne de caractères $str comme du code php. Les variables éventuellement définies dans cette chaîne seront connues dans le reste du programme principal. Grâce à cette fonction, on peut conserver dans une base de données, des portions de code utilisables ultérieurement. Le code de la chaîne $str doit respecter les mêmes contraintes que le code normal. Notamment : • - point virgule après chaque instruction • - respect des séquences d’échappement • - etc… • Exemple : • $foobar = ‘’Hello Word’’; • eval(‘echo $foobar;’); // affiche ’Hello Word’ 128
Colorisation syntaxique (I) • PHP dispose de fonctions qui permettent d’afficher le code source de scripts php et d’en coloriser la syntaxe.
• Il n’est pas recommandé d’utiliser les fonctions suivantes afin que vos visiteurs ne connaissent pas votre code source et ne puissent ainsi pas exploiter des vulnérabilité de votre application web. • highlight_file($file), show_source : Colorisation de la syntaxe d'un fichier. Affiche la syntaxe colorisée du fichier $file, en utilisant les couleurs définies dans le moteur interne de PHP. • highlight_string($str) : Colorisation d'une chaîne de caractères contenant du code php.
129
Colorisation syntaxique (II) • Exemple : • • Résultat affiché : "; ConnexionSQL(); echo date("D, d M Y H:i:s"); if($action == "add") { AddNew(); } elseif($action == "stats") { ShowStats(); } /* ShowSubmitForm(); */ ShowStats(); $out .= ""; echo $out; ?>
130
Colorisation syntaxique (III) •
La configuration de la colorisation se trouve dans le fichier php.ini :
•
Et voici comment la commande phpinfo() affiche ces informations :
Couleur de fond Couleur des commentaires Couleur par défaut Couleur des balises HTML Couleur des mots réservés Couleur des chaînes
131
URL (I) •
Les URL (Uniform Ressource Location) sont les chemins de ressources sur internet.
• • • •
Exemples d’URL: http://www.google.fr/?q=cours+php http://cyberzoide.developpez.com/php/php4_mysql.ppt ftp://foo:[email protected]
•
Leur format spécifique leur interdit de comporter n’importe quel caractère (comme l’espace par exemple). Une URL est une chaîne de caractères composée uniquemment de caractères alphanumériques incluant des lettres, des chiffres et les caractères : - (tirêt), _ (souligné), . (point). Tous les autres caractères doivent êtres codés. On utilise le code suivant : %xx. Où % introduit le code qui le suit et xx est le numéro hexadécimal du caractère codé.
•
•
132
URL (II) •
Le passage de valeur d’un script à l’autre se fait soit par les sessions, soit par les formulaires ou encore par l’URL.
• •
Exemple par l’URL : Version imprimable
•
Dans cet exemple on transmet deux variables au script index.php : $imprim de valeur ‘’yes’’ et $user_id de valeur ‘’75’’. Les valeurs sont des chaînes de caractères qui pouront être castées implicitement en entier.
•
Le caractère ? Indique que la suite de l’URL sont des paramètres et ne font pas partie du nom de fichier. Le caractère = sépare un nom de paramètre et sa valeur transmise. Le caractère & séparer deux paramètres.
•
Pour faire face au cas général d’un paramètre dont la valeur contient des caractères interdits, on utilise les fonction de codage. 133
URL (III) • Quelques fonctions de codage sur l’URL :
• Codage de base : • urlencode : Encode une chaîne en URL. • urldecode : Décode une chaîne encodée URL. • Codage complet : • rawurlencode : Encode une chaîne en URL, selon la RFC1738. • rawurldecode : Décode une chaîne URL, selon la RFC1738. • Codage plus évolué : • base64_encode : Encode une chaîne en MIME base64. • base64_decode : Décode une chaîne en MIME base64 134
URL (IV) •
urlencode($str) : code la chaîne $str. Les espaces sont remplacés par des signes plus (+). Ce codage est celui qui est utilisé pour poster des informations dans les formulaires HTML. Le type MIME utilisé est application/x-www-formurlencoded.
• •
Exemple 1 : echo Foo’’;
•
rawurlencode($str) : code la chaîne $str. Remplace tous les caractères interdits par leur codage équivalent hexadécimal.
• • • •
Exemple 2 : echo Foo’’; Pour être accessible, la valeur du paramètre devra par la suite être décodée dans le script d’arrivé par la fonction réciproque adéquate. 135
URL (V) •
base64_encode($str) : code la chaîne $str en base 64. Cet encodage permet à des informations binaires d'être manipulées par les systèmes qui ne gèrent pas correctement les codes 8 bits (code ASCII 7 bit étendu aux accents européens), comme par exemple, les corps de mail qui en général sont américains et ne gère que les 7 bits. Une chaîne encodée en base 64 a une taille d’environ 33% supérieure à celle des données initiales.
• •
Exemple 3 : echo Foo’’;
• • • • •
Comparatif des trois encodages : Sans codage : René & Cie : 30%-5*20 urlencode : Ren%E9+%26+Cie+%3A+30%25-5%2A20 rawurlencode : Ren%E9%20%26%20Cie%20%3A%2030%25-5%2A20 base64_encode : UmVu6SAmIENpZSA6IDMwJS01KjIw 136
URL (VI) • parse_url($str) : retourne un tableau associatif contenant les différents éléments de l’URL passée en paramètre. Les champs sont les suivants : ‘’scheme’’ (protocol), ‘’host’’ (domaine), ‘’port’’ (n° de port), ‘’user’’ (nom d’utilisateur ftp), ‘’pass’’ (mot de passe ftp), ‘’path’’ (chemin de la ressource), ‘’query’’ (paramètres et valeurs), et ‘’fragment’’. • Exemple : • $tab = parse_url(’’http://www.cia.gov:8080/form.php?var=val’’); • Cet exemple retourne le tableau suivant :
Champ Valeur scheme http
host www.cia.gov port 8080 path form.php query var=val
137
URL (VII) • parse_str($str) : analyse la chaîne $str comme si c’était une URL et en extrait les variables et valeurs respectives qui seront alors connues dans la suite du script. • Cette fonction évite d’avoir à créer ses propres fonctions d’analyse de champs de base de données où l’on aurait sauvegardé une url. • Exemple : • $str = ‘’nom=jean+pierre&email[][email protected]&email[][email protected]’’; • parse_str($str); • echo $nom, $email[0], $email[1];
138
Cryptage et autres réjouissances •
• • •
•
crypt($str [, $salt]) : Retourne une chaîne de caractères. Crypte la chaîne de caractères $str. La chaîne optionnelle $salt sert de base au cryptage. Cet argument optionnel est appelé « grain de sel » à l’image des germes de nucléation à l’origine des dendrites. L’algorythme de cryptage utilisé par PHP n’est a priori pas défini (il peut varier d’un système à un autre), mais c’est en général le DES standard ou bien encore MD5. On sait aussi que le système utilisé – quel qu’il soit – est injectif, c’est-à-dire qu’il n’existe pas d’algorithme symétrique pour décrypter la chaîne codée résultante (du moins officiellement, il est toujours possible que la NSA ait pu le faire et aurait alors tout intérêt à garder cela secret). md5($str) : Crypte la chaîne $str en utilisant la méthode MD5. crc32($str) : Retourne la somme de vérification de redondance cyclique (32-bit) de la chaîne $str. Cette valeur sert généralement à vérifier l'intégrité de données transmises. uniqid($str [, $lcg]) : Retourne un identifiant en chaîne de caractères préfixé unique, basé sur l'heure courante, en micro-secondes. Si le paramètre optionnel booléen $lcg est vrai, uniqid() ajoutera une entropie « combined LCG » à la fin de la valeur retournée, ce qui renforcera encore l'unicité de l'identifiant. $x = md5 (uniqid (rand())); // $x est une chaîne difficile à prédire !!! 139
Fonctions de hachage (I) •
•
•
Les fonctions de hachage s’appliquent à des données afin d’en produire un condensat (dit aussi hashcode). Ce condensat est calculé à partir des données d’origine grâce à un algorithme injectif. C’est-à-dire que l’application de cet algorithme produira toujours le même condensat si on utilise les mêmes données de départ. Par contre, deux condensats égaux ne proviennent pas forcément des mêmes données. Les fonctions de hachage sont généralement utilisées pour créer des sommes de vérification ou signer des messages. La génération de condensats joints aux données est une méthode très utilisée pour assurer l’intégrité des données contre le piratage. Méthodologie : X veux envoyer un message à Y de façon a s’assurer que personne ne pourra altérer le message (le modifier) sans que Y s’en rende compte. X va calculer un condensat C du message et l’envoier à Y avec le message. A réception du message, Y calcul lui aussi un condensat K du message et le comparé au condensat C envoyé par X. Si K est différent de C, alors le message reçu est différent du message envoyé ! mhash($hash,$data) : retourne le condensat (binaire) de la chaîne $data, calculé à partir de l’algorithme d’identifiant numérique $hash. 140
Fonctions de hachage (II) •
•
Il existe différents algorithmes de hachage : Algorithme
Constante (identifiant)
Valeur
Taille du bloc
CRC32
MHASH_CRC32
0
4
MD5
MHASH_MD5
1
16
SHA1
MHASH_ SHA1
2
20
HAVAL256
MHASH_HAVAL256
3
32
RIPEMD160
MHASH_RIPEMD160
5
20
TIGER
MHASH_TIGER
7
24
GOST
MHASH_GOST
8
32
CRC32B
MHASH_CRC32B
9
4
HAVAL224
MHASH_HAVAL224
10
28
HAVAL192
MHASH_HAVAL192
11
24
HAVAL160
MHASH_HAVAL160
12
20
L’identifiant numérique passé en paramètre à mhash() est une constante. Les algorithmes agissent sur les données par bloc de x octets. Cette taille x est spécifiée dans le tableau ci-dessus. 141
Fonctions de hachage (III) • • • • • •
Exemple : $data = ‘’TOP SECRET : mise en alerte des missiles nucléaires.’’; $condensat = mhash(MHASH_SHA1, $data); echo bin2hex($condensat); /* affiche : ‘’28424f16ae4a53ae865601372a3462a014614c3b’’ (la fonction bin2hex() convertit le binaire en hexadécimal) */
•
mhash_get_hash_name($hash) : retourne le nom de l’algorithme dont l’identifiant numérique est passé en paramètre. mhash_get_block_size() : retourne la taille des blocs utilisés par l’algorithme dont l’identifiant numérique est passé en paramètre. mhash_count() : retourne le plus grand identifiant d’algorithme de hachage connu par l’interpréteur PHP. mhash_keygen_s2k($hash, $pass, $salt, $nbr) : retourne une clef de $nbr octets à partir du mot de passe $pass et du grain de sel $salt (chaîne de 8 octets complétée par des zéros s’il le faut) en utilisant l’algorithme d’identifiant $hash associé à l’algorithme Salted S2K spécifié dans OpenPGP (RFC 2440).
• • •
142
Fonctions de hachage (IV) • Pour connaître les algorithmes disponibles sur votre système, vous pouvez procéder ainsi : • $nbr = mhash_count(); • echo ‘’’’; • for($i = 0; $i <= $nbr; $i++) { • if(mhash_get_hash_name($i)) • echo ‘’$i | ’’.mhash_get_hash_name($i).’’ | ’’. • mhash_get_block_size($i).’’ |
’’; • } • echo ‘’
’’;
143
Divers • defined($str) : Vérifie qu'une constante existe. Renvoie VRAI si la constante dont le nom est passé en paramètre existe ou FAUX sinon. • sleep($nbr) : Retarde l'exécution du script durant $nbr secondes. Attention, Apache peut être configurer pour limiter la durée d’exécution des scripts. • usleep($nbr) : Retarde l'exécution du script durant $nbr microsecondes.
144
Requêtes Apache (I) •
getallheaders() : renvoie un tableau associatif contant tous les entêtes de la requête en cours.
• • • •
Exemple : $headers = getallheaders() ; foreach($headers as $key => $elem) // affichage des entêtes recueillies echo ‘’$key : $elem
\n’’ ;
• • • • • • •
Cet exemple affiche : Accept : */* Accept-Encoding : gzip, deflate Accept-Language : fr Connection : Keep-Alive Host : 127.0.0.1 User-Agent : Mozilla/4.0 (compatible; MSIE 5.5; Windows 98;)
•
Les fonctions décrites ici de fonctionnent que si PHP est installé en tant que module du serveur HTTP Apache. 145
Requêtes Apache (II) • apache_lookup_uri($str) : effectue une requête partielle sur l'URI spécifiée en paramètre et retourne un objet contenant toutes les informations importantes la concernant. • Les propriétés de l’objet retourné sont : status (n° erreur HTTP), the_request (requête HTTP complète), status_line, method (méthode HTTP utilisée), content_type (type MIME de la ressource), handler, uri, filename (nom et chemin de la ressource en local sur le serveur), path_info (chemin du répertoire distant), args, boundary, no_cache (vaut ‘1’ si mise en cache interdite), no_local_copy (vaut ‘1’ si copie locale interdite), allowed, send_bodyct, bytes_sent, byterange, clength, unparsed_uri, mtime, request_time (date de la requête au format timestamp UNIX).
146
Requêtes Apache (III) • • • • •
Exemple : $obj = apache_lookup_uri('http://127.0.0.1/cyberzoide/essai.php') ; $tab = get_object_vars($obj) ; foreach($tab as $key => $elem) echo ‘’$key : $elem
\n’’ ;
• • • • • • • • • • • • • • • •
Cet exemple affiche : status : 403 the_request : GET /cyberzoide/essai.php HTTP/1.1 method : GET uri : /cyberzoide/http://127.0.0.1/cyberzoide/essai.php filename : d:/internet/cyberzoide/http: path_info : //127.0.0.1/cyberzoide/essai.php no_cache : 0 no_local_copy : 1 allowed : 0 sent_bodyct : 0 bytes_sent : 0 byterange : 0 clength : 0 unparsed_uri : /cyberzoide/http://127.0.0.1/cyberzoide/essai.php request_time : 1034444645
147
Réseau • • • • • • • •
• •
checkdnsrr — Résolution DNS d'une adresse IP. gethostbyaddr — Retourne le nom d'hôte correspondant à une IP. gethostbyname — Retourne l'adresse IP correspondant à un hôte. gethostbynamel — Retourne la liste d'IP correspondants à un hôte. getprotobyname — Retourne le numéro de protocole associé au nom de protocole getprotobynumber — Retourne le nom de protocole associé au numéro de protocole getservbyname — Retourne le numéro de port associé à un service Internet, et un protocole. getservbyport — Retourne le service Internet qui correspond au port et protocole. ip2long — Convertit une chaîne contenant une adresse (IPv4) IP numérique en adresse littérale. long2ip — Convertit une adresse IP (IPv4) en adresse IP numérique 148
Exercice 1 : conversion de date (I) Étudions l’exemple complet de la conversion d’une date au format anglophone MySQL en format francophone. Une date MySQL se présente ainsi : "YYYY-DD-MM hh:mm:ss" YYYY : l’année numérique avec 4 chiffres, DD : le jour numérique, MM : le mois numérique, hh : heures, mm : minutes, ss : secondes Tous les nombres sur 2 chiffres prennent un zéro devant si nécessaire. Par exemple : "2002-20-04 15:08:20" correspond au 20 avril 2002 à 15h08 et 20 secondes.
Ce format correspond au type DATETIME. Soit lastmodified un attribut d’une table MySQL. La requête suivante permet d’extraire la date de dernière modification d’un enregistrement. SELECT lastmodified FROM citations WHERE id="$id"; 149
Exercice 1 : conversion de date (II) Etape 1 : extraction de la date d’une base de données MySQL $requet = "SELECT lastmodified FROM citations WHERE id=\‘’$id\’’’’; if($result = mysql_query($requet)) { if($ligne = mysql_fetch_row($result)) { $lastmodifed = $ligne[0]; } else die(‘’Erreur base de données’’); } else die(‘’Erreur base de données’’); Etape 2 : séparation de la date et de l’heure Le seul espace de la chaîne de caractères qui constitue la variable $lastmodified est un séparateur entre la date et l’heure. On va donc la scindée en ses deux morceaux grâce à la fonction explode qui renvoie les sous chaînes dans un tableau dont est extrait grâce à list les deux variables $date et $time. list($date, $time) = explode(‘’ ’’, $lastmodified); 150
Exercice 1 : conversion de date (III) Etape 3 : extraction des jour, mois, année On procède selon le même schéma que précédemment sauf qu’ici c’est le tiret qui est séparateur dans la date. list($year, $day, $month) = explode(‘’-’’, $date); Etape 4 : extraction facultative des heure, minute, seconde Ici, le séparateur sont les deux points. list($hour, $min, $sec) = explode(‘’:’’, $time); Etape 5 : affichage au format francophone echo $lastmodified = ‘’$day/$month/$year $time’’; Affiche ‘’20/04/2002 15:08:20’’. On a donc transcrit en français notre date anglaise. On peut aller encore plus loin en affichant les mois en toutes lettres et en français.
151
Exercice 1 : conversion de date (IV) • • • •
• • •
Etape 6 : affichage en toutes lettres du mois On crée d’abord le tableau des mois de l’année. $months = array("janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"); Ensuite, on affiche l’élément du tableau des mois de l’année dont l’indice est égale au numéro du mois. Comme l’indice du tableau commence à zéro, il faut soustraire 1 à $month, cela aura aussi pour effet de caster cette chaîne en entier (et de supprimer le zéro éventuel en première position). echo $lastmodified = ‘’le $day ‘’.$months[$month-1].’’ $year à ${hour}h${min}m${sec}s’’; Affiche ‘’le 20 avril 2002 à 15h08m20s’’. Et voilà !
152
Exercice 2 : compteur de visites (I) • On souhaite comptabilisé le nombre de chargement d’une page (la page d’accueil par exemple). On va procéder de la façon suivante : le compteur numérique sera stocké dans un fichier, à la première ligne. Ce fichier contiendra seulement un nombre, celui des visites. • Phase 1 : incrémenter la valeur dans le fichier • Ce fichier va s’appeler compteur.cpt. • Principe de l’algorithme : si le fichier n’existe pas encore (file_exists), alors on le crée et on l’ouvre en écriture (fopen w) et on initialise le compteur à zéro en écrivant la chaîne ‘0’ en première ligne (fputs) et on le referme (fclose). Ensuite, ouverture du fichier en lecture plus écriture (fopen r+), lecture du nombre (fgets), incrémentation d’une unité du nombre (++), positionnement du pointeur courant du fichier en première ligne (fseek 0) et réécriture du nombre (fputs) puis fermeture (fclose). • Cet algorithme (écrit dans la diapo suivante) est écrit directement dans le code source de la page d’accueil. 153
Exercice 2 : compteur de visites (II) Algorithme : $fichier = "compteur.cpt"; // affectation du nom de fichier if( ! file_exists($fichier)) { // test d’existence // initialisation du fichier si n’existe pas encore $fp = fopen($fichier,"w"); // ouverture en écriture fputs($fp,"0"); // écriture fclose($fp); // fermeture } $fp = fopen($fichier,"r+"); // ouverture $hits = fgets($fp,10); // lecture $hits++; // incrémentation fseek($fp,0); // positionnement fputs($fp,$hits); // écriture fclose($fp); // lecture 154
Exercice 2 : compteur de visites (III) Phase 2 : généralisation aux autres pages • Comme les internautes peuvent atterrir sur des pages internes à votre site sans passer par l’accueil, il peut être intéressant de pouvoir comptabilité des visites des autres pages. Cela permettra aussi de comparer la popularité relative de vos différentes rubriques. • Créons donc une fonction que l’on placera dans un fichier à part par exemple compteur.php et que l’on appellera par inclusion comme ceci : • Remplacez "ma_page" par un identifiant unique pour chaque page.
function Mon_Compteur($page) { $fichier = $page.".cpt"; if(!file_exists($fichier)) { $fp = fopen($fichier,"w"); fputs($fp,"0"); fclose($fp); } $fp = fopen($fichier,"r+"); $hits = fgets($fp,10); $hits++; fseek($fp,0); fputs($fp,$hits); fclose($fp); } ?>
155
Exercice 2 : compteur de visites (IV) • Phase 3 : protection contre la redondance • Comme un visiteur peut charger plusieurs fois la même page au cours d’une même visite, ce mode de décompte n’est pas assez précis et va surestimé le nombre réel de visiteurs. Il faut donc garder en mémoire le fait qu’un visiteur est déjà passé par la page et incrémenter le compteur seulement si ce n’est pas le cas. On va donc créer une variable de session : un tableau contenant la liste des pages visitées. • Principe du nouvel algorithme : on teste l’existence de la variable de session $PAGES_LIST, si elle n’existe pas on la crée, on y ajoute la page en cours et on appelle la fonction Mon_Compteur. Si elle existe, on teste la présence de la page en cours dans ce tableau, si elle n’y est pas alors on l’y met et on appelle Mon_Compteur. • L’appel est légèrement différent : • 156
Exercice 2 : compteur de visites (V) • Voici le code à rajouter dans le fichier compteur.php : • session_start(); // démarrage de la session • if( ! isset($PAGES_LIST)) { // test de l’existence de la variable de session • $PAGES_LIST = array($page); // création de la variable • session_register($PAGES_LIST); // 157 ajout de la page en cours
Le phénomène PHP • Sa gratuité et le libre accès à ses sources en fait un langage très populaire surtout auprès de la communauté GNU Linux. • Sa syntaxe C universellement connue, et sa programmation intuitive en font le langage qui a fait la plus grande percée auprès des webdesigners en 2001. • De nombreux sites lui sont consacrés, on y trouve des scripts, des astuces et même des concours de logos…
158
PHP et les bases de données
159
Présentation PHP offre un interfaçage très simple entre plusieurs base de données : – Oracle, MySQL, SQLServer – Sybase, Empress, FilePro – Interbase, mSQL, PostgreSQL – ODBC(Acess, MS-SQL, …) La communication avec les bases de données se fait à l’aide du langage SQL. • • • • •
CREATE TABLE : Pour la création d’une table DELETE : Pour la suppression de lignes d’une table INSERT : Pour l’insertion d’une nouvelle ligne SELECT : Pour récupérer des lignes d’une table ou d’une vue UPDATE : Pour modifier les valeurs dans des champs
160
MySQL •
MySQL est une base de données implémentant le langage de requête SQL un langage relationnel très connu. Cette partie suppose connue les principes des bases de données relationnelles.
•
Il existe un outil libre et gratuit développé par la communauté des programmeurs libres : phpMyAdmin qui permet l’administration aisée des bases de données MySQL avec php. Il est disponible sur : http://sourceforge.net/projects/phpmyadmin/ et http://www.phpmyadmin.net.
•
Avec MySQL vous pouvez créer plusieurs bases de données sur un serveur. Une base est composée de tables contenant des enregistrements.
•
Plus d'informations sont disponibles à http://www.mysql.com/.
•
La documentation de MySQL est disponibles à http://www.mysql.com/documentation/, ainsi qu'en français chez nexen : http://dev.nexen.net/docs/mysql/. 161
Gestion du BD avec MySQL Pour traiter une base de données, MySQL offre trois manières : Utilisation des lignes de commandes Utilisation de l’interface phpMyAdmin Utilisation du langage php
Les opérations de base : Création d’une base de données Création de différentes tables
162
A l’aide des commandes en ligne
163
164
165
166
167
En utilisant des scripts PHP Création d’une nouvelle table dans la base stock
$c = mysql_connect("localhost", "root", ""); $db = mysql_select_db("stock", $c); $req = "create table stock.Prod_Alimentaire( id_PA int unsigned not null auto_increment primary key, nom varchar(32) not null, date_limite date, commentaire text, prix float not null)"; mysql_query($req, $c); ?> 168
169
Connexion (I) Pour se connecter à une base depuis php, il faut spécifier un nom de serveur, un nom d’utilisateur, un mot de passe et un nom de base.
Les fonctions de connexion : •
•
•
mysql_connect($server,$user,$password) : permet de se connecter au serveur $server en tant qu’utilisateur $user avec le mot de passe $password, retourne l’identifiant de connexion si succès, FALSE sinon mysql_select_db($base[,$id]) : permet de choisir la base $base, retourne TRUE en cas de succès, sinon FALSE mysql_close([$id]) : permet de fermer la connexion
Les identifiants de connexion ne sont pas nécessaires si on ne se connecte qu’à une seule base à la fois, ils permettent seulement de lever toute ambiguïté en cas de connexions multiples.
170
Connexion (II) Exemple 1 : if( $id = mysql_connect("localhost", "root"," ") ) { if( $id_db = mysql_select_db("gigabase") ) { echo "Succès de connexion."; /* code du script … */ } else { die("Echec de connexion à la base."); } mysql_close($id); } else { die("Echec de connexion au serveur de base de données."); } ?> 171
Connexion (III) Exemple 2 : • @mysql_connect(‘’localhost’’,’’foobar’’,’’0478’’) or die(‘’Echec de connexion au serveur.’’); • @mysql_select_db(‘’gigabase’’) or die(‘’Echec de sélection de la base.’’); •
Cet exemple est équivalent au précédent mais plus court à écrire. Le symbole @ (arobase) permet d’éviter le renvoie de valeur par la fonction qu’il précède.
•
On pourra avantageusement intégrer ce code dans un fichier que l’on pourra joindre par include(). C’est aussi un moyen de sécuriser le mot de passe de connexion.
•
Une connexion persistante évite d’avoir à rouvrir une connexion dans chaque script. Les connexions sont automatiquement fermées au bout d’un certain temps en cas d’absence de toute activité…
172
Interrogation •
Pour envoyer une requête à une base de donnée, il existe la fonction : mysql_query($str) qui prend pour paramètre une chaîne de caractères qui contient la requête écrite en SQL et retourne un identificateur de résultat ou FALSE si échec.
•
Les requêtes les plus couramment utilisées sont : CREATE (création d’une table), SELECT (sélection), INSERT (insertion), UPDATE (mise à jour des données), DELETE (suppression), ALTER (modification d’une table), etc.
Exemple : $res = mysql_query("SELECT * FROM Table");
•
L’identificateur de résultat $result permettra à d’autres fonctions d’extraire ligne par ligne les données retournées par le serveur.
173
Extraction des données (I) Une fois la requête effectuée et l’identificateur de résultat acquis, il ne reste plus qu’à extraire les données retournées par le serveur.
Sous MySQL, l’affichage des résultats d’une requête se fait ligne par ligne. Une boucle permettra de recueillir chacune des lignes à partir de l’identifiant de résultat. SQL > SELECT * FROM users; ID NAME ADDRESS ---------------------------1 Boris Moscou 2 Bill Washington 3 William London
1ère ligne 2ème ligne 3è ligne
Une ligne contient (sauf cas particulier) plusieurs valeurs correspondants aux différents attributs retournés par la requête. Ainsi, une ligne de résultat pourra être sous la forme d’un tableau, d’un tableau associatif, ou d’un objet. 174
Extraction des données (II) mysql_fetch_row($result) : retourne une ligne de résultat sous la forme d’un tableau. Les éléments du tableau étant les valeurs des attributs de la ligne. Retourne FALSE s’il n’y a plus aucune ligne. Exemple 1 : mysql_num_fields($res) //Nb_champs $requet = "SELECT * FROM users"; mysql_field_name($res) //nom_champs if($res = mysql_query($requet)) { while($ligne = mysql_fetch_row($res)) { $id = $ligne[0]; $name = $ligne[1]; $address = $ligne[2]; echo "$id - $name, $address
"; } } else { echo "Erreur de requête de base de données."; } Ici, on accède aux valeurs de la ligne par leur indice dans le tableau.
175
Extraction des données (III) mysql_fetch_array($result) : retourne un tableau associatif. Les clés étant les noms des attributs et leurs valeurs associées leurs valeurs respectives. Retourne FALSE s’il n’y a plus aucune ligne. Exemple 2 : $requet = "SELECT * FROM users"; if($res = mysql_query($requet)) { while($ligne = mysql_fetch_array($res)) { $id = $ligne["id"]; $name = $ligne["name"]; $address = $ligne["address"]; echo "$id - $name, $address
"; } } else { echo "Erreur de requête de base de données.";} Ici, on accède aux valeurs de la ligne par l’attribut dans le tableau associatif.
176
Extraction des données (IV) mysql_fetch_object($result) : retourne un objet. Les attributs de l’objet correspondent à ceux de la ligne de résultat. Et les valeurs des attributs de l’objet correspondent à ceux de la ligne de résultat. Retourne FALSE s’il n’y a plus aucune ligne. Exemple 3 : $requet = "SELECT * FROM users"; if($result = mysql_query($requet)) { while($ligne = mysql_fetch_object($result)) { $id = $ligne->id; $name = $ligne->name; $address = $ligne->address; echo "$id - $name, $address
"; } } else { echo "Erreur de requête de base de données."; } Ici, on accède aux valeurs par leur attribut dans l’objet. 177
Application : Création de classe SGBD Tableau des différentes classes, attributs et méthodes : class SGBD class MySQL
var $SGBD_login var $SGBD_password
Nom de la classe mère. Nom de la classe fille, destinée pour le SGBD MySQL.
Attribut contenant le login de la base de donnée Attribut contenant le password de la base de donnée
var $SGBD_host
Attribut contenant l'hôte de la base de donnée
var $SGBD_base
Attribut contenant le nom de la base de donnée
function connect()
Méthode de connection au SGBD
function requete()
Méthode d'envoi de requête au SGBD
function deconnect() var $connect
Méthode de déconnection au SGBD Attribut contenant la connection au SGBD
178
Classe de base : SGBD
// Création de la classe mère
var $SGBD_login;
// Attribut du login du SGBD
var $SGBD_password;
// Attribut du password du SGBD
var $SGBD_host;
// Attribut de l'hôte du SGBD
var $SGBD_base;
// Attribut du nom de la BD
var $connect;
// Attribut de connection
var $requete;
// Attribut de requête
179
Classe de base : SGBD // Définition du constructeur function SGBD ($login, $password, $host, $base) { // Vérification des variables if (empty ($login) || empty ($host) || empty ($base)) { // Affichage du message d'erreur echo"Erreur : Variable(s) non renseignées!!!"; exit; }
?>
}
}
else { // Initialisation des attributs $this->SGBD_login = $login; $this->SGBD_password = $password; $this->SGBD_host = $host; $this->SGBD_base = $base; }
180
Classe MySQL expansion de la classe SGBD SGBD_host, $this->SGBD_login, $this->SGBD_password); if (!$connect) { echo "Erreur : Connection à MySQL impossible."; exit; } if (!mysql_select_db ($this->SGBD_base, $connect)) { echo "Erreur : Connection à la base de données impossible."; exit; } }
$this->connect = $connect;
}//Fin de la fonction connect()
181
Classe MySQL expansion de la classe SGBD function requete ($requete) { // Exécution de la requête $result = mysql_query ($requete, $this->connect); // Vérification de la requête if (!$result) { // Affichage du message d'erreur echo "Erreur : Impossible d'effectuer la requête."; exit; } else { // Initialisation de l'attribut de requête $this->requete = $result; } } //Fin de la fonction requete() function deconnect () { mysql_close ($this->connect); // Déconnection de la base de données } //Fin de la fonction deconnect() } //Fin de la classe MySQL ?>
182
Classe MySQL expansion de la classe SGBD
include ("SGBD.class.php"); // Inclusion de la classe mère /* Initialisation de la variable du SGBD correspondant */ $SQL = "MySQL"; // Inclusion de la classe fille du SGBD correspondant include ($SQL.".SGBD.class.php"); /* Création d'un nouvel objet de la classe fille + lancement du constructeur */ /* Les informations sont adaptés à mon serveur, à vous de les modifier pour quelles correspondent avec votre SGBD */ $database = new $SQL('root', '', 'localhost', 'test'); // Connection à la base de données $database->connect(); 183
Classe MySQL expansion de la classe SGBD /* Exécution d'une requête (création d'une nouvelle base de données). Attention, pour créer une nouvelle base de données, il faut que votre utilisateur ai touts les droits. Ceci n'est qu'un exemple parmi tant d'autres, vous pouvez effectuer n'importe quel requête MySQL avec cette méthode */ $database->requete ("CREATE DATABASE newBase");
// Déconnection de la base de données $database->deconnect(); ?>
184