You are on page 1of 43

Avant toutes choses !

Descriptif Avant de commencer crire vos pages en PHP, il faut d'abord connatre un minimum de choses sur ce formidable langage. PHP (officiellement, ce sigle est un acronyme rcursif pour "PHP: Hypertext Preprocessor") est un langage de scripts gnraliste, Open Source, et spcialement conu pour le dveloppement d'applications web. Il peut tre intgr facilement vos pages HTML. Le code PHP que vous allez insrer dans vos pages WEB sera repr par un serveur WEB (si il est muni de l'extension PHP) qu'il l'enverra PHP pour l'interprter (je parle bien d'interprtation et non de compilation). Pour information sachez que PHP est support par de nombreux serveurs WEB, dont le fameux projet Apache. Grce ces portions de code PHP que vous allez insrer dans vos pages WEB, PHP vous permettra d'crire rapidement des pages WEB contenus dynamiques. Surtout si il est coupl avec un serveur de bases de donnes relationnelles tel que MySQL. Le fonctionnement Il est noter une diffrence avec les autres scripts CGI crits dans d'autres langages tels que le Perl ou le C : au lieu d'crire un programme avec de nombreuses lignes de commandes afin de gnrer une page HTML, avec PHP, vous crivez une page HTML avec du code PHP inclus l'intrieur afin de raliser une action prcise. Le code PHP est inclus entre une balise de dbut et une balise de fin qui permettent au serveur web de passer en "mode PHP". La connaissance du code HTML est donc vivement conseille, voir mme indispensable pour commencer ses premires pages en PHP (ceci car le PHP ne fait que gnrer du code HTML ; et qu'il est inconcevable de gnrer quelque chose que l'on ne matrise pas). Il faut galement savoir que lorsque vous insrez le moindre petit bout de code PHP dans une page HTML, vous devrez changer l'extension de ce fichier en .php (en clair : si vous avez une page nomme index.htm et que vous y insrez du code PHP, il vous faudra la renommer en index.php). Comme nous venons de le voir, il est tout fait possible de mlanger, au sein d'une mme page WEB, des instructions HTML et des instructions PHP. Seulement, pour que le serveur qui vous hberge puisse reprer les portions de code en PHP, il suffit simplement de lui indiquer le dbut ainsi que la fin du code PHP. Ces marques qui dlimitent la portion de code, s'appellent des balises : - on utilisera la balise <?php pour marquer le dbut d'une portion de code PHP - on utilisera la balise ?> pour marquer la fin d'une portion de code PHP Les instructions du code PHP se placeront naturellement entre ces deux balises.

exemple1
<html> <head> <title>Test</title> </head> <body> <p>un bout de code en HTML</p> <?php echo 'Mon premier script en PHP'; ?> </body> </html>

Ne vous inquitez pas pour le moment, on dcrira plus tard ce que produit cette ligne de PHP. Ce petit exemple est juste l pour vous montrer comment on insre du code PHP dans une page WEB.

2002 - 2007 lephpfacile.com - Page 1/2

Comme tout bon langage de programmation, PHP offre la possibilit de commenter son code. Pour cela, deux techniques : - pour commenter une seule ligne de code PHP, on prcdera cette ligne de deux slashs // - pour commenter une portion de code, on prcdera la premire ligne de code que l'on souhaite commenter par un /* et on fera suivre la dernire ligne de code que l'on souhaite commenter par un */

exemple2
<?php // ceci est un commentaire sur une seule ligne /* ceci est un commentaire sur plusieures lignes */ ?>

Ce qui distingue le PHP des langages de script comme le Javascript est que le code est excut sur le serveur. Si vous avez un script similaire sur votre serveur, le client ne reoit que le rsultat du script, sans aucun moyen d'avoir accs au code qui a produit ce rsultat. Vous pouvez configurer votre serveur web afin qu'il analyse tous vos fichiers HTML comme des fichiers PHP. Ainsi, il n'y a aucun moyen de distinguer les pages qui sont produites dynamiquement des pages statiques. Le grand avantage de PHP est qu'il est extrmement simple pour les nophytes, mais offre des fonctionnalits avances pour les experts. Ne craignez pas de lire la longue liste de fonctionnalits PHP. Vous pouvez vous plonger dans le code, et en quelques instants, crire des scripts simples. Bien que le dveloppement de PHP soit orient vers la programmation pour les sites web, vous pouvez en faire bien d'autres usages. Les besoins pour bien commencer Pour bien commencer, il vous faut deux choses essentielles : - un diteur de texte pour crire vos portions de code en PHP - un environnement de dveloppement afin de tester ces portions de code En ce qui concerne les diteurs de textes, vous pourrez en trouver des dizaines sur la toile, suivant votre systme d'exploitation et vos diverses exigences de fonctionnalits. Pour vous dcider, vous pouvez consulter des sites comparants des nombreux diteurs. Pour l'environnement de dveloppement, si vous ne voulez pas trop vous compliquer la vie est installant Apache, PHP et MySQL la main, je vous conseille d'utiliser des "packages" proposant des solutions pretes l'emploi. En quelques clics, votre environnement sera install et fonctionnel. Voici quelques sites proposant ce genre d'environnement : - EasyPHP (Windows) - wampserver (Windows) - mamp (Apple) - BigApache Conclusion Peu de choses dire pour ce premier cours, si ce n'est qu'il faut bien comprendre le fonctionnement de PHP : PHP travaille du ct serveur et non du ct client. C'est dire que PHP va gnrer des pages comprhensibles par les navigateurs WEB des clients, soit de l'HTML (un navigateur WEB ne comprend pas le PHP). A ne pas oublier : - insertion de code PHP l'aide des balises <?php et ?> - renommer les fichiers HTML contenant du PHP en .php - crire des commentaires sur son code PHP avec un // ou un /* ... */
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 21:27

2002 - 2007 lephpfacile.com - Page 2/2

Dclarer des variables

Etudions dans un premier cours la dclaration des diffrents types de variables. Pour simplifier les choses, nous allons admettre qu'une variable correspond un espace de la mmoire o l'on peut stocker une information. Or, afin de pouvoir rcuprer cette information lorsque l'on en a besoin, nous allons attribuer un nom notre variable (si mes prof m'entendaient parler, ils me zapperaient tous mes diplmes). En PHP, les variables sont reprsentes par une chane de caractres, ayant toujours comme premier caractre, le caractre dollar ($). Les variables peuvent avoir n'importe quelle lettre en deuxime caractre du moment qu'il ne s'agit pas d'un chiffre. De plus, on ne peut mettre d'espace dans le nom d'une variable. Puis, pour assigner une valeur une variable, on tachera d'utiliser l'oprateur =, tout en prenant soin de toujours placer la variable qui reoit le rsultat d'une opration gauche du signe =. Dmonstration : - Lorsque l'on dsire affecter une chane de caractres une variable, il faut placer cette chane de caractres entre deux ". - Lorsque l'on dsire affecter une valeur numrique une variable, il ne faut pas placer de " autour cette valeur (en fait, c'est possible de mettre des " autour d'une valeur numrique, mais ensuite, il faut tre vraiment vigilent, car on pourrait faire la confusion entre une valeur numrique et une chane de caractres). Voici quelques exemples de dclarations de variables :

exemple1
<?php $nom = "LA GLOBULE"; // $nom contient alors la chane de caractres LA GLOBULE. $mon_chiffre = 12; // $mon_chiffre contient la valeur numrique 12. $5toto = "test"; // Cette dclaration n'est pas valide car le nom de la variable commence par un chiffre ?>

Voyons maintenant la dclaration des variables de type tableau (array). Pour ceux qui sont dbutants en programmation, nous allons prendre un exemple plutt simplet afin de comprendre ce qu'est un tableau. Imaginons un classeur d'colier (ce sera notre tableau) contenant diffrentes feuilles (qui seront les indices du tableau). Imaginons galement que ces feuilles soient numrotes, et chaque feuille contienne un texte particulier. Ds lors, on peut chercher le contenu d'une feuille de ce classeur grce son numro (on cherche donc l'information contenu dans le classeur la page numro x). En informatique, un tableau, c'est exactement la mme chose que notre classeur. Il s'agit d'une variable contenant diffrentes informations (les textes) et ces informations sont classes suivant le numro de l'indice (c'est dire le numro de la feuille). Par exemple, supposons que l'on ai la variable $fruit de type array. On pourrait alors avoir le code suivant :

exemple2
<?php $fruit = Array(); $fruit[0] = "fraise";

2002 - 2007 lephpfacile.com - Page 1/2

$fruit[1] = "banane"; $fruit[2] = "abricot"; ?>

En reprenant l'exemple du classeur, c'est comme si nous avions un classeur de nom fruit, ayant 3 pages : - sur la page 0, on aurait l'information fraise - sur la page 1, on aurait l'information banane - sur la page 2, on aurait l'information abricot Nous venons, dans ce bout de code, de dclarer une variable de type array qui comporte 3 lments (les pages). Nous aurions eu le mme rsultat en excutant le bout de code suivant :

exemple3
<?php $fruit = $fruit[] $fruit[] $fruit[] ?> Array(); = "fraise"; = "banane"; = "abricot";

En revanche, cette syntaxe est moins lisible, vu que souvent, on n'arrive plus vraiment savoir quelle page se trouve l'information recherche (on s'emmle dans les indices). Apart ! - Au lieu d'utiliser des chiffres pour les indices (comme dans notre exemple o nous avons utilis les indices 0, 1 et 2) nous pouvons trs bien utiliser des chanes de caractres. Ce qui pourrait alors donner :

exemple4
<?php $fruit = Array(); $fruit['le_meilleur'] = "fraise"; $fruit['le_prefere_de_Julien'] = "banane"; $fruit['mon_prefere'] = "abricot"; ?>

Or dans ce cas, il faut videment utiliser pour chaque indice du tableau, une chane de caractre unique. - nous pouvons galement dclarer des tableaux plusieurs lments. Pour ceux qui dsirent vraiment exploiter cette possibilit, je vous invite aller consulter la documentation officielle PHP.
Auteur : LA GLOBULE Dernire rvision du cours : le 18/12/2007 22:23

2002 - 2007 lephpfacile.com - Page 2/2

Afficher le contenu des variables

Lors de cet exercice, nous allons mettre en pratique notre premier bout de code en PHP. Il faut galement savoir que toutes les variables en PHP commencent par le signe dollar ($), et il faut galement ne pas oublier de placer un ; chaque fin d'instruction PHP. Etudions le code suivant :

exemple1
<?php $nom = "LA GLOBULE"; echo 'Bonjour '; echo $nom; echo ' !'; ?>

Ce qui affichera l'cran : Bonjour LA GLOBULE !

En effet, nous avons plac la chane de caractres LA GLOBULE dans la variable $nom, puis nous avons demander PHP d'crire la chane de caractres Bonjour, puis le contenu de la variable $nom (qui contient donc la chane LA GLOBULE), et enfin, nous affichons un !. Ce qui donne bien comme rsultat "Bonjour LA GLOBULE !" (Remarquons au passage qu'une variable contenant une chane de caractres se dclare en mettant le nom de la variable puis un signe = et enfin, la chane de caractres entre deux "). Au passage, remarquons galement que nous venons d'apprendre notre premire commande PHP, la commande echo(). Cette fonction nous permet d'afficher l'cran des chanes de caractres, qui peuvent tre dfinies directement par l'utilisateur (comme lorsque l'on fait un echo 'Bonjour ';) ou qui peuvent tre des contenus de variables (lorsque l'on fait echo $nom;). Attention !!! En effet, si nous avions cris le code suivant :

exemple2
<?php $nom = "LA GLOBULE"; echo 'Bonjour '; echo '$nom'; echo ' !'; ?>

Nous aurions eu l'cran : Bonjour $nom !

Attention donc bien utiliser les ' qui ne servent qu' dlimiter les chanes de caractres, et donc, il ne faut surtout pas les utiliser pour afficher le contenu d'une variable. En effet, lorsque l'on tape echo '$nom'; PHP pense que l'on dsire afficher la chane de caractres $nom et non le contenu de la variable $nom. Prenons un autre exemple o nous allons afficher la date et l'heure du jour. On a le code suivant :

2002 - 2007 lephpfacile.com - Page 1/2

exemple3
<?php $date_du_jour = date ("d-m-Y"); $heure_courante = date ("H:i"); echo 'Nous sommes le : '; echo $date_du_jour; echo ' Et il est : '; echo $heure_courante; ?>

Ce qui affichera l'cran : Nous sommes le 17-09-2002 Et il est 12:10

Dans ce cas, nous venons d'utiliser la fonction date() qui nous permet d'afficher la date du jour ainsi que l'heure courante (en fait, la date du serveur). Dans un premier temps, nous avons affect la variable $date_du_jour le contenu que retourne la fonction date() munie des paramtres "d-m-Y", soit 17-09-2002, puis nous avons affect la variable $heure_courante le contenu que retourne la fonction date() munie des paramtres "H:i", soit 12:10. Voici la liste des paramtres possibles pour la fonction date() : - a : "am" (matin) ou "pm" (aprs-midi) - A : "AM" (matin) ou "PM" (aprs-midi) - d : Jour du mois, sur deux chiffres (ventuellement avec un zros) : "01" "31" - D : Jour de la semaine, en trois lettres (et en anglais) : par exemple "Fri" (pour Vendredi) - F : Mois, textuel, version longue; en anglais, i.e. "January" (pour Janvier) - h : Heure, au format 12h, "01" "12" - H : heure, au format 24h, "00" "23" - g : Heure, au format 12h sans les zros initiaux, "1" "12" - G : Heure, au format 24h sans les zros initiaux, "0" "23" - i : Minutes; "00" "59" - j : Jour du mois sans les zros initiaux: "1" "31" - l : Jour de la semaine, textuel, version longue; en anglais, i.e. "Friday" (pour Vendredi) - L : Boolen pour savoir si l'anne est bissextile ("1") ou pas ("0") - m : Mois; i.e. "01" "12" - n : Mois sans les zros initiaux; i.e. "1" "12" - M : Mois, en trois lettres (et en anglais) : par exemple "Jan" (pour Janvier) - s : Secondes; i.e. "00" "59" - S : Suffixe ordinal d'un nom
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 21:27

2002 - 2007 lephpfacile.com - Page 2/2

Afficher le contenu des variables

Lors de cet exercice, nous allons mettre en pratique notre premier bout de code en PHP. Il faut galement savoir que toutes les variables en PHP commencent par le signe dollar ($), et il faut galement ne pas oublier de placer un ; chaque fin d'instruction PHP. Etudions le code suivant :

exemple1
<?php $nom = "LA GLOBULE"; echo 'Bonjour '; echo $nom; echo ' !'; ?>

Ce qui affichera l'cran : Bonjour LA GLOBULE !

En effet, nous avons plac la chane de caractres LA GLOBULE dans la variable $nom, puis nous avons demander PHP d'crire la chane de caractres Bonjour, puis le contenu de la variable $nom (qui contient donc la chane LA GLOBULE), et enfin, nous affichons un !. Ce qui donne bien comme rsultat "Bonjour LA GLOBULE !" (Remarquons au passage qu'une variable contenant une chane de caractres se dclare en mettant le nom de la variable puis un signe = et enfin, la chane de caractres entre deux "). Au passage, remarquons galement que nous venons d'apprendre notre premire commande PHP, la commande echo(). Cette fonction nous permet d'afficher l'cran des chanes de caractres, qui peuvent tre dfinies directement par l'utilisateur (comme lorsque l'on fait un echo 'Bonjour ';) ou qui peuvent tre des contenus de variables (lorsque l'on fait echo $nom;). Attention !!! En effet, si nous avions cris le code suivant :

exemple2
<?php $nom = "LA GLOBULE"; echo 'Bonjour '; echo '$nom'; echo ' !'; ?>

Nous aurions eu l'cran : Bonjour $nom !

Attention donc bien utiliser les ' qui ne servent qu' dlimiter les chanes de caractres, et donc, il ne faut surtout pas les utiliser pour afficher le contenu d'une variable. En effet, lorsque l'on tape echo '$nom'; PHP pense que l'on dsire afficher la chane de caractres $nom et non le contenu de la variable $nom. Prenons un autre exemple o nous allons afficher la date et l'heure du jour. On a le code suivant :

2002 - 2007 lephpfacile.com - Page 1/2

exemple3
<?php $date_du_jour = date ("d-m-Y"); $heure_courante = date ("H:i"); echo 'Nous sommes le : '; echo $date_du_jour; echo ' Et il est : '; echo $heure_courante; ?>

Ce qui affichera l'cran : Nous sommes le 17-09-2002 Et il est 12:10

Dans ce cas, nous venons d'utiliser la fonction date() qui nous permet d'afficher la date du jour ainsi que l'heure courante (en fait, la date du serveur). Dans un premier temps, nous avons affect la variable $date_du_jour le contenu que retourne la fonction date() munie des paramtres "d-m-Y", soit 17-09-2002, puis nous avons affect la variable $heure_courante le contenu que retourne la fonction date() munie des paramtres "H:i", soit 12:10. Voici la liste des paramtres possibles pour la fonction date() : - a : "am" (matin) ou "pm" (aprs-midi) - A : "AM" (matin) ou "PM" (aprs-midi) - d : Jour du mois, sur deux chiffres (ventuellement avec un zros) : "01" "31" - D : Jour de la semaine, en trois lettres (et en anglais) : par exemple "Fri" (pour Vendredi) - F : Mois, textuel, version longue; en anglais, i.e. "January" (pour Janvier) - h : Heure, au format 12h, "01" "12" - H : heure, au format 24h, "00" "23" - g : Heure, au format 12h sans les zros initiaux, "1" "12" - G : Heure, au format 24h sans les zros initiaux, "0" "23" - i : Minutes; "00" "59" - j : Jour du mois sans les zros initiaux: "1" "31" - l : Jour de la semaine, textuel, version longue; en anglais, i.e. "Friday" (pour Vendredi) - L : Boolen pour savoir si l'anne est bissextile ("1") ou pas ("0") - m : Mois; i.e. "01" "12" - n : Mois sans les zros initiaux; i.e. "1" "12" - M : Mois, en trois lettres (et en anglais) : par exemple "Jan" (pour Janvier) - s : Secondes; i.e. "00" "59" - S : Suffixe ordinal d'un nom
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 21:27

2002 - 2007 lephpfacile.com - Page 2/2

Les variables prdfinies

Voyons maintenant les variables d'environnements. En effet, PHP propose toute une srie de variables qui sont dj prsentes dans le langage sans que vous n'ayez les dclarer. Ces variables s'crivent toujours en majuscules et nous fournissent divers renseignements. Voici la liste des variables d'environnement existantes : Variable $_SERVER['DOCUMENT_ROOT'] $_SERVER['HTTP_ACCEPT_LANGUAGE'] $_SERVER['HTTP_HOST'] $_SERVER['HTTP_USER_AGENT'] $_SERVER['PATH_INFO'] $_SERVER['PATH_TRANSLATED'] $_SERVER['REQUEST_URI'] $_SERVER['REMOTE_ADDR'] $_SERVER['REMOTE_PORT'] $_SERVER['QUERY_STRING'] $_SERVER['SERVER_ADDR'] $_SERVER['SERVER_ADMIN'] $_SERVER['SERVER_NAME'] $_SERVER['SERVER_SIGNATURE'] $_SERVER['REQUEST_METHOD'] Description Racine du serveur Langage accept par le navigateur Nom de domaine du serveur Type de navigateur Chemin WEB du script Chemin complet du script Chemin du script Adresse IP du client Port de la requte HTTP Liste des paramtres passs au script Adresse IP du serveur Adresse de l'administrateur du serveur Nom local du serveur Type de serveur Mthode d'appel du script

Ces variables peuvent tre utilises n'importe quand dans vos scripts. Voici un exemple o vous pouvez afficher l'adresse IP de la personne qui se connecte sur votre site :

exemple1
<?php echo 'Votre adresse IP est : '.$_SERVER['REMOTE_ADDR']; ?>

Ce qui affichera l'cran : Votre adresse IP est : 80.12.45.26 (par exemple)


Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 21:34

2002 - 2007 lephpfacile.com - Page 1/1

Concatner deux chanes

Voyons maintenant la concatnation de chane de caractres. Dj, il faut bien savoir ce qu'est la concatnation de chane de caractres. Prenons un exemple simple avec deux chanes de caractres : - la premire chane de caractres sera : "J'apprend " - la seconde chane sera : "le PHP" En faisant une concatnation de ces deux chanes, nous obtiendrons la chane suivante : "J'apprend le PHP". Tachons maintenant de mettre alors en vidence l'importance de la concatnation de chane de caractres avec l'exemple de l'exercice prcdent. On avait alors comme code PHP :

exemple1
<?php $nom = "LA GLOBULE"; echo 'Bonjour '; echo $nom; echo ' !'; ?>

Or, les trois lignes avec l'instruction echo() peuvent se simplifier en une seule grce la concatnation. En PHP, la concatnation de chane s'effectue grce au point. On a alors :

exemple2
<?php $nom = "LA GLOBULE"; echo 'Bonjour '.$nom.' !'; ?>

Ce qui affichera l'cran : Bonjour LA GLOBULE !

Rsumons les choses : On affiche en fait la chane Bonjour concatne avec le contenu de la variable $nom, soit LA GLOBULE, galement concatne avec la chane !, ce qui au final, se rsume par l affichage de la chane Bonjour LA GLOBULE. La encore, il faut faire attention car si l'on avait crit echo 'Bonjour $nom !'; donc sans l'oprateur de concatnation qu'est le point, on aurait eu l'cran l'affichage suivant : Bonjour $nom !

(Car dans ce cas, PHP comprend que l'on dsire afficher la chane $nom et non le contenu de la variable $nom).
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 21:33

2002 - 2007 lephpfacile.com - Page 1/1

Les structures de contrles

Aprs avoir vu un premier aperu du langage PHP, nous allons maintenant tudier les diffrentes structures de contrles du langage. Les structures de contrles nous permettrons de faire des tests entre les variables et d'excuter diverses boucles. Voici un petit rcapitulatif des principales structures de contrles : Instruction if else elseif switch for while == != &lt; &gt; &lt;= &gt;= and ou &amp;&amp; or ou || Signification Si Sinon Sinon si Selon Pour chaque (boucle) Tant que (boucle) Strictement gal Diffrent Strictement infrieur Strictement suprieur Infrieur ou gal Suprieur ou gal ET logique OU logique

Nous allons maintenant illustrer toutes ces structures de contrles. - if, else, elesif : Nous allons initialiser une variable numrique $nombre la valeur 11 par exemple, et faire diffrent tests dessus.

exemple1
<?php $nombre = 11; if ($nombre >= 0 && $nombre < 10) { // on teste si la valeur de notre variable est comprise entre 0 et 9 echo $nombre.' est compris entre 0 et 9'; } elseif ($nombre >= 10 && $nombre < 20) { // on teste si la valeur de notre variable est comprise entre 10 et 19 echo $nombre.' est compris entre 10 et 19'; } else { // si les deux tests prcdents n'ont pas aboutis, alors on tombe dans ce cas echo $nombre.' est plus grand que 19'; } ?>

A l'affichage on aura : 11 est compris entre 10 et 19

(Remarquons dj que les instructions qui doivent tre excutes lorsqu'un test est valid sont systmatiquement comprises entre des crochets { }).

2002 - 2007 lephpfacile.com - Page 1/4

En effet, rsumons ce qui vient de se passer. Dans un premier temps, on teste si $nombre est suprieur ou gal 0 et strictement infrieur 10, et dans ce cas, et seulement dans ce cas, on crira alors sur l'cran, $nombre est compris entre 0 et 9. Or vu que $nombre est gal 11, on se rend compte que ce test ne sera pas satisfait. On a alors deux solutions. Soit on crit directement le cas Sinon (else), soit on peut faire un autres test, ce qui correspond un SinonSi (elseif). Nous avons choisis de faire un second test (elseif). La, on teste si $nombre est suprieur ou gal 10 et strictement infrieur 20 (ce qui est notre cas car $nombre est gal 11). Le test est donc valid, et l'on excute alors les instructions prsentes entre les crochets { } du elseif. On affichera donc l'cran : 11 est compris entre 10 et 19 Viens ensuite le cas else qui est excut seulement si aucunes des conditions dfinies par les if et les elseif n'est vrifies. - switch : Le switch reprsente exactement la mme chose qu'une succession d'un if et de plusieurs elseif. En revanche, utiliser un switch un certain avantage compar un if et plusieurs elesif, c'est que sa structure est beaucoup moins lourde et nettement plus agrable lire. Prenons un exemple simple. Nous allons dclarer une variable contenant une chane de caractres, puis nous allons tester cette chane grce au switch. On aura alors le code suivant :

exemple2
<?php $nom = "LA GLOBULE"; switch ($nom) { case 'Jean' : echo 'Votre nom est Jean.'; break; case 'Benot' : echo 'Votre nom est Benot.'; break; case 'LA GLOBULE' : echo 'Votre nom est LA GLOBULE.'; break; default : echo 'Je ne sais pas qui vous tes !!!'; } ?>

Dans notre cas, vu que $nom contient la chane de caractre LA GLOBULE, on verra alors s'afficher l'cran la phrase suivante : Votre nom est LA GLOBULE.

En revanche, si la variable $nom avait contenu la chane de caractre "toto", ce mme code aurait affich l'cran : Je ne sais pas qui vous tes !!!

En utilisant un if puis une succession de elseif, le code suivant aurait exactement eu le mme affichage sur l'cran :

exemple3
<?php $nom = "LA GLOBULE"; if ($nom == "Jean") {

2002 - 2007 lephpfacile.com - Page 2/4

echo 'Votre nom est Jean.'; } elseif ($nom == "Benot") { echo 'Votre nom est Benot.'; } elseif ($nom == "LA GLOBULE") { echo 'Votre nom est LA GLOBULE.'; } else { echo 'Je ne sais pas qui vous tes !!!'; } ?>

Attention ! Notez bien l'utilisation de break dans chaque cas de votre switch. Si celui-ci est omis, tous les messages s'afficheront. - for (pour chaque) : La structure de contrle for nous permet d'crire des boucles. En clair, cela veut dire que nous allons excuter une srie d'instructions un nombre de fois bien dtermin. Prenons l'exemple suivant :

exemple4
<?php $chiffre = 5; // Dbut de la boucle for ($i=0; $i < $chiffre; $i++) { echo 'Notre chiffre est diffrent de '.$i.'<br />'; } // Fin de la boucle echo 'Notre chiffre est gal '.$i; ?>

Ce qui affichera l'cran : Notre chiffre est diffrent de 0 Notre chiffre est diffrent de 1 Notre chiffre est diffrent de 2 Notre chiffre est diffrent de 3 Notre chiffre est diffrent de 4 Notre chiffre est gal 5

En effet, on initialise notre variable $chiffre 5. On dmarre la boucle for qui dit que l'on va excuter les instructions situes entre les crochets de la boucle ({ }) pour i variant de 0 $chiffre-1 (donc jusqu' 4), i tant incrmenter chaque passage de boucle ($i++). ($i varie de 0 $hiffre-1 car on impose que $i soit strictement infrieur $chiffre). On excute alors 4 fois les instructions prsentes dans la boucle, et chaque passage, $i verra sa valeur augmente de 1. Apart : L'utilisation des boucles est extrmement importante (et indispensable) en programmation. La comprhension de ce passage est capital. - while (tant que) Voyons maintenant l'autre boucle, la boucle while (dite boucle tant que). Il faut dj savoir que la boucle while n'est pas

2002 - 2007 lephpfacile.com - Page 3/4

vraiment d'une ncessit absolue (elle est absente dans certains langages de programmation) vu qu'elle est toujours remplaable par une boucle for. Reprenons l'exemple prcdent, et crivons le l'aide de la boucle while, on a :

exemple5
<?php $chiffre = 5; $i = 0; // Dbut de la boucle while ($i < $chiffre) { echo 'Notre chiffre est diffrent de '.$i.'<br />'; $i = $i + 1; } // Fin de la boucle echo 'Notre chiffre est gal '.$i; ?>

Ce qui affichera l'cran exactement la mme chose que ce qu'affiche le code que l'on a utilise pour la boucle for. Ici, on initialise notre variable $chiffre 5, puis la variable $i 0. Ensuite, nous faisons le test suivant : "tant que $i et augmenter la valeur de $i de 1" Puis ds que la condition $i < $chiffre n'est plus vrifie, nous sortons de la boucle pour finir l'excution des instructions qui suivent.
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 21:37

2002 - 2007 lephpfacile.com - Page 4/4

Lire et crire dans un fichier texte

Tentons maintenant de lire et d'crire dans un fichier texte, fichier se trouvant sur votre serveur FTP. Afin de mettre en pratique cet exercice, vous allez crer un fichier donnees.txt que vous allez placer dans le mme rpertoire que le script PHP. Supposons que ce fichier texte contienne la ligne suivante : "Salut tous :)".

Soit alors, le code PHP suivant :

exemple1
<?php // Instruction 1 $fp = fopen ("donnees.txt", "r"); // Instruction 2 $contenu_du_fichier = fgets ($fp, 255); // Instruction 3 fclose ($fp); // Instruction 4 echo 'Notre fichier contient : '.$contenu_du_fichier; ?>

Ce qui affichera l'cran : Notre fichier contient : Salut tous :)

Dtaillons alors ce qui se passe : - Instruction 1 : on ouvre le fichier donnees.txt en lecture seule l'aide de la fonction fopen() (la lecture seule est obtenue l'aide du paramtre r ; nous dtaillerons plus loin tous les paramtres possibles de cette fonction). - Instruction 2 : on lit le contenu du fichier l'aide de la fonction fgets() et l'on place le contenu de ce fichier dans la variable $contenu_du_fichier (le paramtre 255 pass la fonction fgets() correspond au nombre de caractres lire : ici, on a donn 255, ce qui correspond a un choix totalement arbitraire. En effet, vous pouvez mettre n'importe quel nombre. En revanche, si vous mettez 20 et que votre fichier comporte 128 caractres, seuls les 20 premiers seront lus). - Instruction 3 : on referme le fichier donnees.txt l'aide de la fonction fclose(). En effet, nous avons dj le contenu du fichier dans la variable $contenu_du_fichier, alors le fichier ne nous intresse plus. - Instruction 4 : on affiche donc le contenu du fichier donnees.txt (notez encore une fois l'utilit de la concatnation des chanes de caractres). Apart Vous n'tes absolument pas oblige de mettre ce fichier texte dans le mme rpertoire que le script PHP. En effet, si votre script PHP est la racine de votre site et que le fichier lire se trouve dans le rpertoire /toto, vous crirez alors votre script de la manire suivante :

exemple2
<?php $fp = fopen ("toto/donnees.txt", "r"); $contenu_du_fichier = fgets ($fp, 255); fclose ($fp); echo 'Notre fichier contient : '.$contenu_du_fichier; ?>

2002 - 2007 lephpfacile.com - Page 1/2

Ce qui produira un rsultat tout a fait identique. Etudions maintenant tous les paramtres possibles de la fonction fopen() : - r : ouvre en lecture seule, et place le pointeur de fichier au dbut du fichier. - r+ : ouvre en lecture et criture, et place le pointeur de fichier au dbut du fichier. - w : ouvre en criture seule; place le pointeur de fichier au dbut du fichier et rduit la taille du fichier 0. Si le fichier n'existe pas, on tente de le crer. - w+ : ouvre en lecture et criture; place le pointeur de fichier au dbut du fichier et rduit la taille du fichier 0. Si le fichier n'existe pas, on tente de le crer. - 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 crer. - 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 crer. Un exemple concret : un mini compteur du nombre de visites. Tachons maintenant de voir un exemple concret de lecture et d'criture dans un fichier texte. En effet, nous allons raliser un mini compteur de visites fait grce PHP et aux lecture/criture dans un fichier texte. Tout d'abord vous allez crer un fichier compteur.txt que vous allez placer dans le mme rpertoire que le script qui va suivre. Placez le chiffre "0" dans ce fichier. Soit alors le bout de code PHP suivant :

exemple3
<?php // Instruction 1 $fp = fopen ("compteur.txt", "r+"); // Instruction 2 $nb_visites = fgets ($fp, 11); // Instruction 3 $nb_visites = $nb_visites + 1; // Instruction 4 fseek ($fp, 0); // Instruction 5 fputs ($fp, $nb_visites); // Instrcution 6 fclose ($fp); // Instrcution 7 echo 'Ce site compte '.$nb_visites.' visiteurs !'; ?>

On a alors : - Instruction 1 : on ouvre le fichier compteur.txt en lecture et en ecriture. - Instruction 2 : on lit le contenu du fichier et on place ce contenu (qui est donc le nombre de visiteurs de notre page) dans la variable $nb_visites. - Instruction 3 : on augmente le nombre de visites de 1. - Instruction 4 : on place le pointeur du fichier l'offset 0 grce l'instruction fseek(). En clair, on se positionne au tout dbut de notre fichier. - Instruction 5 : grce l'instruction fputs(), on crit dans notre fichier la nouvelle valeur correspondant au nombre de visites. - Instruction 6 : on ferme le fichier. - Instruction 7 : on affiche le nombre de visites de notre page !!!
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 21:39

2002 - 2007 lephpfacile.com - Page 2/2

Rcuprer les donnes des formulaires

Voyons maintenant comment crer des formulaires, et surtout comment bien les utiliser. Les formulaires vont permettre vos visiteurs de soumettre des informations, que ce soit un nom, un prnom, un chiffre, etc... Prenons le code suivant :

exemple1
<html> <head> <title>Ma page de test</title> </head> <body> <form action = "traitement.php" method="post"> Votre nom : <input type = "text" name = "nom"><br /> Votre fonction : <input type = "text" name = "fonction"><br /> <input type = "submit" value = "Envoyer"> </form> </body> </html>

Puis, lorsque l'utilisateur cliquera sur le bouton "Envoyer", les donnes du formulaire seront envoyes sur la page traitement.php. Et dans la page traitement.php, nous allons rcuprer une variable de type tableau ($_POST : car notre formulaire a comme method la valeur post). En clair, dans la page traitement.php, on aura une variable $_POST['nom'] qui contiendra la chane de caractres qu'aura saisi le visiteur dans le champ "Votre nom : " (on a la variable $_POST['nom'], car dans l'attribut name de notre formulaire pour le champ concernant le nom). De mme, on aura une variable $_POST['fonction'] qui contiendra la chane de caractres qu'aura saisi le visiteur dans la champ "Votre fonction : " (encore une fois, on a la variable $_POST['fonction'] car l'attribut name du champ prend la valeur fonction). Prenons ensuite le code suivant pour la page traitement.php :

exemple2
<html> <head> <title>Ma page de traitement</title> </head> <body> <? // on teste la dclaration de nos variables if (isset($_POST['nom']) && isset($_POST['fonction'])) { // on affiche nos rsultats echo 'Votre nom est '.$_POST['nom'].' et votre fonction est '.$_POST['fonction']; } ?> </body> </html>

En supposant que l'on crive "LA GLOBULE" dans le champ "Votre nom" et "Webmaster" dans le champ "Votre fonction", on verra alors s'afficher l'cran : Votre nom est LA GLOBULE et votre fonction est Webmaster

PS : dans le cas o le formulaire utilise une mthode get, nous utilisons la variable tableau $_GET.

2002 - 2007 lephpfacile.com - Page 1/2

Voyons maintenant le cas des formulaires munis d'un champ de type file (formulaire permettant le tlchargement de fichiers sur votre site). Imaginons que l'on ai le formulaire suivant :

exemple3
<html> <head> <title>Ma page de test</title> </head> <body> <form action = "traitement.php" method="post" enctype="multipart/form-data"> Votre fichier : <input type = "file" name = "mon_fichier"><br /> <input type = "hidden" name="MAX_FILE_SIZE" value="20000"> <input type = "submit" value = "Envoyer"> </form> </body> </html>

Pour rcuprer votre fichier, vous avez votre disposition le tableau $_FILES qui aura plusieurs entres : - $_FILES['mon_fichier']['tmp_name'] : le nom temporaire du fichier sur le serveur - $_FILES['mon_fichier']['name'] : le nom original du fichier sur la machine cliente - $_FILES['mon_fichier']['type'] : le type MIME du fichier - $_FILES['mon_fichier']['size'] : la taille du fichier Naturellement, vous pourrez utiliser ces valeurs pour tester votre fichier. Si il correspond vos attentes, vous pourrez finaliser votre tlchargement l'aides des fonctions copy ou move_uploaded_file (afin de copier le fichier tlcharg sur le disque dur du serveur).
Auteur : LA GLOBULE Dernire rvision du cours : 2007-06-18 15:11:57

2002 - 2007 lephpfacile.com - Page 2/2

Les fonctions utilisateurs

Vous savez tous que PHP comprend, de base, une liste assez impressionnante de fonctions mises votre disposition. En revanche, vous aussi, vous pouvez trs bien crire vos propres fonctions. Nous allons donc crire une fonction qui va nous permettre d'crire un texte en gras, tout en spcifiant la couleur de ce texte, ainsi que sa taille. On a alors le code suivant :

exemple1
<?php function affichage_texte ($taille, $couleur, $texte) { echo '<font size = "'.$taille.'" color = "'.$couleur.'">'.$texte.'</font>'; } ?>

Placons ce code dans un fichier nomm fonctions.php. Attention !!! Placer juste et SEULEMENT ce bout de code dans le fichier fonctions.php. Soit ensuite le code du fichier index.php :

exemple2
<?php // on inclut le code de fonctions.php, donc le code de notre fonction include ('fonctions.php'); // on affiche un texte affichage_texte ("2", "red", "Mon texte"); ?>

Ce qui affichera l'cran :

Mon texte

Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 22:43

2002 - 2007 lephpfacile.com - Page 1/1

Introduction aux bases de donnes

Nous allons maintenant faire une petite introduction sur les bases de donnes. En effet, les bases de donnes prennent aujourd'hui une proportion tellement importante dans les sites WEB que vous devriez srement en utiliser un jour pour un site dvelopp en PHP. Pour l'information, sachez que ce site WEB utilise pratiquement que les donnes d'une base de donnes (tous les tutoriaux, les astuces, etc... sont contenus dans une base de donnes). De plus, en utilisant les bases de donnes, vous allez vraiment dcouvrir toutes les possibilits d'un environnement PHP / MySQL. Cette introduction pourra vous paratre vraiment longue et inutile, nanmoins, je vous recommande chaudement de la lire attentivement dans son intgralit. Elle comporte normment de notions capitales comprendre. Prenons un exemple simple et concret : supposons que l'on dsire dvelopper une base de donnes contenant une liste de CD audio. Cette liste de CD sera en fait compose de tous les CD que possde chaque personne d'un groupe d'amis. Et ceci, afin de pouvoir se prter mutuellement les diffrents CD, et de savoir exactement qui quoi comme CD. On suppose que le groupe d'amis est compos de 3 personnes : - LA GLOBULE - Jeremy - Benot Chaque personne a un numro de tlphone, et chaque personne possde un certain nombre de CD. On prendra aussi en considration le titre de l'album et le nom de l'interprte. On aurait alors trs bien pu obtenir (sous forme d'un tableau) la base de donnes suivante : Propritaire LA GLOBULE LA GLOBULE Jeremy Jeremy Benot N. tl 06-48-85-20-54 06-48-85-20-54 06-48-74-26-01 06-48-74-26-01 06-47-01-59-36 Auteur Cassius Daft Punk Cassius Tlpopmusik Clamaran Titre Au rve Discovery Au rve Genetic world Release yourself

Notez bien que ce tableau, en terme de base de donnes, se nomme une table et que chaque ligne du tableau se nomme un tuple. La premire ligne du tableau comporte les attributs de la table (Propritaire, N. tl, Auteur et Titre sont les attributs de notre table). Note : une base de donnes peut contenir plusieurs tables. Faisons maintenant quelques interrogations sur cette base de donnes : Qui possde un album de Cassius ? >> rponse : LA GLOBULE et Jeremy Quel est le numro de tlphone de Benot ? >> rponse : 06-47-01-59-36 Quels sont les albums des Daft Punk disponibles dans la liste de CD ? >> rponse : Discovery (il n'y en a qu'un seul) A premire vue donc, le principe des bases de donnes est trs facilement assimilable. Il faut galement savoir que dans la table d'une base de donnes, on ne peut pas avoir 2 tuples (donc 2 lignes du

2002 - 2007 lephpfacile.com - Page 1/3

tableau) ayant les mmes lments (en effet, il serait quand mme bte qu'une personne ai un CD en double). Imaginons maintenant que Jeremy vienne de se faire pick-pocketter son tout nouveau portable (un beau 8310) dans le mtro, et qu'il change alors naturellement de numro. Supposons que son nouveau numro est 06-85-98-78-12 et qu'en plus il vienne de s'acheter un nouveau CD : Paradise de Bob Sinclar. On insre alors une nouvelle ligne dans notre table (un nouveau tuple), et l'on obtient donc : Propritaire LA GLOBULE LA GLOBULE Jeremy Jeremy Benot Jeremy N. tl 06-48-85-20-54 06-48-85-20-54 06-48-74-26-01 06-48-74-26-01 06-47-01-59-36 06-85-98-78-12 Auteur Cassius Daft Punk Cassius Tlpopmusik Clamaran Bob Sinclar Titre Au rve Discovery Au rve Genetic world Release yourself Paradise

Imaginons maintenant que j'interroge nouveau ma base de donnes. Quel est le numro de tlphone de Jeremy ? >> rponse : 06-85-98-78-12 ou bien 06-48-74-26-01 Nous remarquons tout de suite qu'un problme majeur arrive : c'est dire que Jeremy possde deux numros de tlphone alors qu'il ne devrait (en thorie) n'en possder qu'un seul. Pour remdier a ce problme, il faudrait, par exemple modifier tous les premiers tuples et ainsi mettre jour le numro de tlphone de Jeremy. Dans notre cas, cette solution n'est pas vraiment gnante, en revanche, lorsque la table comporte quelques centaines voir milliers de tuples, c'est dj beaucoup plus gnant. En fait, ce problme survient gnralement cause d'une mauvaise conception de la base de donnes. En effet, au lieu de crer une seule table contenant toutes les informations, nous aurions du crer deux tables : - une contenant la liste des CD (Auteur et Titre) - une contenant les informations des propritaires des CD (Propritaire et N. de tel) Ensuite, il nous resterait a faire un lien entre les tables, nous permettant de savoir qui possde tel ou tel CD. Mettons cette solution en pratique. On a alors notre table contenant la liste des propritaires qui aura les attributs suivants : - numro du propritaire - nom du propritaire - numro de tlphone du propritaire Et la table contenant la liste de CD, aura les attributs suivants : - numro du propritaire du CD - Auteur du CD - Titre du CD (Et c'est grce au numro du propritaire que l'on fera la liaison entre les deux tables, l'opration se nommant une jointure) On aura alors : N. du propritaire 1 2 3 Propritaire LA GLOBULE Jeremy Benot N. tl 06-48-85-20-54 06-85-98-78-12 06-47-01-59-36

2002 - 2007 lephpfacile.com - Page 2/3

N. du propritaire 1 1 2 2 3 2

Auteur Cassius Daft Punk Cassius Tlpopmusik Clamaran Bob Sinclar

Titre Au rve Discovery Au rve Genetic world Release yourself Paradise

En ici, on remarque facilement que si une personne change de numro de tlphone, et bien nous avons qu'une seule modification effectuer (vu que chaque numro de tlphone n'apparat qu'une fois dans toute la base). Puis dans ce cas, nous remarquons galement que c'est le N. de propritaire qui effectue la liaison entre les deux tables (c'est dire la jointure). En conclusion : Faites extrmement attention au moment o vous crer les tables de votre base de donnes afin de ne pas se retrouver dans une situation o tout retour en arrire serait impossible : visualiser bien votre ide, crivez sur papier ce dont vous avez rellement besoin pour votre base de donnes, et tentez au maximum d'viter d'avoir des redondances dans vos tables.
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 22:45

2002 - 2007 lephpfacile.com - Page 3/3

Cration des tables en SQL

telephone VARCHAR(14) NOT NULL, PRIMARY KEY (numero) ) TYPE=MyISAM;

Le SQL (Structured Query Langage) est un langage de requtes qui nous permet de faire des interrogations (les requtes) sur un SGBD (Systme de Gestion de Base de Donnes). Nous venons de faire une petite introduction sur les bases de donnes, et maintenant, nous allons voir en dtail comment utiliser le SQL pour developper cette base de donnes. Tout le code donn dans ce tutorial ne peut tre interprt que par votre SGBD. Ce code ne pourra pas tre inclus dans vos pages PHP. En effet, vous devrez utiliser ce code dans votre PHPMyAdmin par exemple. Reprenons l'exemple prcdent, et on observe comment faire pour crer nos deux tables. Crons tout d'abord la table liste_proprietaire : CREATE TABLE liste_proprietaire ( numero INT(5) NOT NULL, nom VARCHAR(20) NOT NULL, telephone VARCHAR(14) NOT NULL ) TYPE=MyISAM;

Remarquons alors la ligne PRIMARY KEY (numero) qui nous indique que la cl primaire de notre table est l'attribut numero. Ceci veut dire que l'on est capable d'identifier n'importe quel tuple de la table rien qu' partir de l'attribut numero. Passons maintenant en revue l'intgralit des types possibles pour les attributs d'une table SQL. On a alors : - TINYINT : entier de 0 255 (non sign) - SMALLINT : entier de 0 65 535 (non sign) - MEDIUMINT : entier de 0 16 777 215 (non sign) - INT : entier de 0 4 294 967 295 (non sign) - BIGINT : entier de 0 18 446 744 073 709 551 615 (non sign) - DECIMAL : un nombre virgule flottante (soit un nombre rel) - DATE : une date allant du 1000-01-01 au 9999-12-31 - DATETIME : une date comportant une heure allant du 1000-01-01 00:00:00 au 9999-12-31 23:59:59 - TIMESTAMP : une date comportant une heure exprime en secondes depuis le 1er janvier 1970 jusqu' l'instant prsent - TIME : une mesure de l'heure qui va de -838:59:59 838:59:59 - YEAR : une anne qui va de 1901 2155 - CHAR : une chane de caractres de taille fixe (de 1 255 caractres) - VARCHAR : une chane de caractres de taille variable (de 1 255 caractres) - TINYTEXT ou TINYBLOB : un objet BLOB ou TEXT ayant une longueur maximale de 255 caractres - TEXT ou BLOB : un objet BLOB ou TEXT ayant une longueur maximale de 65 535 caractres - MEDIUMTEXT ou MEDIUMBLOB : un objet BLOB ou TEXT ayant une longueur maximale de 16 777 215 caractres - LONGTEXT ou LONGBLOB : un objet BLOB ou TEXT ayant une longueur maximale de 4 294 967 295 caractres Attention !!! Il est tout de fois possible de crer des tables directement partir d'une page en PHP. Dans ce cas, pour crer les tables, il n'est absolument pas ncessaire de passer par votre PHPMyAdmin, chose que je dconseille fortement pour les dbutants. En clair, au dbut, utiliser PHPMyAdmin pour crer vos tables, puis, une fois que vous aurez bien compris le principe, vous pourrez alors crer vos tables directement partir de vos scripts (ce qui est tout de mme dconseill).
Auteur : LA GLOBULE

Nous venons ici de crer notre table liste_proprietaire, table contenant trois attributs : - numero qui correspond un nombre entier (INT) de 5 chiffre - nom qui correspond une suite de caractres (VARCHAR) de 20 caractres - telephone qui correspond une suite de caractres (VARCHAR) de 14 caractres Nous utilisons VARCHAR pour des chanes de caractres pouvant mler du texte et des nombres. Toutefois, la fin de ce tutorial, nous allons passer en revue tous les types d'attributs possibles. De plus, pour chacun de ces attributs, nous imposons que pour chaque tuple donn, aucun attribut ne peut tre vide (on a mis un NOT NULL pour tous les attributs). Enfin, le type MyISAM prcise que nous avons affaire une base de donnes de type MySQL. Crons ensuite la table liste_disque : CREATE TABLE liste_disque ( numero INT(5) NOT NULL, auteur VARCHAR(50) NOT NULL, titre VARCHAR(50) NOT NULL ) TYPE=MyISAM;

Dernire rvision du cours : le 29/05/2007 23:05

Vu que les attributs ressemblent beaucoup la premire table, nous ne ferons aucun commentaire sur cette table. En revanche, nous aurions pu utiliser l'extra AUTO_INCREMENT pour les attributs numero de la table liste_proprietaire. En effet, si on imagine la page WEB nous permettant d'insrer des membres dans la liste des propritaires, on s'imagine mal qu'il faille prciser a chaque fois le numro du nouveau propritaire. Afin de palier ce lger dsagrment, nous allons applique un extra l'attribut de la premire table, nous permettant de faire en fait une incrmentation automatique chaque insertion d'un nouveau propritaire. On aura alors la table liste_proprietaire dfinit comme ceci : CREATE TABLE liste_proprietaire ( numero INT(5) NOT NULL AUTO_INCREMENT, nom VARCHAR(20) NOT NULL,

2002 - 2007 lephpfacile.com - Page 1/2

2002 - 2007 lephpfacile.com - Page 2/2

contre).

Fonctions PHP pour MySQL

Mon conseil : faites vous un fichier connect_base.php.inc ou apparatra seulement ce morceau de code, et dans chaque page ou vous souhaitez utiliser votre base de donnes, vous n'aurez alors qu' include() ce fichier de connexion.
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 22:48

Nous venons de voir comment crer nos tables SQL l'aide d'un PHPMyAdmin (par exemple). Avant de voir comment faire pour insrer, modifier, supprimer et afficher des tuples de notre base de donnes, il est bon de connatre les fonctions PHP permettant de manoeuvrer ces tuples. Ce tutorial est un peu comme une documentation, afin que les tutoriaux suivants ne ressortent pas vos yeux comme des choses provenant de Mars ou de Jupiter. Il faut dj savoir que les fonctions PHP pour MySQL commence toujours par mysql_ ce qui est plutt bien pens, non ? Voici donc la liste de ces fonctions (nous tudierons que les principales, regardez la documentation pour de plus amples connaissances) : Fonction mysql_close mysql_connect mysql_error mysql_fetch_array Signification Ferme la connexion une base de donnes Etablit une connexion vers la base de donnes spcifie dans les arguments Retourne la description textuelle d'une erreur gnre par une action sur une base de donnes Retourne un tableau qui reprsente tous les tuples slectionns (un indice du tableau correspond un attribut des tuples obtenus). Chaque appel rcupre le tuple suivant jusqu' ce qu'il n'y en ait plus Libre la mmoire associ la requte spcifie Retourne le nombre de tuple dans un rsultat Permet d'excuter une requte SQL sur une base de donnes Slectionne la base de donnes par dfaut

mysql_free_result mysql_num_rows mysql_query mysql_select_db

Voyons maintenant comment faire pour se connecter une base de donnes. En effet, afin de pouvoir utiliser tous les lments contenus dans une base de donnes, vous devez indiquer, sur toutes vos pages PHP o vous utilisez votre base, diffrents paramtres de connexion votre base. Etudions le code suivant :

exemple1
<?php $base = mysql_connect ('mon_serveur', 'login', 'password'); mysql_select_db ('ma_base_de_donnees', $base) ; ?>

La chane de caractres mon_serveur doit tre remplac par celle qui correspond au nom de votre serveur (en rgle gnrale, il s'agit de localhost ; si ce n'est pas le cas, veuillez contacter votre hbergeur pour de plus amples informations). login correspond votre login pour accder votre base. password, votre mot de passe. Et ma_base_de_donnees correspond au nom de votre base de donnes. Grce ce code nous allons donc pouvoir effectuer toutes nos requtes SQL sur les tables de notre base de donnes frachement cre. Attention !!! Ce code doit toujours tre prsent avant toute opration sur votre base de donnes (une seule fois par page suffit par

2002 - 2007 lephpfacile.com - Page 1/2

2002 - 2007 lephpfacile.com - Page 2/2

Afficher les donnes de votre base

On aura alors :

Maintenant que les tables de votre base de donnes sont cres, nous allons pouvoir voir comment faire pour pouvoir interroger cette base de donnes, et par consquent afficher les rsultats sur vos pages WEB :) Avant de plonger l'inconnu dans le code PHP pour faire ces interrogations, nous allons voir comment s'effectuent ces interrogations par le biais de requtes SQL. Et pour ce faire, nous allons nous baser sur l'exemple que nous avons suivi lors du tutorial sur l'introduction aux bases de donnes. Je vous rappelle que l'on avait alors deux tables qui peuvent tre reprsentes ainsi : La table liste_proprietaire :

SELECT liste_proprietaire.proprietaire FROM liste_proprietaire, liste_disque WHERE liste_disque.auteur = "Cassius" AND liste_disque.titre = "Au rve" AND liste_proprietaire.numero = liste_disque.numero ORDER BY liste_proprietaire.proprietaire ASC;

Etudions ce code : - on slectionne l'attribut proprietaire (ce que l'on veut obtenir) tout en indiquant que cet attribut faire partie de la table liste_proprietaire (ceci se fait grce au . qui relie le nom de l'attibut la table). En revanche, ici, il n'est pas vraiment ncessaire de prciser que l'on slectionne l'attribut proprietaire de la table liste_proprietaire puisque cet attribut de table n'apparat que dans une seule table (en l'occurrence la table liste_proprietaire). En effet, si l'attribut proprietaire avait existe dans plusieurs tables, nous aurions d prciser de quelle table il s'agit (le SGBD n'aurait pas su de quelle table l'attribut dont nous parlons fait partie). Toutefois, je vous recommande chaudement (sauf dans les cas extrmement simple, de toujours prciser au SGBD quelle table appartient l'attribut que vous slectionnez). - On utilise les tables liste_proprietaire et liste_disque pour faire notre requte. - On fait notre recherche sur la liste de disque en ne retenant que les disques dont l'auteur est Cassius. - Puis on retient les disques dont le titre est Au rve. - Ensuite (le plus important), on effectue une jointure entre les tables, en disant que l'attribut numero de la table liste_proprietaire correspond l'attribut numero de la table liste_disque. - Enfin, on impose au SGBD de nous fournir les rsultats dans l'ordre alphabtique des noms de propritaire (et ceci grce la clause ORDER BY). Notes : - Pour organiser les rsultats suivant l'ordre inverse de l'ordre alphabtique, on aurait pu mettre en dernire condition, la condition ORDER BY liste_proprietaire.proprietaire DESC. - La clause ORDER BY est galement valable dans le cas d'attribut numrique. Dans ce cas, le SGBD organise les rsultats suivant un ordre croissant (lorsque l'on met ASC la fin) ou dcroissant (lorsque l'on met DESC la fin). - Cette astuce fonctionne galement dans le cas o l'attribut est de type date. Remarque :

N. du propritaire 1 2 3

Propritaire LA GLOBULE Jeremy Benot

N. tl 06-48-85-20-54 06-85-98-78-12 06-47-01-59-36

La table liste_disque :

N. du propritaire 1 1 2 2 3 2

Auteur Cassius Daft Punk Cassius Tlpopmusik Clamaran Bob Sinclar

Titre Au rve Discovery Au rve Genetic world Release yourself Paradise

Nous allons alors interroger la table pour connatre par exemple le numro de tlphone de LA GLOBULE. On aura alors (en SQL je vous le rappelle, on verra plus tard comment obtenir le mme rsultat dans une page WEB) :

SELECT telephone FROM liste_proprietaire WHERE nom="LA GLOBULE";

Nous avons que dans nos requtes SQL nous pouvions imposer au SGBD de ne slectionner que les tuples dont on impose la valeur de certains attributs (comme par exemple en imposant que l'attribut auteur soit gal Cassius par le biais de la ligne WHERE liste_disque.auteur = "Cassius"). En revanche, nous pouvons galement faire une recherche en n'imposant pas rellement la valeur de l'attribut mais plutt en ne slectionnant que les tuples dont l'attribut commence par une certaine chane de caractres ou bien mme de ne slectionner que les tuples dont l'attribut ne fait que contient une chane de caractres. Tout ceci se fera grce la clause LIKE. Prenons l'exemple suivant :

Etudions ce code : - on slectionne l'attribut que l'on dsire obtenir (ici l'attribut telephone qui correspond effectivement au numro de tlphone des propritaires). - on utilise la table liste_proprietaire pour faire notre slection (en fait, on n'a besoin que de cette table pour faire notre slection, on verra plus tard que la clause FROM peut contenir plusieurs tables, notamment dans le cas des jointures). - on impose une condition, en effet, on veut le tlphone de qui ? De LA GLOBULE, donc en crivant WHERE nom="LA GLOBULE", on impose au SGBD de ne slectionner dans notre table que les tuples qui possdent l'attribut nom qui est gal LA GLOBULE. En revanche, en n'crivant pas cette ligne, on aurai obtenu tous les numros de tlphone de notre table (car dans ce cas, on n'aurait eu aucune condition quand au nom du propritaire). Etudions maintenant le cas ou l'on effectue une slection lorsque l'on doit effectuer une jointure entre deux tables. Interrogeons alors notre base de donnes pour connatre le nom des propritaires de l'album Au rve de Cassius.

SELECT liste_proprietaire.proprietaire FROM liste_proprietaire, liste_disque WHERE liste_disque.auteur LIKE "C%" AND liste_disque.titre = "Au rve" AND liste_proprietaire.numero = liste_disque.numero ORDER BY liste_proprietaire.proprietaire ASC;

Dans ce cas, nous n'avons plus la ligne WHERE liste_disque.auteur = "Cassius" mais la ligne WHERE liste_disque.auteur LIKE "c%". Ce changement implique que nous allons choisir non pas les disques dont l'auteur est Cassius mais les disques dont l'auteur commence par la lettre c.

2002 - 2007 lephpfacile.com - Page 1/5

2002 - 2007 lephpfacile.com - Page 2/5

On aurait galement pu faire :

Le numro de tlphone de LA GLOBULE est : 06-48-85-20-54

SELECT liste_proprietaire.proprietaire FROM liste_proprietaire, liste_disque WHERE liste_disque.auteur LIKE "%s%" AND liste_disque.titre = "Au rve" AND liste_proprietaire.numero = liste_disque.numero ORDER BY liste_proprietaire.proprietaire ASC;

Mettons maintenant dans le cas o l'interrogation de la base de donnes ne retourne pas un, mais un certain nombre de tuples (nombre que l'on ne connat pas). En effet, recherchons tous les noms de propritaires de disque, ainsi que leur numro de tlphone. On aura alors le code suivant :

exemple2
Et dans ce cas, nous aurions slectionn les tuples dont l'attribut auteur de la table liste_disque contient la lettre s. Remarque : La clause LIKE n'est pas limite une seule lettre. En effet, on peut trs bien faire un LIKE avec un mot complet. <?php // on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Nom et tl des membres</title> </head> <body> <?php // lancement de la requte (on impose aucune condition puisque l'on dsire obtenir la liste complte des propritaires $sql = 'SELECT telephone, nom FROM liste_proprietaire'; // on lance la requte (mysql_query) et on impose un message d'erreur si la requte ne se passe pas bien (or die) $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // on va scanner tous les tuples un par un while ($data = mysql_fetch_array($req)) { // on affiche les rsultats echo 'Nom : '.$data['nom'].'<br />'; echo 'Son tl : '.$data['telephone'].'<br /><br />'; } mysql_free_result ($req); mysql_close (); ?> </body> </html>

Maintenant que vous connaissez tout de la slection de tuples en langage SQL, nous allons voir comment intgrer ces requtes SQL vos pages PHP. Crons une page PHP nous permettant de raliser exactement la mme requte que la premire de ce tutorial, c'est--dire la slection du numro de tlphone de LA GLOBULE. On a alors le code suivant :

exemple1
<?php // on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Numro de tlphone de LA GLOBULE</title> </head> <body> <?php // lancement de la requete $sql = 'SELECT telephone FROM liste_proprietaire WHERE nom = "LA GLOBULE"'; // on lance la requte (mysql_query) et on impose un message d'erreur si la requte ne se passe pas bien (or die) $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // on recupere le resultat sous forme d'un tableau $data = mysql_fetch_array($req); // on libre l'espace mmoire allou pour cette interrogation de la base mysql_free_result ($req); mysql_close (); ?> Le numro de tlphone de LA GLOBULE est :<br /> <?php echo $data['telephone']; ?> </body> </html>

Et ainsi, grce la boucle while, nous pouvons parcourir tous les tuples obtenus par la requte SQL. Pour finir, nous pouvons juste dire que lorsque l'on effectue une slection qui contient une jointure, le principe reste exactement le mme. Que faire en plus ? Afin d'amliorer vos slections, vous pouvez faire dpendre vos slections du rsultat obtenu par un formulaire. En effet, imaginons une premire page avec un formulaire nous permettant de choisir le nom d'un propritaire via un menu droulant. Ensuite, dans la page o vous allez faire votre requte (qui donc tre galement la page contenue dans le champ action de votre formulaire), vous allez rcuprer une variable, par exemple $_POST['nom_proprio'] (cf. le tutorial sur la rcupration des donnes par le biais des formulaires). De plus, imaginons que l'on dsire retrouver le numro de tlphone de ce propritaire (celui choisi dans le menu-droulant). On aura alors (page pointe par le champ action du formulaire):

Ce qui affichera l'cran :

exemple3
<?php

2002 - 2007 lephpfacile.com - Page 3/5

2002 - 2007 lephpfacile.com - Page 4/5

// on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Numro de tlphone du membre choisi</title> </head> <body> <?php // on teste si notre variable est dclare if (isset($_POST['nom_proprio'])) { // lancement de la requte $sql = 'SELECT telephone FROM liste_proprietaire WHERE nom = "'.$_POST[ 'nom_proprio'].'"'; // on lance la requte (mysql_query) et on impose un message d'erreur si la requte ne se passe pas bien (or die) $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // on rcupre le rsultat sous forme d'un tableau $data = mysql_fetch_array($req); // on libre l'espace mmoire allou pour cette interrogation de la base mysql_free_result ($req); mysql_close (); // on affiche le rsultat echo 'Le numro de tlphone est : '.$data['telephone']; } else { echo 'La variable nom_proprio n\'est pas dclare'; } ?> </body> </html>

Ouf :) On a enfin fini ce tutorial primordial.


Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 23:05

2002 - 2007 lephpfacile.com - Page 5/5

Insrer des donnes dans votre base

Simple, non ? Passons tout de suite l'insertion d'un nouveau tuple, et ce, partir d'une page WEB. Supposons que l'on dsire insrer exactement le mme tuple que dans l'exemple prcdent (c'est--dire que tibo fait tellement partie de nos amis, qu'on a envie de partager nos disques avec lui). On aura alors :

Nous allons maintenant voir comment faire pour insrer des donnes dans les tables de votre base de donnes. Comme pour le tutorial prcdent, nous allons le faire en se basant sur l'exemple pris lors du tutorial faisant une introduction sur les bases de donnes. Et tout comme dans le tutorial prcdent, nous allons tout d'abord voir comment faire ces insertions en SQL, puis nous verrons comment les faire directement partir de vos pages WEB. Pour vous remettre les ides au clair, je vous que l'on avait alors deux tables, dont la structure ressemble : La table liste_proprietaire :

exemple1
<?php // on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Insertion de tibo dans la base</title> </head> <body> <?php // lancement de la requete $sql = 'INSERT INTO liste_proprietaire VALUES ("", "tibo", "06-98-42-01-36")'; // on insere le tuple (mysql_query) et au cas o, on crira un petit message d'erreur si la requte ne se passe pas bien (or die) mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error()); // on ferme la connexion la base mysql_close(); ?> Tibo vient d'tre inser dans la base. </body> </html>

N. du propritaire 1 2 3

Propritaire LA GLOBULE Jeremy Benot

N. tl 06-48-85-20-54 06-85-98-78-12 06-47-01-59-36

La table liste_disque :

N. du propritaire 1 1 2 2 3 2

Auteur Cassius Daft Punk Cassius Tlpopmusik Clamaran Bob Sinclar

Titre Au rve Discovery Au rve Genetic world Release yourself Paradise

Imaginons, alors que l'on dsire alors ajouter la base un disque grce la contribution de tibo. Supposons alors que l'on dcide d'ajouter un nouveau propritaire de disques : tibo par exemple. Pour insrer ce nouveau propritaire, il faut fournir au SGBD les informations lui permettant d'insrer ce nouveau tuple dans la table liste_proprietaire. Ces informations sont : - le numro du nouveau propritaire - le nom du nouveau propritaire - son numro de tlphone Bref, vous le voyez par vous-mme, il s'agit en fit de fournir tous les attributs de la table afin de produire un nouveau tuple. En revanche, comme nous allons le voir, il n'est pas ncessaire de fournir au SGBD le numro du nouveau propritaire car cet attribut t dclar AUTO_INCREMENT lors de la cration de la table. Ceci implique que le SGBD sait, lors d'une nouvelle insertion, qu'il faut qu'il prenne dans la table liste_proprietaire le numro le plus grand et qu'il l'augmente de un, et ce nouveau numro (augmente de un) correspondra au numro de notre nouveau propritaire. On aura alors : INSERT INTO liste_proprietaire VALUES ('','tibo','06-98-42-01-36'); Dans l'absolu, rflchissons une minute sur ce que nous avons besoin : - il s'agit d'un nouveau disque (soit son auteur et son titre). - mais aussi, nous avons besoin du numro qu'a pris le propritaire tibo dans la table liste_proprietaire. Comment qu'on fait donc ce truc ? En effet, on voit bien que si l'on insre directement un nouveau disque, la jointure entre les deux tables risque de ne pas se faire. En fait, il faudrait tout d'abord slectionner le numro qu'a pris tibo dans la table_proprietaire (par le biais d'un requete SQL de type SELECT, je vous renvoies au tutorial prcdent pour revoir la rcupration des donnes d'une base). Cependant, imaginons que nous n'avons pas encore insr le propritaire tibo dans notre base de donnes, et que l'on dsire directement insrer ce nouveau propritaire ainsi qu'un disque lui appartenant. Nous allons voir comment rcuprer simplement le nouveau numero qui vient d'tre insr (donc celui de tibo) et ainsi l'utiliser pour insrer notre disque. On a :

exemple2
<?php // on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Insertion de tibo et d'un nouveau disque dans la base</title>

On remarque tout de suite que la syntaxe pour une insertion est relativement simple. En effet, tudions ce code : On insre o ? --> dans la table liste_proprietaire On insrer quoi ? --> la valeur des diffrents attributs, c'est--dire une premire valeur qui correspond l'attribut numero (qui je vous le rappelle est AUTO_INCREMENT, on n'a donc pas l'utilit de prciser sa valeur, le SGBD sachant quoi mettre), puis on insre la valeur tibo pour l'attribut nom, et enfin la valeur 06-98-42-01-36 pour l'attribut telephone.

2002 - 2007 lephpfacile.com - Page 1/4

2002 - 2007 lephpfacile.com - Page 2/4

</head> <body> <?php // on prpare la requte $sql = 'INSERT INTO liste_proprietaire VALUES("", "tibo", "06-98-42-01-36")'; // on insre le tuple (mysql_query) et au cas o, on crira un petit message d'erreur si la requte ne se passe pas bien (or die) mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error()); // on rcupre le dernier numro insr, soit le numro de tibo $numero_insere = mysql_insert_id(); // on insre le tuple (mysql_query) et au cas o, on crira un petit message d'erreur si la requte ne se passe pas bien (or die) $sql = 'INSERT INTO liste_disque VALUES ("'.$numero_insere.'", "The supermen lovers", "The player")'; // on insre le tuple (mysql_query) et au cas o, on crira un petit message d'erreur si la requte ne se passe pas bien (or die) mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error()); // on ferme la connexion la base mysql_close(); ?> Tibo vient d'tre inser dans la base, ainsi que son nouveau disque : The player des Supermen lovers. </body> </html>

; // on lance la requte (mysql_query) et on impose un message d'erreur si la requte ne se passe pas bien (or die) $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // on rcupre le rsultat sous forme d'un tableau $data = mysql_fetch_array($req); // on libre l'espace mmoire allou pour cette interrogation de la base mysql_free_result ($req); // on insre le tuple (mysql_query) et au cas o, on crira un petit message d'erreur si la requte ne se passe pas bien (or die) $sql = 'INSERT INTO liste_disque VALUES("'.$data['numero'].'", "'.$_POST[ 'interprete'].'", "'.$_POST['titre'].'")'; // on insre le tuple (mysql_query) et au cas o, on crira un petit message d'erreur si la requte ne se passe pas bien (or die) mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error()); // on ferme la connexion la base mysql_close(); echo 'Nous venons d\'insrer un nouveau disque : '.$_POST['titre'].' de '.$_POST[ 'interprete'].' appartenant '.$_POST['proprio']; } else { echo 'Les variables du formulaire ne sont pas dclares'; } ?> </body> </html>

Que faire en plus ? Et bien, tout comme dans le tutorial prcdent, vous pouvez rendre vos insertions vraiment dynamiques en effectuant tout simplement vos insertions partir des valeurs fournies par un formulaire.

Et voila :) Imaginons que l'on dsire insrer des nouveaux disques. Supposons que l'on dispose d'une page html contenant un formulaire permettant de saisir le nom du propritaire, et que ce formulaire vous demande galement le titre d'un album ainsi que son interprte (on suppose galement que le champ action de notre formulaire correspond au nom de la page PHP qui traite les donnes, soit la page contenant le code ci-dessous). On suppose enfin, que le champ du formulaire contenant le nom du propritaire porte le nom proprio (on pourra alors utiliser la variable $_POST['proprio'] dans notre page PHP, tout en supposant de notre formulaire une mthode POST et npn GET), que le champ contenant l'interprte porte le nom interprete et que le champ contenant le titre porte le nom titre. On aura alors :
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 23:05

exemple3
<?php // on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Insertion de nouveaux disques dans la base</title> </head> <body> <?php // on teste si les variables du formulaire sont bien dclares if (isset($_POST['proprio']) && isset($_POST['interprete']) && isset($_POST['titre'])) { // on prpare la requte pour rcuprer le numero du propritaire $sql = 'SELECT numero FROM liste_proprietaire WHERE nom = "'.$_POST['proprio'].'"'

2002 - 2007 lephpfacile.com - Page 3/4

2002 - 2007 lephpfacile.com - Page 4/4

Modifier des donnes de votre base

Cependant, imaginons que nous dsirons modifier plusieurs attributs d'un mme tuple. En effet, supposons alors que nous possdons dans notre base de donnes une table ressemblant la table liste_proprietaire (que nous avons dj tudi), mais qui comportera plus d'attributs, comme par exemple l'adresse du propritaire ainsi que son age. On pourrait alors trs bien avoir une table ressemblant ceci :

Aprs avoir vu comment on affiche les donnes d'une base de donnes et comment on les insre, voyons maintenant comment modifier ces donnes. Reprenons les deux tables que nous tudions depuis le dbut des tutoriaux sur les bases de donnes. Je vous rappelle que l'on avait alors : La table liste_proprietaire :

N. 1 2 3 4

Nom LA GLOBULE Jeremy Benot Tibo

N. tl 06-48-85-20-54 06-85-98-78-12 06-55-99-10-00 06-98-42-01-36

Adresse 2, rue des lilas 4, rue des fauvettes 2, rue des tulipes 8, rue du facteur

Age 23 22 66 23

N. du propritaire 1 2 3 4

Propritaire LA GLOBULE Jeremy Benot Tibo

N. tl 06-48-85-20-54 06-85-98-78-12 06-47-01-59-36 06-98-42-01-36

Supposons alors que l'on se soit tromp dans l'age de Benot et qu'au lieu d'avoir 66 ans (il n'est pas si vieux que a notre Benot !), et bien, il a tout simplement 65 ans :) Supposons galement que l'adresse de Benot soit errone et qu'il n'habite pas 2 rue des tulipes, mais 3 rue des tulipes. On aura alors :

La table liste_disque :

UPDATE liste_proprietaire SET adresse="3, rue des tulipes", age="65" WHERE nom="Benot"; Auteur Cassius Daft Punk Cassius Tlpopmusik Clamaran Bob Sinclar The supermen lovers Titre Au rve Discovery Au rve Genetic world Release yourself Paradise The player

N. du propritaire 1 1 2 2 3 2 4

On remarque alors qu'il suffit de sparer les diverses modifications opres sur un mme tuple par une simple virgule. Voyons maintenant comment effectuer ces modifications dans une page PHP. Pour ce faire, prenons notre deuxime modification, celle concernant l'adresse et l'age de Benot. On aura alors :

exemple1
<?php // on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Modification du tl et de l'adresse de Benot</title> </head> <body> <?php // lancement de la requte $sql ='UPDATE liste_proprietaire SET adresse="3, rue des tulipes", age="65" WHERE nom="Benot"'; // on excute la requte (mysql_query) et on affiche un message au cas o la requte ne se passait pas bien (or die) mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); // on ferme la connexion la base mysql_close(); ?> L'adresse et l'age de Benot viennent d'tre modifis. </body> </html>

Voyons, en SQL tout d'abord comment modifi un tuple de la table liste_proprietaire. Supposons que Benot vienne de changer son numro de portable (et que son nouveau numro est : 06-55-99-10-00), il faudra alors faire la modification dans la base de donnes afin que soit ancien numro soit remplac par le nouveau. On aura alors : UPDATE liste_proprietaire SET telephone="06-55-99-10-00" WHERE nom="Benot";

En effet, on modifie quelle table ? On modifie liste_proprietaire. Quel attribut modifie-t-on ? On modifie l'attribut telephone (qui prendra la valeur 06-55-99-10-00). Et on fait les modifications pour quel(s) tuple(s) ? On modifie le(s) tuple(s) o l'attribut nom prend la valeur Benot (dans notre cas, seul un tuple sera modifi car notre table comporte qu'un seul tuple o l'attribut nom prend la valeur Benot). Simple non ? En revanche, notez bien que dans notre clause WHERE, nous n'avons mis qu'une seule condition. Bien videmment, tout est possible, vous pouvez en mettre plusieurs (ainsi que des clauses utilisant le LIKE vu dans les tutoriaux prcdents). Tout dpend des tuples que vous voulez modifier.

Attention !!!

2002 - 2007 lephpfacile.com - Page 1/4

2002 - 2007 lephpfacile.com - Page 2/4

En effet, les modifications peuvent tre vraiment dangereuses pour votre base de donnes. En effet, si vous ne prenez pas un minimum de prcaution pour effectuer vos modifications, vous pouvez trs bien modifier un tuple d'une table et perde en mme temps la jointure avec une autre table. En effet, nous savons que nos tables liste_disque et liste_proprietaire sont lies par l'intermdiaire du numro de propritaire (la jointure). Ceci implique donc que si pour une raison ou pour une autre, nous sommes amen modifier ce numro (dans la table liste_proprietaire par exemple), il faudra galement penser faire la modification de ce mme numro dans l'autre table (liste_disque) afin que la jointure entre les deux tables soit toujours fonctionnelle. Que faire en plus ? Et bien comme dans les tutoriaux prcdents, vous pouvez effectuer des modifications de tuples par le biais de formulaires. Par exemple, supposons que l'on dispose d'un page WEB comportant un formulaire disposant des champs suivants : - un menu droulant (de NAME proprio) permettant de choisir le nom d'un propritaire. - un champs texte classique (de NAME nouvelle_adresse) permettant l'utilisateur de saisir une nouvelle adresse pour le propritaire slectionne dans le menu droulant Supposons ensuite que ce formulaire a pour balise ACTION la page traitement.php qui nous permet de modifier l'adresse du propritaire en question. On aura alors le code suivant (pour la page traitment.php) :

Et maintenant, vous tes vraiment pars pour faire vos modifications de tuples :)
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 23:06

exemple2
<?php // on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Modification de l'adresse d'un propritaire</title> </head> <body> <?php // on teste si les variables du formulaire sont dclares if (isset($_POST['nouvelle_adresse']) && isset($_POST['proprio'])) { // lancement de la requte $sql = 'UPDATE liste_proprietaire SET adresse="'.$_POST['nouvelle_adresse'].'" WHERE nom="'.$_POST['proprio'].'"'; // on excute la requte (mysql_query) et on affiche un message au cas o la requte ne se passait pas bien (or die) mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); // on ferme la connexion la base mysql_close(); // un petit message permettant de se rendre compte de la modification effectue echo 'La nouvelle adresse de '.$_POST['proprio'].' est : '.$_POST[ 'nouvelle_adresse']; } else { echo 'Les variables du formulaire ne sont pas dclares'; } ?> </body> </html>

2002 - 2007 lephpfacile.com - Page 3/4

2002 - 2007 lephpfacile.com - Page 4/4

tables sont jointes par le biais d'un attribut).

Supprimer des donnes de votre base

Aprs avoir vu l'affichage des donnes provenant d'une base de donnes, l'insertion et la modification de ces mmes donnes, voyons maintenant la dernire opration fondamentale concernant ces base de donnes : la suppression de tuples. Reprenons alors nos deux tables liste_proprietaire et liste_disque que nous avons utilise pendant tous les tutoriaux concernant les bases de donnes. Je vous rappelle que l'on avait alors : La table liste_proprietaire : N. du propritaire 1 2 3 4 Propritaire LA GLOBULE Jeremy Benot Tibo N. tl 06-48-85-20-54 06-85-98-78-12 06-55-99-10-00 06-98-42-01-36

En effet, dans notre exemple, nous venons de supprimer de la table liste_proprietaire le tuple dont l'attribut nom valait Tibo. Cependant, on remarque que la table liste_disque comporte des lments qui taient lis Tibo. Or, vu que ces elements ne nous servent plus rien maintenant (car on a supprimer Tibo de la liste), il faut galement penser les supprimer (afin d'avoir une base de donnes homogne). Voyons maintenant comment effectuer ces suppressions par le biais d'une page WEB crite en PHP. Prenons par exemple le cas d'une page PHP permettant la suppression de Tibo de la base de donnes ainsi que de toutes les informations le concernant (c'est--dire les disques lui appartenant). On aura alors :

exemple1
<?php // on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Suppression de Tibo de la base</title> </head> <body> <?php // lancement de la requte pour effacer Tibo $sql ='DELETE from liste_proprietaire WHERE nom="Tibo"'; // on excute la requte (mysql_query) et on affiche un message au cas o la requte ne se passait pas bien (or die) mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); // lancement de la requte pour effacer les disques de Tibo (je vous rappelle que Tibo le numro 4) $sql ='DELETE from liste_disque WHERE numero="4"'; // on excute la requte (mysql_query) et on affiche un message au cas o la requte ne se passait pas bien (or die) mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); // on ferme la connexion la base mysql_close(); ?> Tibo et tous ces disques ont ts supprims de la base de donnes. </body> </html>

La table liste_disque :

N. du propritaire 1 1 2 2 3 2 4

Auteur Cassius Daft Punk Cassius Tlpopmusik Clamaran Bob Sinclar The supermen lovers

Titre Au rve Discovery Au rve Genetic world Release yourself Paradise The player

Voyons alors, en SQL, comment supprimer un tuple de la table liste_proprietaire. Supposons que l'on dsire supprimer Tibo de notre base de donnes. On crira alors : DELETE from liste_proprietaire WHERE nom="Tibo";

En effet, on efface un tuple (ou plusieurs, tout dpend de la clause WHERE) de quelle table ? De la table liste_proprietaire. Quel(s) tuple(s) efface-t-on ? On efface tous les tuples de la table liste_proprietaire ou l'attribut nom prend la valeur Tibo (dans notre cas, un seul tuple porte la valeur Tibo pour l'attribut nom). Notez bien que la clause WHERE peut trs bien contenir plusieurs conditions, elles seront alors spars par des oprateurs boolens (AND correspondant un ET logique ou OR correspondant un OU logique). Cependant, je vous rappelle que des requtes SQL peuvent tre beaucoup plus complexes, et dans ce cas, je vous renvoie la documentation MySQL, ce qui notre niveau (dbutant) n'est pas vraiment intressant (cela ne sert rien de vous embrouiller les ides ds le dpart). Attention !!! Lorsque l'on effectue une suppression de tuples, il faut toujours faire attention effacer non seulement les tuples de la table dont on veut supprimer le(s) lment(s) mais ventuellement les autres tuples d'une autre table (si les deux

Que faire en plus ? Comme dans les tutoriaux prcdents, afin de rendre vos pages beaucoup plus dynamiques, il serait intressant de faire une page WEB contenant un formulaire possdant un menu droulant permettant de choisir le nom du membre effacer. On suppose alors que ce menu droulant le champ NAME qui prend la valeur proprio, et que le formulaire a son champ ACTION qui prend la valeur traitement.php. Ceci implique que dans la page traitement.php, on aura une variable $proprio qui contient le nom du propritaire supprimer. On aura alors le code suivant (pour la page traitement.php place dans le mme rpertoire que la page WEB contenant le formulaire) :

exemple2
<?php

2002 - 2007 lephpfacile.com - Page 1/3

2002 - 2007 lephpfacile.com - Page 2/3

// on se connecte notre base $base = mysql_connect ('serveur', 'login', 'pass'); mysql_select_db ('ma_base', $base) ; ?> <html> <head> <title>Suppression d'un membre de la base</title> </head> <body> <?php // on teste si la variable du formulaire est bien dclare if (isset($_POST['proprio'])) { // on recherche le numero du membre supprimer $sql = 'SELECT numero FROM liste_proprietaire WHERE nom = "'.$_POST[proprio].'"'; // on lance la requte (mysql_query) et on impose un message d'erreur si la requte ne se passe pas bien (or die) $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // on recupere le resultat sous forme d'un tableau $data = mysql_fetch_array($req); // on recupere la valeur qui nous intersse $numero_du_proprio = $data['numero']; // on libre l'espace mmoire allou pour cette interrogation de la base mysql_free_result ($req); // lancement de la requte pour effacer notre membre $sql ='DELETE from liste_proprietaire WHERE nom="'.$_POST['proprio'].'"'; // on excute la requte (mysql_query) et on affiche un message au cas o la requte ne se passait pas bien (or die) mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); // lancement de la requte pour effacer les disques de notre membre $sql ='DELETE from liste_disque WHERE numero="'.$numero_proprio.'"'; // on excute la requte (mysql_query) et on affiche un message au cas o la requte ne se passait pas bien (or die) mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); // on ferme la connexion la base mysql_close(); // un petit message afin de voir ce qui s'est pass echo 'Nous venons de supprimer '.$_POST['proprio'].' de la base ainsi que tous ces disques'; } else { echo 'La variable de notre formulaire n\'est pas initialise.'; } ?> </body> </html>

Et voila, maintenant, vous devez matriser tout ce qui concerne les bases de donnes et les pages dynamiques en PHP.
Auteur : LA GLOBULE Dernire rvision du cours : le 29/05/2007 23:07

2002 - 2007 lephpfacile.com - Page 3/3

Les cookies

echo 'Bonjour '.$_COOKIE['pseudo'].' !'; } else { echo 'Notre cookie n\'est pas d?ar?; // si le cookie n'existe pas, on affiche un formulaire permettant au visiteur de saisir son nom echo '<form action="./traitement.php" method="post">'; echo 'Votre nom : <input type = "texte" name = "nom"><br />'; echo '<input type = "submit" value = "Envoyer">'; } ?> </body> </html>

Dans ce tutorial, nous allons voir comment cr? des cookies, et surtout comment bien les manipuler. Tout de suite, mettons les choses au clair. En effet, beaucoup de personnes d'imaginent que les cookies sont des petites b?s malveillantes (alors que c'est totalement faux), tout simplement parce qu'elles ne savent pas exactement de quoi il s'agit. Un cookie est un petit fichier texte (faisant au maximum 65 Ko) stock?ur le disque dur du visiteur du site. Ce fichier texte permet de sauvegarder diverses informations concernant ce visiteur afin de pouvoir les r?iliser (les informations) lors de la prochaine visite du visiteur sur ce m? site. Par exemple, on pourrait tr?bien stocker dans ce cookie le nom du visiteur et par la suite, afficher son nom ?haque fois qu'il se connectera sur le site (ceci bien sur, s'il n'efface pas les cookies de son disque dur). Cependant, tout cela n'arrive pas par le saint esprit. En effet, ceci n'est possible que si le visiteur ?ntr?ui-m? ses informations dans un formulaire sur le site. Les cookies sont stock? selon votre navigateur Internet, ?n certain endroit de votre disque dur. Par exemple, avec un syst? compos?e Windows et du navigateur INTERNET EXPLORER (le plus usit? Dans cette configuration, les cookies sont stock?dans le r?rtoire C:WindowsTemporary Internet Files comme ci-dessous : Voyons ?r?nt comment cr? de tels cookies, gr? ?a fonction setcookie(). Soit alors la portion de code suivante :

Et le code pour la page traitement.php :

exemple3
<?php If (isset($_POST['nom'])) { // on d?nit une dur?de vie de notre cookie (en secondes), donc un an dans notre cas $temps = 365*24*3600; // on envoie un cookie de nom pseudo portant la valeur de la variable $nom, c'est-?ire la valeur qu'a saisi la personne qui a rempli le formulaire setcookie ("pseudo", $_POST['nom'], time() + $temps); // fonction nous permettant de faire des redirections function redirection($url){ if (headers_sent()){ print('<meta http-equiv="refresh" content="0;URL='.$url.'">'); } else { header("Location: $url"); } } // on effectue une redirection vers la page d'accueil redirection ('index.php'); } else { echo 'La variable du formulaire n\'est pas d?ar?'; } ?>

exemple1
<?php // on d?nit une dur?de vie de notre cookie (en secondes), donc un an dans notre cas $temps = 365*24*3600; // on envoie un cookie de nom pseudo portant la valeur LA GLOBULE setcookie ("pseudo", "LA GLOBULE", time() + $temps); ?>

Explications : Gr? ?e code, nous venons d'envoyer, chez le client (donc le visiteur du site) un cookie de nom pseudo portant la valeur LA GLOBULE. De plus, time() retournant le nombre de secondes ?ul? depuis le 1er janvier 1970 jusqu'?'instant pr?nt, nous imposons que le cookie ai une dur?de vie de un an (soit en fait l'instant pr?nt plus un an, donc un an). Enfin, maintenant, si le visiteur ne supprime pas ce cookie, et bien, dans toutes les pages WEB de notre site, on pourra acc?r ?a variable $pseudo qui contiendra la cha? de caract?s LA GLOBULE. En revanche, l'envoie d'un cookie ayant la m? valeur pour tous les visiteurs d'un site, ce n'est pas vraiment int?ssant. Supposons alors que sur une page de notre site WEB, nous souhaitons faire en sorte que si le visiteur vient pour la premi? fois (ou qu'il a supprimer ses cookies), et bien, il aurait alors, la possibilit?e saisir son nom dans un formulaire, ou bien s'il ne s'agit pas de sa premi? visite, d'afficher tout simplement Bonjour puis son nom. On aurait alors le code suivant pour notre page (par exemple index.php) :

Attention !!! Plusieurs conditions sont ?especter afin que l'utilisation des cookies se passe au mieux : - l'envoie d'un cookie doit ?e la premi? fonction PHP que vous utilisez dans votre script, ce qui veut dire que vous devez utiliser la fonction setcookie() tout en haut de votre script (AUCUN AFFICHAGE ET AUCUN CODE CODE HTML AVANT UN SETCOOKIE). Si d'autres fonctions interviennent avant l'envoie du cookie, celui-ci ne fonctionnera pas. - Si vous envoy?n cookie sur un poste client celui-ci effacera automatiquement l'ancien cookie qui portait le m? nom (si il y en avait un), autrement il le cr?a. Note : Pour effacer un cookie, vous devez lancer un cookie qui aura le m? nom que le cookie que vous voulez effacer, tout en lui donnant une valeur nulle (vous pouvez ?lement l'envoyer avec un temps de vie d?ss?
Auteur : LA GLOBULE

exemple2
<html> <head> <title>Index du site</title> <body> <? // on teste la d?aration de notre cookie if (isset($_COOKIE['pseudo'])) {

2002 - 2009 lephpfacile.com - Page 1/3

2002 - 2009 lephpfacile.com - Page 2/3

Dernire rvision du cours : le 09/03/2009 17:58

2002 - 2009 lephpfacile.com - Page 3/3

exemple1
Les sessions
<html> <head> <title>Formulaire d'identification</title> </head> <body> <form action="login.php" method="post"> Votre login : <input type="text" name="login"> <br /> Votre mot de pass : <input type="password" name="pwd"><br /> <input type="submit" value="Connexion"> </form> </body> </html>

Voyons maintenant un tutorial vraiment important pour la scurit de vos scripts : les sessions. En effet, afin de transmettre des variables de pages en pages, plusieurs possibilits s'offrent vous : - les divers champs des formulaires, qu'ils soient hidden ou non. - passer les variables directement travers les liens. - utiliser les cookies. - utiliser les sessions. Cependant, toutes ces possibilits n'offrent pas le mme niveau de scurit. En effet, certaines de ces possibilits sont vraiment pratiquent dans leurs modes d'utilisation (comme les cookies par exemple mais tout le monde n'est pas oblig d'accepter les cookies), ce qui implique, dans la majorit des cas, un bas niveau de scurit (cas du passage des variables par les liens, ce qui implique que les variables seront visibles de tout le monde). De mme, faire dans chaque page un formulaire contenant des champs hidden permettant de faire circuler les diffrentes variables travers toutes les pages du site n'est pas vraiment pratique. C'est pourquoi, dans tous ces cas o la scurit de vos donnes est primordiale, vous devrez utiliser les sessions qui vous permettront de faire circuler diffrentes variables (comme un mot de passe par exemple) travers les pages de votre site, tout en tant assez confortables l'emploi. Pour utiliser les sessions, diffrentes fonctions PHP s'offrent nous. Voici dj un petit tableau vous permettant de vous familiariser avec ces diffrentes fonctions (que nous dtaillerons bien sur dans la suite de ce tutorial) :

D'aprs cette page, vous pouvez remarquer que lorsque le visiteur le remplira et qu'il cliquera sur le bouton de connexion, on se retrouvera au niveau de la page login.php avec une variable $pseudo qui contiendra le login de notre visiteur ainsi qu'une variable $pwd contenant son mot de passe ; variables qu'il faudra naturrellement tester avant de dmarrer notre session (car seuls les membres pourront accder notre espace membre, espace o l'on utilisera notre session). On aura alors par exemple (page login.php) :

exemple2
<?php // On dfinit un login et un mot de passe de base pour tester notre exemple. Cependant, vous pouvez trs bien interroger votre base de donnes afin de savoir si le visiteur qui se connecte est bien membre de votre site $login_valide = "moi"; $pwd_valide = "lemien"; // on teste si nos variables sont dfinies if (isset($_POST['login']) && isset($_POST['pwd'])) { // on vrifie les informations du formulaire, savoir si le pseudo saisi est bien un pseudo autoris, de mme pour le mot de passe if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd']) { // dans ce cas, tout est ok, on peut dmarrer notre session // on la dmarre :) session_start (); // on enregistre les paramtres de notre visiteur comme variables de session ($login et $pwd) (notez bien que l'on utilise pas le $ pour enregistrer ces variables) $_SESSION['login'] = $_POST['login']; $_SESSION['pwd'] = $_POST['pwd']; // on redirige notre visiteur vers une page de notre section membre header ('location: page_membre.php'); } else { // Le visiteur n'a pas t reconnu comme tant membre de notre site. On utilise alors un petit javascript lui signalant ce fait echo '<body onLoad="alert(\'Membre non reconnu...\')">'; // puis on le redirige vers la page d'accueil echo '<meta http-equiv="refresh" content="0;URL=index.htm">'; } } else { echo 'Les variables du formulaire ne sont pas dclares.'; } ?>

Fonction session_start session_register session_unregister session_is_registered session_id session_name session_unset session_destroy

Signification Dmarre une session Enregistre une variable de session Efface une variable de session Vrifie si une variable est dclare pour la session en cours Retourne l'id de la session en cours Retourne le nom de la session en cours Detruit toutes les variables de la session en cours Destruit la session en cours

Sachez galement qu'ils existent d'autres fonctions agissant sur les sessions. En revanche, tant donn qu'elles ne sont pas ncessaires la comprhension de notre tutorial, nous ne les dtaillerons pas ici (cf. la documentation pour de plus amples informations). Cependant, ces fonctions commencent toujours par session. Attention !!! Avant d'aller plus loin dans le tutorial, vous devez savoir que les sessions ne sont accessibles qu' partir de PHP 4. Cependant, je vous rassure, la plupart des hbergeurs sont aujourd'hui fait voluer leur PHP en PHP 4. Afin de voir concrtement comment fonctionnent les sessions, prenons alors un exemple simple : - imaginons que notre site possde une section membre o chaque membre devra se logu avant de pouvoir y entrer. - de plus, on aimerait bien tre sur qu'il s'agisse toujours de ce mme membre qui est connect. On aura alors une page contenant un formulaire permettant notre visiteur de se connecter une section membre (page index.htm) :

2002 - 2007 lephpfacile.com - Page 1/4

2002 - 2007 lephpfacile.com - Page 2/4

Auteur : LA GLOBULE

Remarquer galement que nous utilisons notre session_start avant tout code HTML. Voyons alors le code de la page de notre section membre, la page page_membre.php. On a :

Dernire rvision du cours : le 30/05/2007 00:11

exemple3
<?php // On dmarre la session (ceci est indispensable dans toutes les pages de notre section membre) session_start (); // On rcupre nos variables de session if (isset($_SESSION['login']) && isset($_SESSION['pwd'])) { // On teste pour voir si nos variables ont bien t enregistres echo '<html>'; echo '<head>'; echo '<title>Page de notre section membre</title>'; echo '</head>'; echo '<body>'; echo 'Votre login est '.$_SESSION['login'].' et votre mot de passe est '.$_SESSION ['pwd'].'.'; echo '<br />'; // On affiche un lien pour fermer notre session echo '<a href="./logout.php">Dconnection</a>'; } else { echo 'Les variables ne sont pas dclares.'; } ?>

Voyons alors le code de la page permettant au membre de se dconnecter (la page logout.php). On aura alors :

exemple4
<?php // On dmarre la session session_start (); // On dtruit les variables de notre session session_unset (); // On dtruit notre session session_destroy (); // On redirige le visiteur vers la page d'accueil header ('location: index.htm'); ?>

Rsumons alors tout ce que nous venons de voir : - chaque session un id diffrent (ce qui permet d'viter la confusion entre les connexions). - chaque page o notre session doit tre active, on doit placer un session_start en tout dbut de page (avant tout code HTML). - toutes les variables enregistres au cours de notre session, seront accessibles dans les pages de notre session. - n'oubliez JAMAIS de dtruire vos variables de session lors de la dconnexion. En respectant ces rgles vous pourrez trs rapidement faire vous-mme votre espace membre, voir mme pourquoi pas une boutique en ligne :)

2002 - 2007 lephpfacile.com - Page 3/4

2002 - 2007 lephpfacile.com - Page 4/4

Les variables globales

Votre identifiant : <input type="text" name="login"> <br /> Votre mot de passe : <input type="password" name="pwd"><br /> <input type="submit" value="Connexion"> </form> </body> </html>

Voici le tutorial concernant les variables globales. Ceci n'est pas vraiment un tutorial, mais plutt une note d'information. En effet, depuis la version 4.2.0 de PHP, un paramtre de la configuration de PHP (celui concernant les variables globales) est initialis par dfaut la valeur OFF lors de l'installation (ce qui implique que les variables globales ne sont pas actives) alors qu'auparavant, il tait initialis ON (l, les variables globales sont actives). En consquence, suivant votre hbergeur, et donc de sa configuration de PHP, il se pourrait trs bien que tout ce que vous avez vu jusque l ne fonctionne pas sur votre site. Cependant, cette diffrence d'initialisation de paramtre n'influence que sur la mthode permettant de rcuprer les variables, que ce soit : - des variables provenant de formulaires POST ou GET - la valeur des cookies - des variables de sessions - des variables d'environnement - des variables de serveurs Comme vous le savez, auparavant, pour rcuprer nos variables, on les appelait simplement avec un $ suivi de leur nom. Dans le cas o les variables globales ne sont actives, vous ne pouvez plus utiliser cette mthode afin de rcuprer vos variables. En effet, maintenant, nous rcuprerons toutes cas variables et toutes ces valeurs par le biais de tableaux associatifs, que l'on rsumer ainsi :

Pour rcuprer nos variables correspondant aux champs login et pwd, nous allons utiliser le tableau associatif $_GET. On aura lors, par exemple, la page login.php suivante :

exemple2
<html> <head> <title>Page de rcupration des variables</title> </head> <body> <?php // On teste si nos variables sont dclares if (isset($_GET['login']) && isset($_GET['pwd'])) { // On fait ce que l'on veut ensuite :) echo 'Votre login est '.$_GET['login'].' Et votre mot de passe est '.$_GET['pwd']; } else { echo 'Les variables du formulaire ne sont pas dclares.'; } ?> </body> </html>

Tableaux associatifs $_GET $_POST $_FILES $_COOKIE $_SESSION $_ENV $_SERVER

Description Rcupration des variables d'un formulaire GET ou des variables passes par une URL Rcupration des variables passes par un formulaire POST Rcupration des variables de fichiers envoys par un formulaire Rcupration des valeurs des cookies Rcupration des variables de session Rcupration des variables d'environnement Rcupration des variables serveur

Simple, non ? :) Prcisons galement, que lorsque l'on passe des variables par une URL, la mthode ne change absolument pas. En effet, imaginons la page index.htm suivante :

exemple3
<html> <head> <title>Juste un lien :)</title> </head> <body> <a href="./login.php?login=GLOBULE&pwd=haha">Notre lien</a> </body> </html>

Voyons alors maintenant, cas par cas, comment rcuprer ces variables et ces valeurs. Le cas des formulaires GET (ou des variables passes par une URL) : Supposons que l'on a une page index.htm contenant un formulaire permettant de saisir un login ainsi qu'un mot de passe. On pourrait alors trs bien avoir une page ressemblant :

Et bien en gardant la mme page login.php que prcdemment, l'affichage de la page login.php serait strictement identique que dans le cas du formulaire GET. Le cas des formulaires POST : La mthode et strictement identique que le cas des formulaires GET, sauf, naturellement, au lieu d'utiliser le tableau associatif $_GET, nous allons ici utiliser le tableau associatif $_POST. En reprenant les mmes exemples que prcdemment, on aurait alors :

exemple1
<html> <head> <title>Formulaire d'identification</title> </head> <body> <form action="login.php" method="get">

2002 - 2007 lephpfacile.com - Page 1/9

2002 - 2007 lephpfacile.com - Page 2/9

- la page index.htm

</body> </html>

exemple4
<html> <head> <title>Formulaire d'identification</title> </head> <body> <form action="login.php" method="get"> Votre identifiant : <input type="text" name="login"> <br /> Votre mot de passe : <input type="password" name="pwd"><br /> <input type="submit" value="Connexion"> </form> </body> </html> Dans la page send_fichier.php, on a alors accs aux diffrentes valeurs (suivant les indices) prises par le tableau associatif $_FILES. Voici les valeurs que contient ce tableau (suivant les diffrents indices) : Valeur du tableau $_FILES['nom_de_la_variable']['name'] $_FILES['nom_de_la_variable']['type'] $_FILES['nom_de_la_variable']['size'] $_FILES['nom_de_la_variable']['tmp_name'] $_FILES['nom_de_la_variable']['error'] Description Le nom original du fichier qui provient de la machine du client Le type MIME du fichier La taille du fichier en bytes (soit 8 bits ou un octet) Le nom temporaire du fichier stock sur le serveur Le code erreur associ l'upload

- la page login.php

Pour afficher ces valeurs, on pourrait trs bien le code de la page send_fichier.php qui ressemble :

exemple5
<html> <head> <title>Page de rcupration des variables</title> </head> <body> <?php // On teste nos deux variables if (isset($_POST['login']) && isset($_POST['pwd'])) { // On fait ce que l'on veut ensuite :) echo 'Votre login est '.$_POST['login'].' Et votre mot de passe est '.$_POST['pwd' ]; } else { 'Les variables du formulaire ne sont pas dclares.'; } ?> </body> </html>

exemple7
<html> <head> <title>Page de rcupration du fichier</title> </head> <body> <?php // On teste les diffrentes valeurs if (isset($_FILES['mon_fichier']['name']) && isset($_FILES['mon_fichier']['size']) && isset($_FILES['mon_fichier']['tmp_name']) && isset($_FILES['mon_fichier']['type']) && isset($_FILES['mon_fichier']['error'])) { // On echo echo echo echo echo affiche ces diffrentes valeurs 'Nom d\'origine : '.$_FILES['mon_fichier']['name'].'<br />'; 'Taille : '.$_FILES['mon_fichier']['size'].'<br />'; 'Nom sur le serveur : '.$_FILES['mon_fichier']['tmp_name'].'<br />'; 'Type de fichier : '.$_FILES['mon_fichier']['type'].'<br />'; 'Code erreur : '.$_FILES['mon_fichier']['error'].'<br />';

Rcupration d'un fichier par le biais d'un formulaire : Supposons que l'on dispose d'un formulaire nous permettant d'envoyer un fichier. On pourrait alors trs bien avoir une page index.htm ressemblant :

} else { echo 'Nos variables ne sont pas dclares.'; } ?> </body> </html>

exemple6
<html> <head> <title>Formulaire permettant d'envoyer un fichier</title> </head> <body> <form action="send_fichier.php" method="post" ENCTYPE="multipart/form-data"> Votre fichier : <input type="file" name="mon_fichier"> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="20000"> <input type="submit" value="Envoyer"> </form>

Les cookies : Supposons que nous disposons d'une page send_cookie.php qui nous permet d'envoyer un cookie contenant le nom d'un visiteur. On aurait alors par exemple :

exemple8
<?php $temps = 365*24*5500; setcookie ("pseudo", "LA GLOBULE", time() + $temps); header ('Location : index.php');

2002 - 2007 lephpfacile.com - Page 3/9

2002 - 2007 lephpfacile.com - Page 4/9

?>

visiteur qui se connecte est bien membre de votre site $login_valide = "moi"; $pwd_valide = "lemien"; // on vrifie un pseudo autoris, if ($login == // dans ce les informations du formulaire, savoir si le pseudo saisi est bien de mme pour le mot de passe $_POST['login'] && $pwd == $_POST['pwd']) { cas, tout est ok, on peut dmarrer notre session

Ensuite, nous allons rcuprer la valeur du cookie dans la page index.php, grce au tableau associatif $_COOKIE. On pourrait alors avoir le code suivant :

exemple9
<html> <head> <title>Page de rcupration du cookie</title> </head> <body> <? // On teste notre cookie if (isset($_COOKIE['pseudo'])) { echo 'Votre nom est '.$_COOKIE['pseudo']; } else { echo 'Cookie non dclar'; } ?> </body> </html>

// on la dmarre :) session_start (); // on enregistre les paramtres de notre visiteur comme variables de session ($_POST['login'] et $_POST['pwd']) $_SESSION['login'] = $_POST['login']; $_SESSION['pwd'] = $_POST['pwd']; // on redirige notre visiteur vers une page de notre section membre header ('location : page_membre.php'); } else { // Le visiteur n'a pas t reconnu comme tant membre de notre site. On utilise alors un petit javascript lui signalant ce fait echo '<body onLoad="alert('Membre non reconnu...')">'; // puis on le redirige vers la page d'accueil header ('location : index.htm'); } } else { echo 'Les variables du formulaire ne sont pas dclares.'; } ?>

Les variables de sessions : Supposons que l'on a le mme formulaire d'identification que dans le tutorial consacr aux sessions. On aura alors : - la page index.htm

exemple10
<html> <head> <title>Formulaire d'identification</title> </head> <body> <form action="login.php" method="post"> Votre login : <input type="text" name="login"> <br /> Votre mot de pass : <input type="password" name="pwd"><br /> <input type="submit" value="Connexion"> </form> </body> </html>

L encore, aucun changement, part que l'on utilise le tableau associatif $_POST pour rcuprer les valeurs que le visiteur a saisi dans le formulaire d'identification. - la page page_membre.php

exemple12
<?php // On dmarre la session (ceci est indispensable dans toutes les pages de notre section membre) session_start (); // On teste pour voir si nos variables ont bien t enregistres echo '<html>'; echo '<head>'; echo '<title>Page de notre section member</title>'; echo '</head>'; echo '<body>'; // On teste nos variables de session if (isset($_SESSION['login']) && isset($_SESSION['pwd'])) { // On gre notre affichage echo 'Votre login est '.$_SESSION['login'].' et votre mot de passe est '.$_SESSION ['pwd'].'.'; echo '<br />'; // On affiche un lien pour fermer notre session echo '<a href="./logout.php">Dconnection</a>'; } else { echo 'Les variables de sessions ne sont pas dclares.';

L, on remarque aucun changement. - la page login.php

exemple11
<?php // On teste nos variables du formulaire d'authentification par le biais du tableau associatif $_POST if (isset($_POST['login']) && isset($_POST['pwd'])) { // On dfinit un login et un mot de passe de base pour tester notre exemple. Cependant, vous pouvez trs bien interroger votre base de donnes afin de savoir si le

2002 - 2007 lephpfacile.com - Page 5/9

2002 - 2007 lephpfacile.com - Page 6/9

} echo '</body>'; echo '</html>'; ?>

- la page index.htm

exemple16
<html> <head> <title>Formulaire d'identification</title> </head> <body> <form action="login.php" method="post"> Votre identifiant : <input type="text" name="login"> <br /> Votre mot de passe : <input type="password" name="pwd"><br /> <input type="submit" value="Connexion"> </form> </body> </html>

L enfin, on utilise le tableau associatif $_SESSION pour rcuprer nos deux variables de sessions : login et pwd. Les variables d'environnement : Dans ce cas, rien de plus simple, puisque pour afficher le contenu d'une variable d'environnement, il suffit d'crire $_ENV puis le nom de la variable que l'on dsire afficher entre crochet. Exemples :

exemple13
<?php echo 'Systme d\'exploitation : '.$_ENV['OS']; echo '<br /><br />'; echo 'Chemin du profil utilisateur : '.$_ENV['USERPROFILE']; ?>

- la page login.php

exemple17
Les variables de serveur : On procde de la mme manire que pour les variables d'environnement. Exemples : <html> <head> <title>Page de rcupration des variables</title> </head> <body> <?php // On rcupre nos deux variables extract ($_POST, EXTR, OVERWRITE); // On fait ce que l'on veut ensuite :) echo 'Votre login est '.$login.' Et votre mot de passe est '.$pwd; ?> </body> </html>

exemple14
<?php echo 'Chemin du script courant : '.$_SERVER['PHP_SELF']; echo '<br /><br />'; echo 'Adresse IP du client : '.$_SERVER['REMOTE_ADDR']; ?>

Pour rcuprer plus rapidement ces variables : Afin de rcuprer facilement et rapidement vos variables, vous pouvez utiliser la fonction extract. En effet, cette fonction exporte vos tableaux associatifs en crant une variable pour chaque indice de vos tableaux. Par exemple, si on a une page index.htm contenant un formulaire mthode POST, et que dans votre page login.php (cible par le champ ACTION du formulaire) vous traitez ces variables, vous pouvez crire la ligne suivante (dans la page login.php, en tout dbut de page) :

En clair, extract crer : - une variable $login comprenant la valeur de tableau $_POST['login'] - une variable $pwd comprenant la valeur de tableau $_POST['pwd'] Le second argument de la fonction sert grer les collisions de variables. Voici les valeurs possibles du second argument de extract : Valeurs EXTR_OVERWRITE EXTR_SKIP EXTR_PREFIX_SAME Description Ecrase les variables dj existantes N'crase pas les variables dj existantes Si une variable de mme nom existe dj, une nouvelle variable sera cre avec un prfixe donn en troisime argument extract Cela cre de nouvelles variables avec le prfixe pass en troisime argument pour toutes les indices du tableau Cela cre de nouvelles variables avec le prfixe pass en troisime argument pour les noms de variables invalides (voir le tutorial sur les dclarations de variables)

exemple15
<?php extract ($_POST, EXTR, OVERWRITE); ?>

Ce qui va crer des variables qui contiendront comme valeur les diffrentes valeurs du tableau associatif $_POST. Variables qui auront comme nom, la valeur de chacun des indices du tableau associatif $_POST. Ceci implique que si l'on a un formulaire de type POST, avec, mettons un champ de name login et un autre de name pwd, et bien au lieu de rcuprer chaque fois la valeur des variables la main, par le biais du tableau associatif $_POST, cette fonction nous permet d'obtenir directement des variables $login et $pwd (au lieu des valeurs de tableau $_POST['login'] et $_POST['pwd']). Exemple :

EXTR_PREFIX_ALL EXTR_PREFIX_INVALID

2002 - 2007 lephpfacile.com - Page 7/9

2002 - 2007 lephpfacile.com - Page 8/9

Auteur : LA GLOBULE Dernire rvision du cours : le 30/05/2007 00:13

2002 - 2007 lephpfacile.com - Page 9/9

Le dbuggage

Maintenant que vous tes assez familier avec le PHP, il vous est srement dj arriv de rester coince par un bug pendant (et oui, a arrive ^^) des heures entires. La partie de dbuggage est une phase essentielle de la programmation d'une application, ne serait que pour faire un rapport de tests : tester chaque fonction afin de voir ce qu'il se passe dans tous les cas. Le dbuggage est galement ncessaire lorsque l'on bloque sur un truc que l'on ne comprend pas. Avant de tomber dans un tel cas de bug o l'on ne peut plus avancer, il existe de nombreuses rgles respecter afin de minimiser le risque de bug. Arer le code Arer le code est trs important. Cela ne sert strictement rien de vouloir faire de la compression de code en ne sautant pas de lignes dans son code, et ce, en crivant des instructions les unes la suite des autres sans sauter de lignes (si si, j'ai dj vu de tels cas ^^). Exemple de code non ar :

<?php $toto = 2; if ($toto == 2) { echo '$toto vaut 2'; } elseif ($toto == 3) { echo '$toto vaut 3'; } else { echo '$toto n\'est pas gal 2 ou 3'; } ?>

Pour les partisans de l'autre technique, les grandes lignes restent les mmes, mais la diffrence se joue au niveau de l'accolade ouvrante des conditionnelles ou des boucles. En effet, certains mettent l'accolade ouvrante, non pas la fin de la ligne de conditionnelle ou de boucle, mais la ligne suivante, et l'accolade tant au mme niveau que la conditionnelle ou de la boucle. En reprenant l'exemple prcdent, nous aurons donc :

exemple4
<?php $toto = 2; if ($toto == 2) { echo '$toto vaut 2'; } elseif ($toto == 3) { echo '$toto vaut 3'; } else { echo '$toto n\'est pas gal 2 ou 3'; } ?>

exemple1
<?php $toto = 3; $titi = 4; $somme = $toto + $titi; echo $somme; ?>

Voici ce mme exemple, bien ar :

exemple2
<?php $toto = 3; $titi = 4; $somme = $toto + $titi; echo $somme; ?>

Tout comme pour l'aration du code, vous devez bien vous rendre compte qu'un code bien indent sera beaucoup plus lisible qu'un code mal indent o il faut chaque fois deviner o se terminent les conditionnelles et les boucles. Alors que l, en regardant votre diteur de texte, pour voir o se termine une conditionnelle, vous n'avez qu' suivre des yeux le niveau (de tabulation) de votre conditionnelle et de faire dfiler le texte. Ds que vous tomberez sur une accolade fermante, et bien c'est cette accolade qui reprsente la fin de votre conditionnelle (vous n'avez pas besoin rflchir de l'endroit o se trouve l'accolade fermant cette conditionnelle). Commenter le code Commenter votre code !!! Je me rappelle encore d'un professeur qui me disait qu'un code sans commentaire ne servait strictement rien. En effet, sur le moment (lorsque l'on est bien chaud ^^), on crit des dizaines de lignes de code (et des fois, vraiment pas videntes au premier abord) que l'on comprend parfaitement (parce que l'on a l'algorithme en tte). Mais dans un mois ? Dans un an ? Seriez vous aussi sur de comprendre en 2 minutes ce que vous avez crit quelques mois plus tt ? Pas sur... Sans commentaires, votre code est pauvre. Imaginons galement qu'un autre programmeur lise votre code. Sera-t-il capable de comprendre le cheminement de votre pense ? Pour toutes ces raisons, je vous invite chaudement commenter votre code. Et j'en ai mme personnellement fait les frais.

Naturellement, cet exemple peut paratre tout bte, mais lorsque votre code commence faire des centaines de lignes, le premier exemple (non ar) devient vite trs nervent : vous ne vous retrouvez plus. Indenter le code Bien indenter le code vous permet de voir rapidement de voir un aperu de la structure de votre code. L'indentation consiste placer certains lments cls du code (comme les accolades par exemple) un endroit bien prcis et de s'y tenir afin de lire aisment votre code. Il existe plusieurs techniques (toutes dfendables) pour indenter un code, mais seules deux techniques sont rellement utilises. Une premire forme d'indentation, consiste placer une seule instruction par ligne (la dessus, en gnral, tout le monde est d'accord ^^), et lorsque l'on place une conditionnelle ou bien une boucle, et bien nous plaons l'accolade ouvrante en fin de ligne de conditionnelle ou de boucle, puis nous utilisons une tabulation sur les instructions contenues dans cette conditionnelle ou dans cette boucle. Enfin, l'accolade fermante de notre conditionnelle ou de notre boucle se placera au niveau de la conditionnelle ou de la boucle. Exemple :

exemple3

2002 - 2007 lephpfacile.com - Page 1/7

2002 - 2007 lephpfacile.com - Page 2/7

Combien de fois je ne me suis jamais demand ce que j'avais dans la tte le jour o j'ai pondu ce code x, et ce, mme pour des langages o je me sens l'aise. Attention aussi ne pas tomber dans l'excs de commentaires. En effet, cela ne sert strictement rien de mettre un commentaire de ce genre :

exemple5
<?php // on affiche la somme echo $somme; ?>

Il ne faut pas non plus prendre tous les programmeurs (ainsi que vous au passage ^^) pour des cruches :) La documentation PHP existe. Si la personne qui lit votre code ne connat pas l'utilit de la fonction echo, il lui suffit d'ouvrir son manuel PHP et de voir le rle cette fonction. Placer des commentaires sur vos fonctions (2 / 3 lignes de commentaires avant le code de la fonction dcrivant les paramtres de la fonction et son rle ne peut tre qu'utile), sur vos sections critiques dans votre code (par exemple sur une difficult algorithmique), dans vos enttes de classes pour dcrire le rle de votre classe, le genre d'objets qu'elle gnre. Comment dbugger Si, malgr toutes les prcautions que nous avons vu prcdemment, vous rester bloquer avec un script rcalcitrant qui ne fonctionne pas comme vous le souhaitez (alors qu'il le devrait selon vous ^^), il va falloir dbugger. Pour dbugger, il faut dj notamment retirer tout ce qui est inutile au fonctionnement du script. Nettoyer notamment le code PHP de tous ses echo de code html (laisser juste des histoire d'y voir un peu clair quand mme ^^). En effet, pour le moment, votre script bug. Taper directement dans le vif. Pour le design, on verra aprs. D'ailleurs, pour viter d'avoir ce genre de problme, je vous conseille de faire tous vos scripts sans aucun artifice de design (une fois que votre script fonctionnera sans problme, vous pourrez alors vous occuper de sa mise en page). Toujours dans le but de dbugger, prenez l'habitude lors de la phase de conception d'un script, d'afficher le contenu de vos variables (afin de bien voir ce qu'elles ont dans le ventre lors de l'excution du script). Une petite astuce pour afficher tout ce qui est variable de type chane de caractres. Lorsque vous voulez afficher leur contenu, afficher leur contenu entre deux points par exemple (afin de voir si la variable ne contient pas en dbut ou en fin de chane un espace qui peut tre source de bug).

Array ( [a] => pomme [b] => banane [c] => Array ( [0] => x [1] => y [2] => z ) )

Un conseil, lorsque vous faites un print_r, visualiser le en affichant la source de votre page (sous Internet Explorer : Menu affichage Source). Vous verrez ainsi le contenu de votre tableau tout indent ce qui est beaucoup plus lisible. PS : print_r peut tre utilis sur tous vos types de variables. Cas des conditionnelles Il peut arriver que les conditionnelles n'aient pas le comportement souhait l'origine. En effet, quelques fois, votre script ne rentre pas dans le if mais dans le else alors qu'il devrait faire le contraire. Prenez la mme mthode que prcdemment en affichant le contenu de vos variables afin de voir ce qui cloche. Prenez galement attention aux tests de votre conditionnelle. En effet, en crivant par exemple :

exemple8
<?php $toto = 5; if ($toto = 4) { echo '$toto vaut 4'; } ?>

Et bien votre code passera toujours dans le if, et il affichera toujours $toto vaut 4. Ceci est du l'utilisation d'un seul = pour faire votre test (vous faites en fait une affectation au lieu d'une comparaison qui elle se fait avec ==). Cas des boucles Le cas des boucles est plus ou moins similaire celui des conditionnelles. En effet, si votre boucle ne dmarre pas du tout, vrifier la valeur de votre compteur l'initialisation de la boucle. De mme, si votre boucle semble tourner l'infini, vrifier bien que la valeur pour la sortie de la boucle arrivera coup sur. Si par contre votre boucle effectue des traitements non voulus sur vos donnes, prenez l'habitude de placer un echo dans votre boucle afin de voir la valeur de vos variables chaque passage de boucle. Pour pourrez ainsi mieux apprcier le comportement de votre boucle sur vos variables. Exemple :

exemple6
<?php $chaine = " test"; echo '.'.$chaine.'.'; ?>

En ce qui concerne les variables de type tableau (array), vous pouvez visualiser leur contenu l'aide de la fonction print_r. Exemple :

exemple7
<?php $tablo = array ('a' => 'pomme', 'b' => 'banane', 'c' => array ('x', 'y', 'z')); print_r ($tablo); ?>

exemple9
<?php $toto = 2; for ($i = 0; $i < 5; $i++) { $resultat = $toto * $i; echo 'Passage numro '.$i.' => multiplication = '.$resultat;

Ce qui affichera :

2002 - 2007 lephpfacile.com - Page 3/7

2002 - 2007 lephpfacile.com - Page 4/7

echo '<br />'; } ?>

faite prcdemment. Les messages d'erreurs frquents Enfin, si malgr toutes ces prcautions, il vous arrive de bloquer sur une erreur, voici un tableau regroupant les erreurs les plus communes que l'on peut avoir en programmant avec PHP accompagnes de petits indices vous permettant de les rsoudre. Erreur Parse error: parse error in xxxx.php on line y Remde Il s'agit d'une erreur de syntaxe. Vrifiez si vous n'avez pas oubli un ; marquant la fin d'une instruction. Verifier galement si il ne manque pas un $ (dollar) devant le nom d'une variable. N'hsitez pas contrler les lignes prcdentes. L'erreur se trouve souvent juste au-dessus. Warning: php_SetCookie called after header has been sent Vous avez tent d'initialiser un cookie aprs que l'entte in xxxx.php on line y HTTP soit envoy au client. Vrifiez si une sortie (echo, print, message d'erreur, ligne blanche, code html avant les tags php) ne se fait pas avant votre initialisation de cookie Warning: MySQL Connection Failed: Access denied for Erreur de connexion la base MySQL. Vrifiez vos user: .... paramtres de connexion Warning: Unable to create [chemin] No such file or Le chemin vers le rpertoire sens contenir le fichier ou directory in your script on line [numero] bien le chemin du rpertoire dans lequel le fichier doit tre cre est incorrect Warning: 0 is not a MySQL result index in xxxx.php on line Erreur probable au niveau de la requte SQL. Vrifiez votre y requte SQL : en particulier les champs manipuls, le nom de ou des tables impliques, etc... Warning: Variable $zzzz is not an array or string in Vous tentez de manipuler une valeur numrique avec une xxxx.php on line y fonction ddie aux chanes ou aux tableaux. Warning: Variable $zzzz is not an array or object in Vous tentez de manipuler une valeur numrique avec une xxxx.php on line y fonction ddie aux tableaux ou aux objets. Warning: Cannot add header information headers already Vous avez tent d'effectuer un Header aprs que l'entte sent in xxxx.php on line y HTTP ait envoy au client. Vrifiez si une sortie (echo, print, message d'erreur, voir mme du code html) ne s'excute pas avant votre Header Fatal error: Maximum execution time exceeded in xxxx.php PHP dispose d'un mcanisme permettant de se prmunir on line y des scripts susceptibles d'engendrer un temps d'excution trop important pouvant saturer un serveur. Par dfaut, ce temps est de 30 secondes. Fatal error: Allowed memory size of 8388608 bytes PHP dispose d'un mcanisme permettant de se prmunir exhausted (tried to allocate x bytes) in yyyy.php on line z des scripts susceptibles d'engendrer une consommation mmoire trop importante pouvant saturer un serveur. Par dfaut, une limite est fixe environ 8 Mo (8388608 octets). Fatal Error: Call to undefined function: xxxx() in yyy.php on La fonction que vous appelez n'existe pas. Ce peut-tre line z une fonction lie une librairie externe (GD, Zlib, PDF, etc.). Dans ce cas, un simple phpinfo() vous renseignera sur les paramtres de compilation de votre version de PHP. Peut-tre s'agit-il sinon d'une de vos propres fonctions. Vrifiez alors qu'elle existe (notamment si votre script y accde bien si elle se trouve dans un autre fichier). Et dans tous les cas, contrlez de plus prs le nom de la fonction appele (orthographe, etc.). Une erreur de frappe est vite arrive.

Cas des fichiers Les erreurs arrivent assez facilement avec l'utilisation des fichiers si l'on ne prend pas garde certains points. Lorsque vous avez des erreurs en utilisant des fichiers, vrifier toujours : - d'une part le chemin pour accder votre fichier (chemins relatifs / absolus) - d'autre part le chmod de ce fichier (afin de voir si vous avez les droits pour accder ce fichier). Problmes avec MySQL Voici plusieurs conseils qui vous permettront d'viter certaines erreurs incomprhensibles avec MySQL. Tout d'abord, prenez l'habitude de placer vos requtes SQL dans des variables. Cela peut paratre rdhibitoire au dpart, mais cela a plusieurs avantages. En effet, en plaant vos requtes SQL dans une variable (par exemple $sql, au lieu de faire directement un mysql_query) vous allez pouvoir afficher votre requte SQL (via un echo $sql), ce qui constitue un rel avantage dans le cas de requtes contenant des variables gres par PHP (cela vous permet de bien voir si la requte contient les bonnes valeurs pour chacun des lments grs par PHP). Un autre avantage dcoule aussi de ce premier conseil. En effet, si votre requte l'air de bien passer mais que, a priori, la rcupration des lments de la requte pose problme, il arrive souvent que l'on se demande si c'est la requte qui s'est bien droule et qui ne retourne aucun rsultat ou bien si c'est notre code de rcupration qui pose problme. Afin d'en avoir le coeur net, faites un echo de votre $sql, et copier coller votre requte dans votre PHPMyAdmin : si PHPMyAdmin sort bien un rsultat, c'est que votre code de rcupration n'est pas fameux. En revanche, si votre PHPmyAdmin ne retourne rien, c'est bien que requte ne retourne aucun rsultat. De mme, en avanant toujours dans cette direction, compter toujours le nombre de rsultat retourn de votre requte SQL l'aide d'un mysql_num_rows, ce qui va vous permettre d'afficher un texte au lieu de ne rien avoir sur l'cran et de ne pas comprendre pourquoi il n'y a rien sur l'cran. Exemple :

exemple10
<?php $sql = 'SELECT toto FROM table WHERE test="ok"'; $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); $nb = mysql_num_rows ($req); if ($nb == 0) { echo 'Aucun rsultat retourn.'; } else { // Rcupration des rsultats et affichage } mysql_free_result ($req); ?>

Prenez galement l'habitude de mettre un or die muni de la fonction mysql_error sur vos lancement de requtes SQL afin de voir (si la requte ne passe pas) ce qui pose problme. Faites aussi toujours un mysql_free_result sur votre requte de type SELECT lorsque celle-ci est termine afin de librer la mmoire ncessaire l'excution de votre requte. En effet, d'une part, cela soulage le serveur, et d'autre part, cela vite de rcuprer les rsultats d'une autre requte

2002 - 2007 lephpfacile.com - Page 5/7

2002 - 2007 lephpfacile.com - Page 6/7

Fatal Error: Cannot redeclare xxxx() in yyy.php on line z

Fatal error: Input in flex scanner failed in xxxx on line y

Failed opening '%s' for inclusion (include_path='%s')

file("%s") - Bad file descriptor

Wrong parameter count for %s()

stat failed for %s (errno=%d - %s)

Vous avez certainement dclar plusieurs fois la mme fonction. Contrlez nouveau l'ensemble des fonctions que vous avez cres. Et n'hsitez pas vrifier galement dans les ventuels fichiers inclus. C'est souvent dans un script secondaire que vous trouverez le doublon. Veillez aussi ne pas utiliser le nom d'une fonction propre PHP ou l'une de ses librairies. Vrifiez vos include et require. Il y a fort croire que vous avez indiqu un chemin incomplet (genre usrlocal sans prciser de fichier). Le fichier n'a pas pu tre inclus dans votre script, car PHP n'a pas pu y accder : vrifiez les droits (utilisateur PHP, droits du fichier), les noms et chemins du fichier inclus. Problme d'accs un fichier avec la fonction file(). Vrifiez bien que l'URL est valide. (l'URL "http:www.super.php") est invalide alors qu'une erreur de type 404 sera valide. La fonction est appele avec un nombre insuffisant de paramtre, ou bien avec trop de paramtres. Certaines fonctions ont besoin d'un minimum de paramtres (array()), et gnralement d'un maximum. Impossible d'accder au fichier (problme de droits ou de chemin d'accs).

Auteur : LA GLOBULE Dernire rvision du cours : le 30/05/2007 00:14

2002 - 2007 lephpfacile.com - Page 7/7

La porte des variables

Sachez qu'il est possible d'utiliser dans le code mme de vos fonctions des variables que vous avez dclares dans votre script courant l'aide du mot cl global. Reprenons notre exemple prcdent :

Voyons maintenant un caractre propre beaucoup de langages de programmation fonctionnels, dits, de haut niveaux : la porte des variables. En PHP, jusqu' prsent, lorsque vous dclariez une variable dans votre script, vous aviez l'habitude d'accder cette variable dans tout le reste de votre page. En effet, d'aprs le code suivant :

exemple4
<?php $toto = 5; function ma_fonction () { global $toto; echo $toto; } ma_fonction(); ?>

exemple1
<?php $toto = 5; // fin du script ?>

Cet exemple affichera : 5

$toto est une variable qui sera accessible par votre script PHP une fois sa dclaration faite, c'est--dire juste aprs l'instruction $toto = 5. On peut observer le mme comportement lorsque l'on utilise des include. En effet, une fois que l'on a dclar une variable, cette variable est accessible directement dans tous les scripts que l'on inclut notre script courant. Exemple : En effet, dans ce script, nous dclarons la variable (qui tait jusque l locale) $toto comme tant une variable globale du script. PHP sait alors qu'il doit rcuprer la valeur de cette variable dans le script courant. Il n'y a aucune limite au nombre de variables globales qui peuvent tre manipules par une fonction. Vous pouvez galement effectuer la mme opration en utilisant le tableau associatif $_GLOBALS. Le code suivant donnera le mme rsultat que le code prcdent :

exemple2
<?php $toto = 5; include ('script.php'); ?>

exemple5
<?php $toto = 5; function ma_fonction () { echo $_GLOBALS["toto"]; } ma_fonction(); ?>

Ici, $toto sera accessible, c'est dire que l'on pourra l'appeler directement (elle contiendra alors sa valeur : 5) dans le script script.php. Vous savez galement, qu'une variable dclare dans le corps d'une fonction n'est accessible que dans le corps de cette mme fonction. Par exemple :

exemple3
<?php $toto = 5; function ma_fonction () { echo $toto; } ma_fonction(); ?>

Comme vous le voyez, le tableau $GLOBALS est un tableau associatif avec le nom des variables globales comme clef et les valeurs des lments du tableau comme valeur des variables, ce qui ressemble un peu aux tableau associatifs que vous connaissez dj comme $_POST ou $_GET qui vous permettent de rcuprer la valeur des champs de vos formulaires. Le mot cl static Les amateurs de programmation par objets doivent bien connatre ce terme de static :) Une variable dite static est une variable locale une fonction mais qui a la particularit de se souvenir de sa valeur. Prenons comme exemple le code suivant :

Dans ce cas, l'excution de ce code PHP n'affichera rien vu que $toto (contenu dans le code de la fonction ma_fonction()) n'a strictement aucun rapport avec la variable $toto contenu dans le script courant. On appellera la variable $toto (celle contenue dans le code de la fonction) comme tant une variable locale la fonction ma_fonction() (elle n'est pas globale au script). Le mot cl global

exemple6
<?php function ma_fonction () { $toto = 1; echo $toto; $toto++; } ?>

2002 - 2007 lephpfacile.com - Page 1/4

2002 - 2007 lephpfacile.com - Page 2/4

Notre fonction modifie alors directement cette zone mmoire en lui donnant une nouvelle valeur, ce qui explique que dans le script courant, et bien la valeur de $toto a chang. Si je lance cette fonction 50 fois, vous allez tous penser que cette fonction affichera 50 fois la valeur 1, et vous aurez raison :) Dans ce cas, l'incrmentation ne sert rien puisque lorsque l'on a fini d'excuter cette fonction PHP "perd connaissance" de la valeur de la variable $toto. En revanche, si on dclare la variable $toto comme tant une variable statique (grce au mot cl static), le comportement de cette fonction sera totalement diffrent. En effet, vu que $toto est statique, PHP se souviendra de sa valeur lors de la dernire excution de la fonction. Avec le code suivant :
Auteur : LA GLOBULE Dernire rvision du cours : le 30/05/2007 00:16

exemple7
<?php function ma_fonction () { static $toto = 1; echo $toto; $toto++; } ?>

Si je lance 50 fois ma fonction, et bien nous verrons sur l'cran, la suite des nombres entre 1 et 50. Explication : chaque appel, PHP se souvient de la prcdente valeur de la variable $toto (parce qu'elle est static) et notre fonction incrmente alors cette valeur pour ensuite l'afficher. Le passage par rfrence Dans nos exemples prcdents, vous avez que grce au mot cl static, les fonctions pouvaient rcuprer les valeurs des variables globales. Sachez qu'il est galement possible de modifier la valeur d'une variable d'un script (une variable globale) grce une fonction en utilisant un passage de variable par rfrence. Le passage par rfrence se caractrise par l'utilisation d'un & avant le nom de votre variable dans les arguments de votre fonction. Exemple :

exemple8
<?php $toto = 5; function ma_fonction ($var) { $var++; } ma_fonction(&$toto); echo $toto; ?>

Ce script affichera : 6

Pour les personnes qui ont fait du C, le passage par rfrence s'assimile la notion de pointeur. En passant une variable par rfrence une fonction, nous ne passons pas en fait la variable en elle-mme (la preuve : notre fonction utilise une variable $var alors qu'elle modifie tout de mme la valeur de la variable $toto du script courant) mais une rfrence vers la zone mmoire o est stocke la valeur de notre variable $toto.

2002 - 2007 lephpfacile.com - Page 3/4

2002 - 2007 lephpfacile.com - Page 4/4

header ("Content-type: image/png");

La librairie GD

// on dessine une image vide de 200 pixels sur 100 $image = @ImageCreate (200, 100) or die ("Erreur lors de la cration de l'image"); // on applique cette image une couleur de fond, les couleurs tant au format RVB, on aura donc ici une couleur rouge $couleur_fond = ImageColorAllocate ($image, 255, 0, 0); // on dessine notre image PNG ImagePng ($image); ?>

Nous allons donc voir dans ce tutorial comment faire des images dynamiques (c'est--dire qui changent suivant certains paramtres) grce PHP, qui les gnrera. La librairie GD peut tre schmatise par "un fichier" qui comporte de nombreuses fonctions permettant de travailler les images. Grce cette librairie, vous allez pouvoir modifier vos images, rcuprer des informations sur ces images, voir mme, crer vous-mme vos propres images. Avant de nous lancer dans la cration de superbes images, une petite vrification s'impose. En effet, si la libraire GD n'est pas installe sur votre serveur (votre hbergeur) cela ne sert rien de poursuivre ce tutorial, vu que les fonctions que nous allons utiliser ne seront pas actives. Pour savoir si la librairie GD est installe sur votre serveur, vous devez faire un phpinfo. Pour cela, crer un fichier, par exemple phpinfo.php, dans lequel vous allez placer le code suivant :

Et voila notre premire image gnre par PHP. Cependant, quelques explications sont ncessaires et extrmement importantes : - lorsque l'on cre une page WEB avec PHP, on n'est pas oblig de dire PHP que l'on cre une page WEB, en revanche, lorsque l'on cre une image, on est oblig de le spcifier avec l'instruction :

exemple1
<?php phpinfo(); ?>

exemple4
<?php header ("Content-type: image/png"); ?>

Ensuite, dans votre navigateur favori, affichez la page ainsi cre. Faites dfiler cette page jusqu'au moment o vous voyez quelque chose qui ressemble ceci : L, si comme ici, le GD Support est enabled, c'est tout bon, vous pouvez continuer la lecture de ce tutorial. Enfin sachez galement, que depuis la version 2.0 de la librairie, le format GIF n'est plus support, et il a t avantageusement remplac par le format PNG. Pour ceux qui n'ont pas la librairie installe, le seul remde est de demander gentiment leur hbergeur de l'installer :) Passons de suite la cration de notre premire image dynamique. Prenons par exemple le code suivant, trs basique, permettant l'affichage d'une image. On a par exemple une page que l'on nommera index.php, et qui contiendra : - l'appel la fonction ImageCreate nous retourne en fait une ressource ($image) correspondant l'image que nous sommes en train de crer. - nous faisons ensuite appel la fonction ImageColorAllocate qui a deux fonctions principales : premirement, elle cre une couleur stocke dans une variable pouvant tre rutilise ultrieurement (ici $couleur_fond), et deuximement, elle enregistre cette couleur dans la palette de l'image $image. Notez aussi, et c'est extrmement important, que cette couleur tant la premire couleur enregistre dans la palette, elle correspondra en fait la couleur de fond de notre image (en fait, la premire couleur enregistre dans la palette de couleur correspond la couleur de fond de l'image). - on utilise alors la fonction ImagePng pour afficher notre ressource, soit donc notre image ($image). - notez galement que si nous avions cr une image de type JPG, nous aurions utilis ici l'instruction ImageJpeg. Aprs ce premier exemple tout simple, vous devez srement vous dire qu'il n'y a rien de dynamique dans tout cela, et que votre Photoshop ferait bien mieux. A premire vue, oui. Mais vu que notre image est gnre par PHP, nous pouvons lui fournir des paramtres. Et l'avantage, il est l. C'est--dire que vous allez pouvoir crer des images diffrentes en fonction de certains paramtres. Reprenons alors le code de notre index.php, auquel nous allons greffer un petit formulaire permettant de choisir la couleur de notre image. On aura alors, par exemple (pour la page index.php) : - naturellement, si l'on dsire crer une image de type JPG, on prendra soin d'crire :

exemple5
<?php header ("Content-type: image/jpeg"); ?>

exemple2
<html> <head> <title>Notre page de test</title> </head> <body> <img src="./mon_image.php"> </body> </html>

Et vous notez que bien le lien vers notre image dsigne un fichier PHP. C'est tout fait normal, vu que c'est PHP qui va gnrer notre image. Voyons prsent le code de la page mon_image.php. Imaginons que l'on dsire dessiner un rectangle rouge (en fait nous n'allons pas dessiner un rectangle, nous allons en fait crer une image vide remplie avec de la couleur rouge). On aura alors (pour la page mon_image.php), le code suivant :

exemple3
<?php // on spcifie le type de document que l'on va crer (ici une image au format PNG

exemple6
<html> <head> <title>Notre page de test</title>

2002 - 2007 lephpfacile.com - Page 1/8

2002 - 2007 lephpfacile.com - Page 2/8

</head> <body> Slectionner l'intensit des diffrentes teintes :<br /> <form action="./mon_image.php" method="post"> Rouge (un nombre entre 0 et 255) : <input type="text" name="rouge"><br /> Vert (un nombre entre 0 et 255) : <input type="text" name="vert"><br /> Bleu (un nombre entre 0 et 255) : <input type="text" name="bleu"><br /> <input type="submit" value="Voir"> </form> </body> </html>

la plupart du temps par des visiteurs peu attentionns). Ne serait-il pas sympathique de pouvoir protger vos photos l'aide d'une petite incrustation permettant de "copyrighter" votre image ? Et bien c'est tout fait possible. Pour ce faire, voyons le code pour notre fichier PHP contenant le code gnrant cette image "copyrighte" (fichier mon_image.php par exemple) :

exemple8
<?php // on spcifie le type de fichier crer (ici une image de type jpeg) header ("Content-type: image/jpeg"); // on cre deux variables contenant les chemins d'accs nos deux fichiers : $fichier_source contenant le lien vers l'image "copyrighter", $fichier_copyright contenant le lien vers la petite vignette contenant le copyright (bien sur, on prendra soin de placer les images sources dans un rpertoire "cach" sinon le copyright ne sert rien si les visiteurs ont accs aux images sources) $fichier_source = "./gd.jpg"; $fichier_copyright = "./copyright.jpg"; // on cre nos deux ressources de type image (par le biais de la fonction ImageCreateFromJpeg) $im_source = ImageCreateFromJpeg ($fichier_source); $im_copyright = ImageCreateFromJpeg ($fichier_copyright); // on calcule la largeur de l'image qui va tre copyrighte $larg_destination = imagesx ($im_source); // on calcule la largeur de l'image correspondant la vignette de copyright $larg_copyright = imagesx ($im_copyright); // on calcule la hauteur de l'image correspondant la vignette de copyright $haut_copyright = imagesy ($im_copyright); // on calcule la position sur l'axe des abscisses de la vignette $x_destination_copyright = $larg_destination - $larg_copyright; // on ralise la superposition, le dernier paramtre tant le degr de transparence de la vignette (cependant, allez voir la fin de ce mme tutorial pour une dfinition complte de tous les arguments de cette fonction) @imageCopyMerge ($im_source, $im_copyright, $x_destination_copyright, 0, 0, 0, $larg_copyright, $haut_copyright, 70); // on affiche notre image copyrighte Imagejpeg ($im_source); ?>

Et prenons par exemple le code suivant pour la page mon_image.php (nous ne ferons pas ici la vrification des champs du formulaire : en effet, on supposera que l'utilisateur saisi bien chaque fois un nombre entre 0 et 255) :

exemple7
<?php // on teste nos 3 variables pour nos couleurs if (isset($_POST['rouge']) && isset($_POST['vert']) && isset($_POST['bleu'])) { // on spcifie le type de document que l'on va crer (ici une image au format PNG header ("Content-type: image/png"); // on dessine une image vide de 200 pixels sur 100 $image = @ImageCreate (200, 100) or die ("Erreur lors de la cration de l'image"); // on applique cette image une couleur de fond, les couleurs tant au format RVB, on obtiendra ici la couleur que l'utilisateur aura spcifi en paramtre du formulaire $couleur_fond = ImageColorAllocate ($image, $_POST['rouge'], $_POST['vert'], $_POST['bleu']); // on dessine notre image PNG ImagePng ($image); } else { echo 'Les variables du formulaire ne sont pas dclares.'; } ?>

Pas mal, non ? Maintenant que vous avez vu une premire approche de l'utilisation de cette librairie, un petit rappel est ncessaire. En effet, en rgle gnrale, lorsque l'on dessine en programmation, l'origine du repre reprsentant la position des pixels de notre image est situe dans le coin suprieur gauche de l'image. Cela diffre donc des repres classiques mathmatiques o l'origine du repre est toujours situ dans le coin infrieur gauche. Et ceci est trs important. En effet, pratiquement toutes les fonctions de cette librairie vous demanderont les coordonnes de diffrents points. Autant se mettre tout de suite en accord avec le systme. Conseil : Vu que l'axe des x est orient de la "gauche" vers la "droite", lorsque vous allez utiliser des fonctions permettant de dessiner des rectangles, des droites, etc, l'idal est de toujours fournir en arguments les coordonnes du point le plus gauche de votre figure, puis les coordonnes du point le plus droite. Aprs cette petite prcision, voici un autre exemple intressant de l'utilisation de la librairie GD. En effet, vous affichez parfois des images sur vos sites WEB, et beaucoup de vos photos partent dans la nature (pilles

Ensuite, afin de voir le rsultat, il suffit d'crire une page toute simple affichant l'image mon_image.php, avec une insertion d'image du genre (par exemple) :

exemple9
<img src="./mon_image.php">

Bien sur, pour rendre ce script vraiment dynamique, il suffit de passer l'image en paramtre le nom du fichier image "copyrighter". En effet, comme dans le premier exemple avec l'image basique, on peut faire un lien ressemblant :

exemple10

2002 - 2007 lephpfacile.com - Page 3/8

2002 - 2007 lephpfacile.com - Page 4/8

<img src="mon_image.php?fichier=toto.jpg">

$miniature = "mini_$Image"; // on cre notre miniature ImageJpeg ($im, $miniature); ?>

Et ensuite, dans le script mon_image.php, on rcupre la variable $_GET['fichier'] qui sera en fait le nom du fichier de l'image "copyrighter". Je vous fais confiance pour cette partie :) Voyons maintenant un autre exemple de l'utilisation de cette librairie : la cration de miniatures. En effet, vous voulez mettre vos photos en ligne, et jusqu'ici, vous faisiez vos miniatures la main : - c'tait long - pas toujours russi Et pourtant les miniatures sont extrmement pratiques pour afficher plus rapidement vos grandes images. En effet, il est toujours agrable de voir une liste de petites images (les miniatures) munies d'un lien permettant d'afficher ces mmes images dans leur taille originelle. Dtaillons maintenant le code permettant de crer vos miniatures. En revanche, ici, la diffrence des exemples prcdents, nous n'allons pas afficher la vole une image gnre par PHP. En effet, nous allons en fait crire un script PHP, qui, avec le lien vers une image de type JPG, va crer une miniature de cette mme image qui sera sauvegarde sur votre espace disque. Le nom de la miniature sera en fait le nom du fichier original, prcd de la mention mini_. On aura alors le code suivant pour ce script de cration de miniatures :

Et surtout, remarquez bien que nous n'avons pas utilis la fonction header. En effet, ici, on ne cherche pas "afficher" une image gnre la vole. Ce script inspecte en fait une image, et partir de celle-ci, il en cre une nouvelle. Pour voir le rsultat de cette opration, et donc voir votre miniature, vous devrez crer une page html contenant la balise suivante :

exemple12
<img src="mini_metaeffect_001.jpg ">

Enfin, afin d'accrotre vos talents de Picasso des temps modernes, voyons un dernier exemple : la cration d'un histogramme pour un script de statistiques par exemple. En effet, bon nombre de scripts de statistiques affichent la popularit de vos pages sur de jolis dessins. Et bien sachez que c'est possible de faire quelque chose d'quivalent l'aide de la librairie GD. Pour ce faire, je vous propose la cration d'un histogramme permettant d'afficher des "btons" reprsentants le nombre de pages vues de votre site sur une anne (un bton reprsentant un mois de l'anne). Pour ce faire, voici par exemple le code du script stats_year.php (il s'agira d'une image dynamique, cre la vole, l'utilisation d'un header sera donc ncessaire) :

exemple11
<?php // on donne PHP le lien vers notre image miniaturiser $Image = "metaeffect_001.jpg"; // on impose la taille de la largeur ou de la hauteur de la photo (le choix entre la largeur ou la hauteur se fait automatiquement, suivant que la photo est "horizontale" ou "verticale") $ratio = 150; // on cre une ressource reprsentant en fait l'image miniaturiser $src=imagecreatefromjpeg($Image); // on rcupre les paramtres de notre image (getimagesize est une fonction qui retourne un tableau contenant les paramtres d'une image : sa largeur, son hauteur, son type, etc...) $size = getimagesize($Image); // on test si la largeur de l'image est suprieur sa longueur if ($size[0] > $size[1]) { // on cre une ressource pour notre miniature $im=imagecreate(round(($ratio/$size[1])*$size[0]), $ratio); // on place dans la ressource que nous venons de crer une copie de l'image originelle, redimensionne et rechantillone imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$size[1])*$size[0]),$ratio, $size[0], $size[1]); } else { // si la largeur est infrieure ou gale la hauteur, on entre dans ce cas // on cre une ressource pour notre miniature $im=imagecreate($ratio, round(($ratio/$size[0])*$size[1])); // on place dans la ressource que nous venons de crer une copie de l'image originelle, redimensionne et rechantillone imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($size[1]*($ratio/$size[0])), $size[0], $size[1]); } // on dfinit le nom de notre miniature

exemple13
<?php // on dfinit un tableau contenant le nombre de page vues par mois : par exemple, on suppose que 1500 pages du site ont t vues en janvier, 2450 en fvrier, etc... Bien sur, pour que ce script soit vraiment valides, vous n'allez pas dclarer ce tableau, car sinon, les btons seront toujours les mmes :) Vous allez plutt effectuer une requte SQL sur votre base de donnes permettant de rcuprer le nombre de pages vues de votre site par mois. Ensuite, il suffira d'appeler le script avec ces 12 paramtres dans votre page html (en faisant par exemple : <img src="./images/stats_year.php?visite_par_mois[1]=1500.......">) $visite_par_mois[1]=1500; $visite_par_mois[2]=2450; $visite_par_mois[3]=800; $visite_par_mois[4]=1780; $visite_par_mois[5]=1900; $visite_par_mois[6]=2450; $visite_par_mois[7]=1684; $visite_par_mois[8]=1845; $visite_par_mois[9]=3450; $visite_par_mois[10]=980; $visite_par_mois[11]=1234; $visite_par_mois[12]=500; // on calcule le nombre de pages vues sur l'anne $max_visite = max($visite_par_mois); // on spcifie le type d'image que l'on va crer, ici ce sera une image au format PNG header ("Content-type: image/png"); // on dfinit la largeur et la hauteur de notre image $largeur = 550; $hauteur = 300; // on cre une ressource pour notre image qui aura comme largeur $largeur et $hauteur comme hauteur (on place galement un or die si la cration se passait mal afin d'avoir un petit message d'alerte)

2002 - 2007 lephpfacile.com - Page 5/8

2002 - 2007 lephpfacile.com - Page 6/8

$im = @ImageCreate ($largeur, $hauteur) or die ("Erreur lors de la cration de l'image") ; // on place tout d'abord la couleur blanche dans notre table des couleurs (je vous rappelle donc que le blanc sera notre couleur de fond pour cette image). $blanc = ImageColorAllocate ($im, 255, 255, 255); // on place aussi le noir dans notre palette, ainsi qu'un bleu fonc et un bleu clair $noir = ImageColorAllocate ($im, 0, 0, 0); $bleu_fonce = ImageColorAllocate ($im, 75, 130, 195); $bleu_clair = ImageColorAllocate ($im, 95, 160, 240); // on dessine un trait horizontal pour reprsenter l'axe du temps ImageLine ($im, 20, $hauteur-40, $largeur-15, $hauteur-40, $noir); // on affiche le numro des 12 mois for ($i=1; $i<=12; $i++) { if ($i==1) { ImageString ($im, 2, 42, $hauteur-38, $i, $noir); } else { ImageString ($im, 2, ($i)*42, $hauteur-38, $i, $noir); } } // on dessine un trait vertical pour reprsenter le nombre de pages vues ImageLine ($im, 20, 30, 20, $hauteur-40, $noir); // on affiche les legendes sur les deux axes ainsi que diffrents textes (note : pour que le script trouve la police verdana, vous devrez placer la police verdana dans un repertoire /fonts/) imagettftext($im, 14, 0, $largeur-70, $hauteur-10, $noir, "./fonts/verdana.ttf", "Mois") ; imagettftext($im, 14, 0, 10, 20, $noir, "./fonts/verdana.ttf", "Nb. de pages vues"); imagettftext($im, 14, 0, $largeur-250, 20, $noir, "./fonts/verdana.ttf", "Statistiques pour l'anne 2003"); // on parcourt les douze mois de l'anne for ($mois=1; $mois <= 12; $mois++) { if ($visite_par_mois[$mois]!="0") { // on calcule la hauteur du baton $hauteurImageRectangle = ceil(((($visite_par_mois[$mois])*($hauteur-50))/ $max_visite)); if ($mois=="1") { // si le mois est janvier, on affiche notre premier baton // on affiche le premier baton noir ImageFilledRectangle ($im, 42, $hauteur-$hauteurImageRectangle, 42+14, $hauteur -41, $noir); // on affiche le second baton, bleu fonc, qui sera un peu plus petit que le noir afin de recouvrir une partie du noir ImageFilledRectangle ($im, 44, $hauteur-$hauteurImageRectangle+2, 42+12, $hauteur-41-1, $bleu_fonce); // on affiche le dernier baton, bleu clair, qui sera un peu plus petit que le bleu fonc afin de recouvrir une partie du bleu fonc (on obtiendra ainsi un effet de dgrad) ImageFilledRectangle ($im, 48, $hauteur-$hauteurImageRectangle+2, 42+8, $hauteur-41-1, $bleu_clair); } else { // si le mois est different de janvier, on affiche les autres batons ImageFilledRectangle ($im, ($mois)*42, $hauteur-$hauteurImageRectangle, ($mois) *42+14, $hauteur-41, $noir); ImageFilledRectangle ($im, ($mois)*42+2, $hauteur-$hauteurImageRectangle+2, ( $mois)*42+12, $hauteur-41-1, $bleu_fonce); ImageFilledRectangle ($im, ($mois)*42+6, $hauteur-$hauteurImageRectangle+2, (

$mois)*42+8, $hauteur-41-1, $bleu_clair); } } } // on dessine le tout Imagepng ($im); ?>

Vous noterez quelque chose de trs important : en effet, pour faire les dgrads sur les btons, nous avons en fait dessin plusieurs rectangles les uns sur les autres (et donc des rectangles de plus en plus petits). En effet, on a utilis GD comme si on utilisait un logiciel de dessin. En clair, quand on dessine par-dessus quelque chose, et bien ce quelque chose disparat au profit de la nouvelle forme que l'on vient de dessiner (tout comme des calques sous Photoshop). Aller hop, vos pinceaux maintenant, et surtout n'oubliez pas d'aller jeter un coup d'oeil sur le manuel PHP afin de dcouvrir toutes les descriptions des instructions utilises dans ce cours.
Auteur : LA GLOBULE Dernire rvision du cours : le 30/05/2007 00:18

2002 - 2007 lephpfacile.com - Page 7/8

2002 - 2007 lephpfacile.com - Page 8/8

Les expressions rgulires

? indiquera que le caractre (ou la suite de caractres) qui le prcde ne pourra apparatre soit, aucune fois, soit une et une seule fois. Voyons alors quelques exemples : ab* : identifie une chane de caractre contenant un a suivi d'un ou d'aucun b (par exemple, les chanes "a", "ab", "abbb" respectent ce modle)ab+ : identifie une chane de caractre contenant un a suivi d'au moins un b (par exemple, les chanes "ab", "abb", "abbb" respectent ce modle)ab? : identifie une chane de caractre contenant un a suivi d'un ou d'aucun b (par exemple, les chanes "a", "ab" respectent ce modle, alors que "abb" ne le respecte pas)a?b+$ : identifie une chane de caractres compose d'aucun ou d'un seul a, suivi d'un ou de plusieurs b, le tout tant situ la fin de la chane Les accolades {} Par extensions aux symboles prcdents, vous pouvez galement des limites qui s'utilisent l'intrieur d'accolades et qui indiquent le nombre d'occurrence de la chane recherche. De mme, comme pour les symboles *, + et ?; elles affectent l'lment qui les prcde. Voyons tout de suite des exemples : ab{2} : identifie une chane de caractre compose d'un a suivit d'exactement deux b (en clair, seule la chane "abb" passe travers ce modle)ab{2,} : identifie une chane de caractre compose d'un a suivi d'au moins deux b (par exmple, "abb" ou "abbb" respectent ce modle)ab{3,5} : identifie une chane de caractre compose d'un a suivi de trois cinq b ("abbb", "abbbb" et "abbbbb" sont les seules chanes qui respectent ce modle) Sachez que vous devez toujours indiquer le premier chiffre dans vos accolades, alors que le second n'est pas obligatoire. Vous pouvez galement remarquer que l'on peut retrouver la fonction des symboles *, + et ? avec des limites appropries. En effet, le symbole : * correspond en fait la limite {0,}+ correspond en fait la limite {1,}? correspond en fait la limite {0,1} Les parenthses Afin de quantifier une chane de caractres, vous devez utiliser des parenthses.

Maintenant que nous avons une certaine assurance avec PHP, il serait grand temps de commencer rflchir aux expressions rgulires. En effet, les expressions rgulires vous permettront d'analyser diffrentes chanes de caractres (principalement saisies par un client dans un formulaire) et ainsi vrifier que la chane correspond bien ce que l'on demande. De plus, les expressions ne servent pas qu' la vrification de la "conformit" d'une chane de caractre, puisqu'elles vont permettront galement d'amliorer grandement l'utilisation de votre site. Les expressions rgulires ont t empruntes au systme POSIX. De nombreux scripts Perl les utilisent galement. Il s'agit d'un systme extrmement ingnieux permettant de retrouver un mot, voir mme une phrase complte (d'une certaine forme) dans un texte, suivant un modle que l'on aura dfini, le pattern. Par exemple, l'aide des expressions rgulires, vous pourrez facilement vrifier l'adresse email qu'un visiteur dans un champs d'un formulaire de votre site (ceci en testant l'allure de la chane de caractre saisie par ce client : on testera entre autre si il y a bien un @ dans cette chane de caractres, mais juste un seul, que la chane qui suit ce @ est bien un nom de domaine, et que la chane qui prcde le @ est bien un identifiant valide, c'est--dire sans caractres interdits, etc...). Ou encore, avec les expressions rgulires, vous pourrez intgrer dans votre script de news (ou pourquoi pas mme votre forum) un systme analysant la chane de caractre de votre news (de vos messages du forum) en y recherchant des URL, et si elles sont prsentes dans votre chane, et bien de faire un lien vers cette URL, et ce, tout automatiquement. Pour la suite du cours, je vais vous parlez seulement des modles (pattern). Ce sont ces modles, qui sont en fait des sortes de masques que l'on applique sur une chane de caractres ou un texte pour trouver une suite de caractres bien prcise. Par la suite, il existe diverses fonctions utilisant ces modles afin d'isoler ces suites de caractres, et d'agir sur eux, et je vous renvoies donc la documentation pour les tudier (je vous rappelle que ce n'est pas de la fainantise de ma part de ne pas vous parler de ces fonction, mais il y en a tellement, que le cours serait gigantesque ; et de plus, si vous arriver crer vos propres modles, vous n'aurez aucun mal utiliser ces fonctions avec ces modles). Les symboles ^ et $ Dans une expression rgulire, le symbole ^ reprsente le dbut d'un modle, et le symbole $ reprsente la fin d'un modle. Voyons de suite quelques exemples : ^La globule : identifie une chane de caractres qui commence par "La globule"enfin$ : identifie une chane de caractres qui se finit par "enfin"^mot$ : identifie une chane de caractres qui commence par "mot" et qui fini par "mot", il s'agit donc de la chane de caractres "mot" elle-mmetest: identifie une chane de caractres qui contient le mot "test" Jusque l, tout va bien. En effet, vous pouvez remarquer que si vous n'employer ni ^ ni $ (dernier exemple), cela implique que votre modle peut se reproduire n'importe o l'intrieur de votre chane de caractres, puisque le modle n'est ni coll au dbut de la chane (on utilise pas de ^) ni la fin de la chane (on utilise pas de $). Les symboles *, + et ? Dans les expressions rgulires, les symboles *, + et ? servent indiquer le nombre de fois qu'un caractre ou une suite de caractres puisse apparatre. En effet, ces symboles agissent sur les lments (un caractre ou bien une suite de caractres) qui les prcdent. * indiquera que le caractre (ou la suite de caractres) qui le prcde ne pourra apparatre que soit, aucune fois, soit plusieurs fois. + indiquera que le caractre (ou la suite de caractres) qui le prcde ne pourra apparatre soit, une fois, soit plusieurs fois.

Les exemples tant beaucoup plus parlant que du bla-bla, voici quelques exemples : a(bc)* : identifie une chane de caractres commenant par un a suivi d'aucune ou de plusieurs squence de caractres "bc"a(bc){1,5}* : identifie une chane de caractres commencant par un a suivi d'une cinq fois la squence de caractres "bc" Le symbole | Le symbole | fonctionne comme l'oprateur boolen OU. Voyons quelques exemples : toto|titi : identifie une chane de caractres contenant le mot "toto" ou le mot "titi" (b|cd)ef : identifie une chane de caractres qui contient la squence de caractres "bef" ou bien la squence de caractres "cdef" (a|b)*c : indentifie une chane de caractres qui contient une alternance de a et de b, chane se terminant par un c ("bababbbaac" respecte ce modle, tout comme "c", "bc" par exemple) Le symbole . Le symbole . (le point) reprsente n'importe quel caractre unique. Exemple : ^.{3,}$ : identifie une chane de caractres comportant exactement trois caractres Les crochets [] Les expressions entre crochets ( []) indiquent les caractres qui sont permis un endroit prcis d'un modle. Les exemples : [ab] : identifie une chane de caractres contenant un "a" ou un "b" (ce qui revient au mme d'crire le modle a|b) [a-d] : identifie une chane de caractres qui contient les lettres minuscules comprises entre le "a" et le "d" (ce qui quivalent de a|b|c|d ou de [abcd])^[a-zA-Z] : identifie une chane de caractres qui commence par une lettre minuscules ou bien par une lettre majuscule [0-9]% : identifie une chane de caractres qui contient un pourcentage un seul chiffre,[a-zA-Z0-9]$ : identifie une chane de caractres qui finit par une virgule suivi d'un caractre (lettre ou chiffre) Note 1 : Vous pouvez galement lister les caractres que vous ne voulez pas en utilisant le symbole ^ comme premier symbole dans vos crochets.

2002 - 2007 lephpfacile.com - Page 1/3

2002 - 2007 lephpfacile.com - Page 2/3

Exemple : %[^a-zA-Z]% : identifie une chane de caractres avec un caractre qui n'est pas une lettre (soit en fait un chiffre ou autres chose, mais pas une lettre) entre deux signes pourcentage Note 2 : Pour utiliser les caractres ^, ., [, $, (, ), |, *, +, {, dans vos expressions rgulires, vous devrez les protger avec un \ juste avant ceux-ci (car en effet, ces caractres ont une signification spciale, et donc pour pouvoir les utiliser, il faut les protger). Sous - note : N'oubliez pas que les expressions entre crochets sont une exception cette rgle. En effet l'intrieur des crochets, tous les caractres spciaux, y compris l'antislash , perdent leurs puissances spciales (en clair, dans les crochets, vous ne devez pas protger les caractres spciaux avec un \). Enfin !!! A premire vue, les expressions rgulires ne sont pas simple d'utilisation, mais croyez moi, elles sont extrmement puissantes. Et maintenant que vous tes familier avec les modles, pourquoi ne pas aller faire un tour du ct de la documentation, afin de voir avec quelles fonctions s'utilisent ces prcieuses expressions rgulires ? Ce tutorial est fini, pour votre plus grande joie, ainsi que la mienne :)
Auteur : LA GLOBULE Dernire rvision du cours : le 30/05/2007 00:19

2002 - 2007 lephpfacile.com - Page 3/3

La programmation objet (concepts fondamentaux)

Les modifications que nous avons apportes notre application de mdiathque, nous permettent de penser qu'une approche objet sera beaucoup plus avantageuse quant la rutilisation du code dj crit. Mais qu'est ce qu'un objet ?

En programmation, un modle est une abstraction de la ralit. Par consquent, un modle est une vue subjective de la ralit, mais toutefois, cette vue est toujours pertinente. En effet, un modle dfinit une frontire entre la ralit et la perspective de l'observateur. Il ne s'agit donc pas de la ralit, mais d'une vue trs subjective de la ralit. Par consquent, un modle doit permettre de faciliter la comprhension d'un systme tudie, mais aussi, de simuler ce systme. Aujourd'hui, en programmation, il existe deux principaux modle de reprsentation du monde : le modle fonctionnel (que vous connaissez dj) et le modle objet (que nous allons donc tudier). Jusqu' aujourd'hui, vous connaissiez la programmation en PHP avec une approche fonctionnelle. Afin de mieux comprendre les diffrences entre ces deux approches, nous allons donc dtailler les deux approches, et voir ainsi leurs avantages et leurs inconvnients. Avec une approche fonctionnelle, vos programmes taient composs d'une srie de fonctions, qui ensemble, assuraient certains services. Il s'agit d'une approche logique, cohrente et intuitive de la programmation. Cette approche a un avantage certain que l'on appelle la factorisation des comportements. En effet, une dcoupe fonctionnelle intelligente consiste factoriser certains comportements d'une application, ce qui veut dire que pour crer une fonction d'une application, rien ne vous empche d'utiliser un autre ensemble de fonctions (qui sont donc dj crites). Mais (il y a toujours un mais ^^), l'approche fonctionnelle a aussi ses dfauts, comme par exemple une maintenance complexe en cas d'volution de votre application. La factorisation des comportements n'a pas que des avantages. En effet, si on y rflchit deux minutes, maintenant, nos fonctions sont devenues interdpendantes. Et ceci implique qu'une simple mise jour de l'application un point donn peut impacter en cascade sur d'autres fonctions de notre application. Naturellement, nous pouvons toujours essayer d'crire des fonctions les plus gnriques possibles mais cela rend le dveloppement de l'application beaucoup plus complexe. De plus, en cas d'volution de l'application, mme si la structure gnrale de l'application reste valide, la multiplication des points de maintenance (dus au chanage des fonctions cause de la factorisation des comportements) rend l'adaptation extrmement difficile. Et dans ce cas, l'application sera alors retouche dans sa globalit. Prenons un exemple concret : on a en notre possession une application permettant de grer une bibliothque, et suite la demande du client, notre application doit maintenant tre capable de grer une mdiathque, c'est--dire que l'on pourra emprunter, non seulement des livres, mais aussi, des CD-ROM, des DVD, etc... Pour faire voluer notre application, nous devrons faire voluer les structures de donnes qui sont manipules par les fonctions, puis nous devrons adapter les traitements, qui l'origine, ne manipulaient qu'un seul type de document : les livres. Nous devrons donc faire voluer toutes les portions de code qui utilisent la base documentaire, et ce, afin de grer les donnes et les actions propres aux diffrents type de documents. Exemple : notre application, alors qu'elle ne grait que des livres, pouvait mettre une sorte de carton jaune un emprunteur lorsqu'il ne rendait pas son livre dans les temps. Or, maintenant que notre bibliothque est devenue une mdiathque, et si l'on dsire que le dlai avant le fameux carton jaune dpende du document emprunt (le carton jaune arrivera plus ou moins tard, suivant le document emprunt : un livre, un CD-ROM, un DVD, etc...), et bien il va falloir prvoir une rgle de calcul pour chaque type de document. Au final, c'est pratiquement la totalit de l'application qu'il va falloir adapter pour grer les nouveaux types de documents et les traitements correspondants.

Un objet est une entit comportant des frontires prcises et qui possde une identit (un nom). De plus, un ensemble d'attributs caractrisent l'tat d'un objet, et l'on dispose d'un ensemble d'oprations (les mthodes) qui permettent d'agir sur le comportement de notre objet. Un objet est l'instance d'une classe, et une classe, est un type de donnes abstrait, caractris par des proprits (ses attributs et ses mthodes) communes des objets et elle permet de crer des objets possdant ces proprits. Exemple : prenons le cas de notre bibliothque. Crons alors une classe Livre qui va nous permettre de crer des objets "Livre". Et une instance de la classe Livre (un objet). titre et auteur sont les attributs de notre classe, c'est--dire les caractristiques communes tous nos objets "Livre". En clair, tous les livres auront un titre et un auteur. De plus, notre classe dispose des mthodes emprunter() et rendre() qui s'appliquerons nos objets "Livre" (on agira alors directement sur notre objet "Livre"). monLivre reprsente quant lui, une instance de la classe Livre, il s'agit donc d'un objet qui porte le nom monLivre. Les autres concepts importants de l'approche objet sont : - l'encapsulation - l'hritage (ainsi que le polymorphisme) - l'agrgation L'encapsulation consiste masquer les dtails d'implmentation d'un objet, et ce, en dfinissant une interface. En clair, vous n'avez pas besoin de savoir comment est conu cet objet la base pour pouvoir l'utiliser. Une interface est quant elle, une vue externe d'un objet et elle dfinit les services accessibles pour modifier le comportement de l'objet. L'encapsulation facilite l'volution d'une application car elle stabilise l'volution des objets. En effet, bous pouvons trs bien modifier l'implmentation des attributs d'un objet sans pour autant modifier son interface. Elle garantit de plus l'intgrit des donnes vu qu'elle permet d'interdire l'accs direct aux attributs des objets (on doit alors passer par des assesseurs). Un assesseur tant une mthode d'accs pour connatre ou modifier la valeur d'un attribut d'un objet. L'hritage est un mcanisme de transmission des proprits d'une classe (ses attributs et ses mthodes) vers une sous-classe (la sous-classe hritant de la classe principale). Grce l'hritage, une classe peut aussi tre spcialise en d'autres classes, afin d'y ajouter des caractristiques spcifiques (ajout de mthodes par exemple) ou d'en adapter certaines. Plusieurs classes peuvent aussi tre gnralises en une classe qui les factorise, et ce, afin de regrouper les caractristiques communes d'un ensemble de classes. La spcialisation et la gnralisation permettent de construire des hirarchies de classes. L'avantage principal de l'hritage est qu'il vous permet de d'viter la duplication de code, et il encourage la rutilisation de mme code. La classe Livre hrite des proprits de la classe Document. Ce qui veut dire que les objets Livre auront un auteur, un diteur, mais aussi un numro et un titre. De plus, comme on peut emprunter() ou rendre() un document, on pourra galement emprunter() et rendre() un livre (ceci, parce que la classe Livre hrite de la classe Document). On pourra galement lire() ou photocopier() un livre. En revanche, un document n'aura pas d'auteur ni d'diteur, et on ne pourra pas le lire, ni mme le photocopier (ces proprits font partie de la classe Livre, or un document n'est pas un livre : c'est un livre qui est un document, et non l'inverse). Quand au polymorphisme, celui-ci reprsente la facult d'une mthode pouvoir s'appliquer des objets de classes diffrentes. Il augmente donc la gnricit de votre code. Chacune des trois classes (Voiture, Train et Avion) hritent des mthodes de la classe Vhicule. Ces trois classes, auront donc accs la mthode deplacer() de la classe Vhicule. Or, dans ces trois "sous classes", nous avons choisit de redfinir la mthode deplacer() de la classe Vhicule.

2002 - 2007 lephpfacile.com - Page 1/3

2002 - 2007 lephpfacile.com - Page 2/3

Nous adaptons en fait cette mthode suivant l'objet que nous tudions (un avion se dplace dans les airs, un train sur des rails et une voiture sur la route). L'agrgation constitue une relation entre deux classes, spcifiant que les objets d'une classe sont des composants de l'autre classe. Une relation d'agrgation permet donc de dfinir des objets composs d'autres objets. L'agrgation permet d'assembler des objets de base, afin de construire des objets plus complexes. Notre objet eau de type molcule est en fait une combinaison de trois objets : - hydrogene1 qui est un objet de la classe atome (c'est une instance de la classe atome). - hydrogene2 qui est un objet de la classe atome (c'est une instance de la classe atome). - oxygene qui est un objet de la classe atome (c'est une instance de la classe atome). Notre molcule est donc compose de trois atomes : hydrogene1, hydrogene2 et oxygene. En conclusion, vous devez savoir que le concept objet est un concept stable et prouv. C'est un concept ancien (Simula, le premier langage de programmation implmenter le concept de type abstrait l'aide de classe date de 1967), mais il n'a jamais t autant d'actualit. A cela, deux raisons principales : - l'approche fonctionnelle n'est pas adapte au dveloppement d'applications qui voluent sans cesse et dont la complexit croit continuellement (plusieurs dizaines de milliers de lignes de code). - l'approche objet a t invente pour faciliter l'volution d'applications complexes. De nos jours, les outils orients objets sont fiables et performants (les compilateurs C++ par exemple produisent un code robuste et optimis). Mais, malgr les apparences, il est beaucoup plus naturel pour nous, tres humains, de dcomposer un problme informatique sous forme d'une hirarchie de fonctions atomiques et de donnes, qu'en terme d'objets et d'interaction entre ces objets. De plus, le vocabulaire prcis est souvent un facteur d'chec important dans la mise en oeuvre d'une approche objet. C'est pour cela qu'il faut penser objet des le dpart, au lieu d'essayer de convertir une srie de fonction en une classe.
Auteur : LA GLOBULE Dernire rvision du cours : le 30/05/2007 00:23

2002 - 2007 lephpfacile.com - Page 3/3

La programmation objet (premire approche)

Nous verrons par la suite que cet oprateur nous permet galement d'appliquer les mthodes de la classe sur notre objet. Vous vous doutez bien qu' ce niveau l, aucun mail n'a t envoy :) Cependant, vous pouvez vrifier que notre objet possde bien les attributs que nous lui avons fourni en faisant des :

Apres avoir vu les concepts fondamentaux de la programmation objet, attardons nous sur la programmation objet vu du ct de PHP. Pour cela, je vous propose de raliser notre premier classe : une classe qui vous servira envoyer des mails. Jusqu' prsent, pour envoyer des mails, vous deviez recopier toujours le mme code avec des en-ttes n'en plus finir. Tout ceci sera fini avec votre classe d'envois de mails : vous crirez une fois pour toute votre code, et ensuite, vous rutiliserez ce mme code chaque fois que vous aurez l'envie envoyer des mails. Afin de commencer sur de bonnes bases, je vous conseille de stocker votre classe de mails dans un fichier PHP, comme par exemple sendmail.class.php, puis d'include ce fichier dans vos scripts lorsque vous en aurez besoin. Attaquons tout de suite le code de notre classe ! Voici les premires lignes de code de notre classe :

exemple3
<?php echo $message->destinataire; // retournera : toto@toto.com echo $message->objet; // retournera : Scoop mondial ! echo $message->texte; // retournera : mon premier mail utilisant une classe mail :) ?>

Pour envoyer notre mail, nous allons crire une mthode pour notre classe qui utilisera la fonction mail de PHP ainsi que les attributs de notre objet. On aura alors (pour notre classe) :

exemple4
<?php class SendMail { var $destinataire; var $objet; var $texte; function envoyer() { mail ($this->destinataire, $this->objet, $this->texte); } } ?>

exemple1
<?php class SendMail { var $destinataire; var $objet; var $texte; } ?>

Comme vous le voyez, la dclaration d'une classe en PHP dmarre par le mot cl class suivi du nom de la classe. Nous ouvrons alors une accolade ouvrante qui dlimite le dbut de la dclaration des mthodes et des attributs de la classe (la dclaration de la classe se terminant avec une accolade fermante). Ensuite, nous joignons 3 variables notre classe : $destinataire, $objet et $texte. Ces 3 variables sont en fait les caractristiques communes des objets (les attributs) que nous allons pouvoir crer grce notre classe. Noter que l'on dclare ces attributs avec le mot rserv var. En clair, cela veut dire que tous les objets que nous allons crer avec cette classe (des mails en l'occurrence) auront toujours un destinataire, un objet et un texte. Vous pouvez dclarer autant d'attributs de classe que vous le souhaitez. Premier exemple d'utilisation :

Dtaillons la mthode envoyer(). Notre mthode utilise la fonction de mail de PHP, et elle prend en argument les valeurs des attributs de notre classe. Cependant, remarquez l'utilisation de $this. $this indique l'instance courante de notre classe. Cet objet reprsente donc notre objet $message que nous utilisons dans notre script. Vous pouvez crire autant de mthodes que vous le souhaitez pour votre classe. Cependant, sachez que vous ne pouvez crire qu'une seule mthode ayant le mme nom que le nom de votre classe (il s'agit en fait du constructeur de la classe qui a un rle particulier au sein de la classe, nous le dtaillerons plus tard). Envoyons maintenant notre mail grce notre mthode envoyer() :

exemple2
<?php // on inclut le code de notre classe include ("./sendmail.class.php"); // on dclare notre objet (en fait, dans le langage objet, on dit que l'on cre une instance de la classe SendMail) $message = new SendMail (); // on affecte des valeurs aux attributs de notre objet $message->destinataire = "toto@toto.com"; $message->objet = "Scoop mondial !"; $message->texte = "Voici mon premier mail utilisant une classe mail :)"; ?>

exemple5
<?php include ("./sendmail.class.php"); $message = new SendMail (); $message->destinataire = "toto@toto.com"; $message->objet = "Scoop mondial !"; $message->texte = "Voici mon premier mail utilisant une classe mail :)"; // on applique la mthode envoyer() notre objet $message grce l'oprateur -> $message->envoyer(); ?>

Noter l'utilisation de l'oprateur -> qui permet d'affecter des valeurs aux attributs de notre objet.

Plutt pratique non ? :) En effet, la programmation par objet a cet avantage indniable, c'est que vous n'ts pas obliger de comprendre

2002 - 2007 lephpfacile.com - Page 1/4

2002 - 2007 lephpfacile.com - Page 2/4

comment fonctionne une classe. Du moment que vous savez quoi servent vos mthodes (leur rle), vous pouvez les utiliser sans comprendre ce qu'il se passe derrire (le code de la classe en elle-mme). Mais vous pouvez aussi rutilisez vos classes dans d'autres scripts (ce qui reste l'avantage principal de cette forme de programmation). Voyons maintenant le constructeur d'une classe. En effet, toute classe contient une mthode dite "constructeur" et cette mthode a toujours le mme nom que le nom de la classe en question. Sans le savoir, lorsque vous avez crit le code : } ?>

mail ($this->destinataire, $this->objet, $this->texte, $this->entete); }

Vous remarquerez alors que grce notre constructeur, nous allons pouvoir rapidement crer des mails au format texte ou bien au format html. Exemple :

exemple8
<?php include ("./sendmail.class.php"); // $message sera un mail au format texte $message = new SendMail (); // $message2 sera un mail au format texte $message2 = new SendMail ("texte"); // $message3 sera un mail au format html $message3 = new SendMail ("html"); ?>

exemple6
<?php message = new SendMail (); ?>

Et bien vous avez appel le constructeur par dfaut de la classe SendMail. Cependant, comme vous l'avez remarqu, notre classe SendMail ne comporte pas de mthode SendMail() (le constructeur d'une classe est la mthode de cette classe qui porte le mme nom que le nom de la classe), et bien dans ce cas, PHP utilise un constructeur par dfaut qui n'affecte en rien sur les proprits de notre objet. Toutefois, vous pouvez vous-mme crire un constructeur dans votre classe. Mais il faut savoir que le code que vous allez mettre dans votre constructeur va se rpercuter sur tous les objets qui seront instances de votre classe. Prenons un exemple simple : Imaginer que vous ayez une classe Bonhomme. Un des attributs de cette classe serait $nom, reprsentant le nom de notre bonhomme. Si vous instancier votre classe simplement (en faisant donc un new Bonhomme() tout simple) alors que vous n'avez pas spcifi de constructeur, PHP va vous crer un Bonhomme sans nom (l'attribut $nom de notre objet sera vide). Cependant, vous pouvez trs bien crire vous-mme votre propre constructeur pour donner un nom votre Bonhomme ds sa cration. Revenons alors notre classe SendMail, et nous allons lui spcifier un constructeur qui va permettre de dfinir si le mail envoy sera au format texte ou html. On aura alors :

En rsum, le constructeur de la classe sert souvent initialiser certains attributs des objets cres partir de la classe. Attention, une classe ne peut contenir qu'un seul constructeur. Ce cours vous a donc prsent quelques rudiments de la programmation par objet en PHP, cependant, vous avez du remarquez que contrairement au premier cours (les concepts fondamentaux), de nombreux concepts n'ont pas ts traits ici. Ces concepts seront traits dans un futur cours afin de ne pas trop vous embrouillez les ides : trop de notions nouvelles d'un coup peut nuire la comprhension de cette forme de programmation dj bien complexe.
Auteur : LA GLOBULE Dernire rvision du cours : le 30/05/2007 00:22

exemple7
<?php class SendMail { var $destinataire; var $objet; var $texte; // on ajoute un attribut $entete notre classe var $entete; // le constructeur de notre classe qui prend un paramtre function SendMail ($type = "texte") { if ($type == "texte") { $this->entete = "Content-type: text/plain; charset=iso-8859-1n"; } elseif ($type == "html") { $this->entete = "Content-type: text/html; charset=iso-8859-1n"; } } function envoyer() {

2002 - 2007 lephpfacile.com - Page 3/4

2002 - 2007 lephpfacile.com - Page 4/4

Exemple :

Les variables dynamiques

exemple3
<?php $tableau1 = array ('test', 'toto', 'titi'); $tableau2 = array ('humpf', 'grmbl'); $var = 'tableau1'; $nb_elements = count (${$var}); for ($i=0; $i<$nb_elements; $i++) { // on accede aux lments du tableau $tableau1 echo ${$var}[$i].'<br />'; } ?>

Cela ne vous est jamais arriv de vous demander si il tait possible de crer des variables dynamiques ? C'est dire des variables ayant un nom changeant au cours du script ? Et bien c'est tout fait possible de faire ceci en PHP. En effet, grce aux variables dynamiques vous allez pouvoir utiliser des noms de variables qui sont eux mmes (les noms), variables, ce qui veut dire que vous allez utiliser des noms de variables qui sont affects et utiliss dynamiquement dans votre script. D'aprs ce que l'on vient dire, une variable dynamique serait alors une variable qui aurait comme nom la valeur d'une variable, par exemple $var. En effet, si nous dfinissons la variable $hello, avec en valeur la chane de caractres Coucou, on aurait la chose suivante :

Ce qui affichera donc : test toto titi

exemple1
<?php $var = 'hello'; $hello = 'Coucou'; echo ${$var}; ?>

L'exemple peut vous paratre un peu bte, mais regardez le de plus prs : en effet, si nous dcidons du jour au lendemain de changer le nom de notre tableau (afin de parser un autre tableau), nous n'aurons qu'une seule ligne modifier :

Qui affichera : Coucou

exemple4
<?php $var = 'tableau1'; ?>

C'est dire la valeur de la variable $hello. En utilisant le code : (On aurait en fait crit le nom d'un nouveau nom de tableau) Alors qu'en n'utilisant pas les variables dynamiques, nous aurions du modifier cette mme ligne, mais aussi la ligne concernant le comptage du nombre d'lment de notre tableau mais aussi la ligne contenue dans notre boucle for (le echo). Les variables apportent alors leur lot d'avantages : - la clart du code - du code dynamique rutilisable - des solutions des problmes lis la dynamique d'un script (comme par exemple gnr un formulaire contenant un nombre indfini de champs) Avant de poursuivre ce cours, sachez galement que le nombre de variables dynamiques utilises est thoriquement sans limites. Vous pouvez trs bien faire, par exemple :

exemple2
<?php $var ='hello'; $hello = 'Coucou'; echo $hello; ?>

Nous aurions eu exactement le mme rsultat. Vous remarquez alors au passage le fonctionnement d'une variable dynamique : - on initialise une variable ayant une certaine valeur - on veut utiliser une autre variable ayant comme nom la valeur de notre variable prcdente : pour cela, nous dclarons notre variable avec un $, puis avec l'intitul de notre variable prcdent entre deux crochets, ce qui donne : ${$var} Malgr, cette brve description des variables dynamiques, j ai comme l'impression que vous n'tes pas du tout convaincu. Mais quoi bon peuvent elles bien servir ces variables dynamiques ? Tout simplement faire du dynamique :) Imaginons que l'on ai dans notre script PHP deux variables de type tableau (ou array) et que l'on dsire accder l'un de ces tableaux. Au lieu de faire des tests fous pour savoir quel tableau on veut accder, il nous suffit de crer une variable de type chane de caractres contenant le nom de notre tableau (celui que l'on dsire parcourir) et d'utiliser une variable dynamique pour accder notre tableau.

exemple5
<?php $var = 'toto'; $toto = 'test'; $test = 'humpf'; echo ${${$var}}; ?>

Ce qui affichera : Humpf

2002 - 2007 lephpfacile.com - Page 1/4

2002 - 2007 lephpfacile.com - Page 2/4

Voyons maintenant un cas concret sur lequel il est intressant d'utiliser les variables dynamiques. Imaginez que vous ayez un formulaire, et dans la page de traitement de ce formulaire, plusieurs actions sont possibles. Jusqu' prsent, pour faire votre page de traitement, vous deviez enchaner une srie de if elseif else (ou mme mieux en utilisant un case) afin de savoir dans quel cas vous vous trouv, et de plus, vous deviez crire un bon paquet de ligne de code pour dcrire chaque action. Tout ceci peut-tre largement simplifi grce aux variables dynamiques. En effet, imaginons que notre formulaire contienne un champ cach contenant une des valeurs suivantes (au choix) : - insert - delete - update - select Voici alors le code d'une page de traitement possible de ce formulaire : }

for ($i=1; $i<=$_POST['nb_champs']; $i++){ $dynamique = 'champs_'.$i; $value = $_POST[$dynamique]; echo 'Valeur du champ '.$i.' : '.$value.'<br />'; } // sinon on affiche le formulaire avec la possibilit d'ajout des champs au formulaire else{ // on dfini le nombre initial de champs if (!isset($_POST['nb_champs'])){ $_POST['nb_champs'] = 1; } // si la personne clic sur "un champs en +", on ajoute un champs if (isset($_POST['submit']) && $_POST['submit'] == "Un champs en +"){ $_POST['nb_champs']++; } // on affiche le formulaire echo '<FORM METHOD="post">'; // on place un champ cach contenant un entier ayant comme valeur le nombre de champs du formulaire echo '<INPUT TYPE="hidden" NAME="nb_champs" VALUE="'.$_POST['nb_champs'].'">'; // on affiche tous les champs du formulaire for ($i=1; $i<=$_POST['nb_champs']; $i++){ echo '<INPUT TYPE="text" name="champs_'.$i.'"><br />'; } // on place un bouton permettant de rajouter un champs echo '<INPUT TYPE="submit" NAME="submit" VALUE="Un champs en +"><br />'; // on place un bouton permettant de soumettre le formulaire echo '<INPUT TYPE="submit" NAME="submit" VALUE="Envoyer">'; echo '</FORM>'; } ?>

exemple6
<?php $champ_cache = $_POST['champ_cache']; function insert() { // code } function // } function // } delete() { code update() { code

function select() { // code } if ($champ_cache == 'insert' || $champ_cache == 'delete' || $champ_cache == 'update' || $champ_cache == 'select') { $champ_cache(); } ?>

Alors, convaincu ?
Auteur : LA GLOBULE Dernire rvision du cours : le 30/05/2007 00:24

Dans ce cas prcis, on parlera de fonction dynamique. Car comme vous pouvez le constater, on utilise la valeur d'une variable pour dsigner le nom d'une fonction. Voyons un autre cas d'utilisation, o l, nous allons pouvoir gnrer dynamiquement un formulaire. Gnrer un formulaire dynamiquement veut dire que la personne utilisant le formulaire pourra choisir, elle-mme, le nombre de champs de type text contenu dans ce formulaire, et grce aux variables dynamiques, nous allons pouvoir rcuprer la valeur de ces champs sans connatre auparavant le nombre de champs de ce formulaire (vu que ce nombre est dcid par la personne utilisant le formulaire) Voici le code :

exemple7
<?php // si l'utilisateur soumet le formulaire on affiche la valeur de tous les champs du formulaire if (isset($_POST['submit']) && $_POST['submit'] == "Envoyer"){ // on affiche le nombre de champs du formulaire echo 'Nombre de champs : '.$_POST['nb_champs'].'<br />'; // on affiche la valeur des champs du formulaire

2002 - 2007 lephpfacile.com - Page 3/4

2002 - 2007 lephpfacile.com - Page 4/4

You might also like