Vous êtes sur la page 1sur 104

Cration d'une application WEB avec PHP / MySQL

Cration d'une application WEB avec PHP / MySQL

Crer une application WEB avec PHP / MySQL

Par Philippe Bousquet <Darken33@free.fr>

Copyright (c) 2003-2008 Philippe Bousquet.

Cration d'une application WEB avec PHP / MySQL

Ce livre lectronique est une rdition d'un article de prparation d'une confrence que j'avais effectu au lyce Casler Talence en 2003/2004 dans le cadre des confrences de l'ABUL .

Ce Livre est distribu selon les termes de la GNU Free Documentation License. Copyright (c) 2003-2008 Philippe BOUSQUET

Cration d'une application WEB avec PHP / MySQL

Table des matires


I. Introduction II. Le modle de donnes III. Cration de la base de donnes IV. Maquettage de l'application V. Le XHTML VI.Les pages du forum en XHTML VII.La mise en forme par CSS VIII.Programmation de l'application IX.Le langage PHP X. L'application my Forum XI.Rfrences 5 6 11 21 23 36 41 61 62 81 104

Cration d'une application WEB avec PHP / MySQL

I.Introduction
Au travers de ce livre, nous allons voir les diffrentes tapes pour crer une application WEB, pour cela nous nous proposons de crer un forum de discussion bas sur les technologies suivantes :

MySQL - Pour le stockage et la gestion des donnes XHTML et CSS - Pour le rendu de nos pages HTML PHP - Pour la programmation des parties dynamiques de notre application

Cration d'une application WEB avec PHP / MySQL

II.Le modle de donnes


Avant de se lancer dans la programmation, il convient de bien dterminer l'ensemble des donnes ainsi que les liaisons qu'elles ont entre elles. En effet la programmation ne reprsente qu' peu prs 20% dans la cration d'une application, le reste tant partag entre l'Etude de ce que l'on veut raliser et les tests finaux.

Dfinition des fonctionnalits de l'application


Nous devons dans un premier temps donc bien dfinir ce que notre application est cense faire. Un forum de discussion est en fait un mcanisme permettant des utilisateurs de discuter sur des sujets divers travers des messages crits. Les utilisateurs doivent pouvoir crer de nouveaux sujets de discussions, ils doivent pouvoir lire les sujets des autres utilisateurs et bien entendu pouvoir y rpondre.

Organisation gnrale des donnes


Une fois les fonctionnalits figes, nous devons organiser nos donnes afin de pouvoir constituer notre base de donnes. C'est celle ci qui sera le cur de notre application, donc nous devons y consacrer une grande attention pour que celle ci ne soit pas mal conue, ce qui rendrait notre application moins fonctionnelle. Dans l'tape prcdente nous avons vu apparaitre trois notions distinctes :

L'utilisateur - c'est une personne qui mettra et lira des messages. Le sujet - il s'agit du point de dpart de la discussion, il regroupe les messages le concernant. Le message - c'est l'objet qui permet aux utilisateurs de s'exprimer sur un sujet donn.

Donc nous voyons ici que notre application devra au moins grer ces trois entits. Donc nous devrons crer trois tables pour constituer notre base de donnes. Cependant pour que notre application soit moins rbarbative, dans le sens ou au bout d'un moment les utilisateurs risquent de se perdre dans la jungle des sujets, nous allons intgrer une nouvelle notion : La catgorie. En effet nous allons dcider de regrouper nos sujets par catgories, ce aura pour effet que nos utilisateur, au lieu de lancer une discussion dans le vide, nous allons leur proposer des catgories dans lesquelles ils pourront crer leurs sujets de discussions.

Cration d'une application WEB avec PHP / MySQL

Par exemple : Utilisateur Catgorie Sujet : darken : technique : envoyer des mails avec OO

Message : "Il y a bien dans outils / options /programmes auxiliaires la possibilit de choisir un client de messagerie par dfaut. Mais je n'arrive pas savoir comment envoyer des mails....." Nous aurons donc quatre Tables dans notre base de donnes :

utilisateurs : qui rassemblera les infos sur les utilisateurs categorie : qui liste lensemble des catgories du forum sujets : contiendra les sujets des diffrentes discussions messages : contiendra tous les messages mis par les utilisateurs

Organisation gnrale des donnes


Maintenant que nous avons dtermin quelles tables constitueront notre base de donnes, il nous faut dfinir les informations (champs) que contiendront chacune des tables.

Table Utilisateurs
Cette table contient les utilisateurs ayant accs au forum, chaque utilisateur devra dans un premier temps, passer par une procdure d'inscription afin de pouvoir utiliser le forum. Nous aurons donc besoins des informations suivantes :

code utilisateur : il s'agit de l'identifiant de l'utilisateur, celui ci doit tre unique mot de passe : ncessaire au login de l'utilisateur email : cette information est utile pour renvoyer le mot de passe l'utilisateur qui l'aurait oubli nom et prenom : ces deux informations ne sont pas vraiment utiles mais il est toujours intressant de les possder

Cration d'une application WEB avec PHP / MySQL

Table Categories
Cette table contient les thmes de discussions du forum, chaque sujet de discussion sera englob dans l'un des thmes prsent en table. Cette table ne sera disponible qu'en lecture seule, c'est dire que c'est le DBA qui ajoutera les thmes ventuels dans la table, il n'y aura pas de mise jour par programme. Peu d'informations sont ncessaires pour identifier un thme :

un numero identifiant : il s'agit d'un numro auto-incrment qui permet d'identifier un thme, ce numro est unique un nom : Il s'agit du nom du thme, par exemple : Devel (pour un thme sur le dveloppement) une description : cette information permet d'expliquer un tant soit peu le thme, par exemple : "Discussions sur le dveloppement de logiciel libres"

Table Sujets
Cette table contient l'ensemble des sujets du forum, Elle doit possder les informations suivantes :

un numero d'identifiant : il s'agit d'un numro auto-incrment qui permet d'identifier un sujet, ce numro est unique un titre : titre qui dcrit le sujet date creation : la date de cration du sujet heure de creation : l'heure de cration du sujet

Cependant un sujet est cr par un utilisateur, il est intressant de connaitre cette information, donc nous ajoutons :

code utilisateur : c'est le code de l'utilisateur ayant cr le sujet, il doit exister dans la table users.

De plus nous avons prcis qu'un sujet tait en rapport avec une catgorie donc cette information doit tre galement dans la table :

identifiant catgorie : s'est l'identifiant de la catgorie laquelle le sujet est rattach, la catgorie doit exister dans la table thmes.

Cration d'une application WEB avec PHP / MySQL

Table Messages
Cette table contient l'ensemble des messages du forum, Elle doit possder les informations suivantes :

un numero d'identifiant : il s'agit d'un numro auto-incrment qui permet d'identifier un message, ce numro est unique un titre : titre qui dcrit le message un texte : il s'agit du corps du message date creation : la date de cration du message heure de creation : l'heure de cration du message

Cependant un message est cr par un utilisateur, il est ncessaire de connaitre cette information, donc nous ajoutons :

code utilisateur : c'est le code de l'utilisateur ayant cr le message, il doit exister dans la table users.

De plus nous avons prcis qu'un message tait en rapport avec un sujet donc cette information doit tre galement dans la table :

identifiant sujet : s'est l'identifiant du sujet auquel le message est rattach, le sujet doit exister dans la table sujets.

Cration d'une application WEB avec PHP / MySQL

La structure complte de la base de donnes


Nous avons donc dfinit, de faon thorique la structure de notre base de donnes, voici le schma gnral :

10

Cration d'une application WEB avec PHP / MySQL

III.Cration de la base de donnes


Maintenant que nous avons dfinis les diffrentes donnes que notre application devra grer, nous allons crer physiquement notre base de donnes. Pour cela nous allons utiliser le SGBD MySQL, qui est l'un des plus connu dans le monde du WEB et du logiciel libre. Afin de faciliter, la manipulation de MySQL, nous allons utiliser PhpMyAdmin. Cet outil, crit en PHP, permet de grer ses bases de donnes sans avoir besoin d'une grande connaissance de MySQL. De plus du fait qu'il est crit en PHP (donc sur votre serveur HTTP) vous pouvez surtout grer vos bases distance.

Prparation et configuration
Il n'est pas recommand d'utiliser le "compte" administrateur MySQL (root) pour manipuler une base de donnes donc nous allons dans le client MySQL, crer un utilisateur qui permettra de grer notre base de donnes (cration de table, ajout d'enregistrements, ...). Premirement, il faut se connecter MySQL en tant que root via le client MySQL, dans le but de crer notre base et d'ajouter l'utilisateur (qui permettra de grer la base sous PhpMyAdmin) :
[darken@localhost darken]$ mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 4.0.15 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>

Il faut maintenant crer notre base de donnes :


mysql> create database myforum; Query OK, 1 row affected (0.00 sec)

Nous allons maintenant crer l'utilisateur qui sera le DBA de notre base de donnes, nous allons donc nous positionner sur la base myforum, puis donner l'utilisateur wwwadmin toutes les autorisations sur cette base :
mysql> grant all privileges on myforum.* to wwwadmin@localhost; Query OK, 0 rows affected (0.82 sec) mysql> grant all privileges on myforum.* to wwwadmin; Query OK, 0 rows affected (0.82 sec)

11

Cration d'une application WEB avec PHP / MySQL

Nous pouvons donc maintenant quitter le client MySQL :


mysql> quit Bye [darken@localhost darken]$

Donnons maintenant un mot de passe pour l'utilisateur wwwadmin :


[darken@localhost darken]$ mysqladmin -p -uwwwadmin password 'azerty' Enter password: [darken@localhost darken]$

Vrifions maintenant que la configuration de PhpMyAdmin, afin que lorsque l'on se connecte MySQL via PhpMyAdmin il demande un nom d'utilisateur et un mot de passe. dans le fichier /var/www/html/phpMyAdmin/config.inc.php Remplacer la ligne :
$cfg['Servers'][$i]['auth_type'] = 'config';

Par :
$cfg['Servers'][$i]['auth_type'] = 'http';

On peut maintenant ce connecter PhpMyAdmin via votre navigateur prfr : http://localhost/phpMyAdmin :

12

Cration d'une application WEB avec PHP / MySQL

Cration de nos tables


Maintenant que l'on est connect MySQL sous PhpMyAdmin, nous allons donc crer nos tables dans notre base MyForum : pour cela slectionnons la base "myforum".

Nous arrivons sur un cran qui nous propose de crer une nouvelle table, en effet pour l'instant c'est la seule action que nous pouvons effectuer car notre base est vide.

13

Cration d'une application WEB avec PHP / MySQL

Nous allons donc crer la table "users" qui contiendra les informations sur les utilisateurs. Indiquons le nom de la table ("users") et le nombre de champs qu'elle contiendra (5).

Nous voyons donc 5 lignes qui correspondent nos cinq champs que nous voulons dcrire, pour cela il faut fournir plusieurs informations :

Field : il s'agit du nom des champs Type : il s'agit du type de donnes que se champ contiendra (caractres, nombres, dates...) La longueur du champ : Par exemple un code postal contient 5 caractres. Des attributs particuliers (non signs, binaire, ...) je conseille de ne les utiliser que si vous en avez vraiment besoin. Null : permet de dfinir si le champ peu ne pas tre renseign. Default : qui permet de dfinir la valeur par dfaut du champ. Extra : permet de dfinir des nombres auto incrments. Primary : dtermine si le champ est la cl de la table.
14

Cration d'une application WEB avec PHP / MySQL


Index : permet de dterminer si le champ fait parti de l'index secondaire. Unique : Permet d'indique que la valeur du champ doit tre unique dans la table.

MySQL permet de grer une multitude de types diffrents : chaines de caractres, entiers, flottants, dates, ... Voici un tableau prsentant les types les plus courants et qui nous servirons pour nos tables : Type VARCHAR TINYINT TEXT DATE INT BIGINT FLOAT DOUBLE DECIMAL TIME BLOB Description Chaine de caractres longueur variable (1-255) Entier entre -127 et 128 Texte de 1 65535 caractres Date au format AAAA-MM-JJ Entier de -2147483648 2147483647 Entier de -9223372036854775808 -9223372036854775807 Permet de stocker des nombre dcimaux Permet de stocker des nombre dcimaux Permet de stocker des nombre dcimaux Permet de stocker une heure au format HH:MM:SS Permet de stocker des objets binaires de grande taille

Nous allons donc crer notre table avec la structure suivante :


id_user : varchar(15) passwd : varchar(15) name : varchar(50) firstname : varchar(50) email : varchar(255)

15

Cration d'une application WEB avec PHP / MySQL

Lorsque l'on soumet le formulaire, on obtient en rponse le message "Table users has been created" qui indique que l'action s'est bien droule. On obtient galement la requte SQL qui vient d'tre excute, ceci est une bonne chose lorsque l'on ne connat pas le SQL et que l'on dsire l'apprendre.

16

Cration d'une application WEB avec PHP / MySQL

Excution de requtes
Nous venons de crer notre table grce l'interface fournit par phpMyAdmin, on peut galement lancer nos requtes directement grce l'onglet SQL.

En effet nous allons crer la table thme de cette faon. Cette table est de la structure suivante :

`id_theme` qui est un nombre auto incrment `name` qui est une chaine de caractre `description` qui est galement une chaine de caractre.

Nous allons donc utiliser la requte suivante :


CREATE TABLE themes ( id_theme TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, description VARCHAR(255) NOT NULL, PRIMARY KEY (id_theme) );

17

Cration d'une application WEB avec PHP / MySQL

Il faut donc maintenant crer les autres tables afin d'obtenir la structure complte de notre base de donnes :
CREATE TABLE subjects ( id_subject INT UNSIGNED NOT NULL auto_increment, title VARCHAR(255) NOT NULL, date DATE NOT NULL, time TIME NOT NULL, id_user VARCHAR(15) NOT NULL, id_theme TINYINT UNSIGNED NOT NULL, PRIMARY KEY (id_subject), KEY id_user (id_user), KEY id_theme (id_theme) );

18

Cration d'une application WEB avec PHP / MySQL

CREATE TABLE messages ( id_message BIGINT UNSIGNED NOT NULL auto_increment, title VARCHAR(255) NOT NULL, text TEXT NOT NULL, date DATE NOT NULL, time TIME NOT NULL, id_user VARCHAR(15) NOT NULL, id_subject INT UNSIGNED NOT NULL, PRIMARY KEY (id_message), KEY id_user (id_user), KEY id_subject (id_subject) );

19

Cration d'une application WEB avec PHP / MySQL

Sauvegarder la structure
Une fois, notre structure cre, il est bon de la sauvegarder. PhpMyAdmin permet d'exporter la structure ainsi que les donnes d'une base de donnes.

20

Cration d'une application WEB avec PHP / MySQL

IV.Maquettage de l'application
Avant de programmer les pages du forum en PHP avec les accs la base de donnes MySQL, nous allons passer par une phase de maquettage de l'application. Il s'agit de crer les pages avec des valeurs statiques dans le but de raliser l'interface et la navigation entre pages. Pour notre forum de discussion, nous aurons besoin des pages suivantes :

Login : cette page est la premire page que l'utilisateur verra, il devra s'authentifier pour utiliser le forum Inscription : cette page permet un nouvel utilisateur de s'inscrire, elle est accessible partir de la page login Liste thmes : cette page s'affiche lorsque l'utilisateur se sera authentifi, elle affiche la liste des thmes disponibles sur le forum Liste sujets : cette page affiche l'ensemble des sujets de discussions appartenant un thme. Liste messages : cette page affiche le fil de discussion d'un sujet. Ecriture message : cette page est appele lorsque l'utilisateur veut rpondre sur un sujet ou, crer un nouveau sujet de discussion.

21

Cration d'une application WEB avec PHP / MySQL

Pour raliser ces pages nous allons utiliser les technologies XHTML pour le contenu des pages et CSS pour la mise en forme de celles-ci.

22

Cration d'une application WEB avec PHP / MySQL

V.Le XHTML
Il s'agit du standard en vigueur datant du 26 janvier 2000. Le XHTML 1.0 est bas sur le langage XML. Il s'agit uniquement du HTML 4 la sauce XML. Donc si vous savez crire du HTML 4, vous savez crire du XHTML 1.0 Vous trouverez l'ensemble des spcifications du XHTML 1.0 l'adresse suivante : http://www.w3.org/TR/xhtml1 Parmi les points les plus importants de XML par rapport SGML : Chaque lment ouvert doit tre ferm les balises sont toujours orthographies en minuscule les valeurs des attributs sont toujours renseignes et entre guillemets

Les types de documents


Il existe, comme pour le HTML 4.01, trois types de documents dfinissant le standard XHTML : Le type Strict Il s'agit du type qu'il faut choisir chaque fois que cela est possible, en effet il permet de sparer compltement le contenu de la prsentation. Il interdit les balises HTML de type <font> ou <b> les effets de prsentation devant tre dcrit uniquement l'aide de CSS. Pour implmenter ce type le document doit imprativement commencer par les lignes suivantes :
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> .... </head> <body> .... </body> </html>

23

Cration d'une application WEB avec PHP / MySQL

Le type Transitional Il permet de mlanger contenu et prsentation et on peut l'utiliser si l'utilisation de CSS n'est pas possible ou satisfaisante (cas o les visiteurs cibls ne disposent que de navigateurs anciens et le rendu compte plus que l'information, etc.). Pour implmenter ce type le document doit imprativement commencer par les lignes suivantes :
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> .... </head> <body> .... </body> </html>

Le type Frameset Ce type est utiliser si vous souhaitez utiliser des cadres dans la prsentation de vos pages HTML. Pour implmenter ce type le document doit imprativement commencer par la ligne suivante :
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> .... </head> <body> .... </body> </html>

24

Cration d'une application WEB avec PHP / MySQL

L'entte du document : <head></head>


L'lment HEAD rassemble des informations sur le document courant, telles que son titre, des mots-clefs pouvant tre utiliss par des robots de recherche, et toute autre donne considre comme venant part du contenu du document. Les lments situs l'intrieur de la dclaration HEAD ne devront pas tre visualises dans le cas d'agents utilisateurs conformes, sauf mention particulire. La balise <title> Tout document HTML doit comporter un et un seul lment TITLE dans sa section HEAD. Les agents utilisateurs utilisent le contenu de l'lment titre pour donner l'utilisateur une information concise sur le contenu probable du document, par exemple, en l'crivant dans la barre de titre de fentre, ou en le citant par synthse vocale. Les titres peuvent contenir des entits caractres (pour les caractres accentus, les caractres spciaux, etc.), mais ne pourront contenir aucune autre balise. Voici un exemple de titre de document :
<title>myForum : Login</title>

Les balises <meta> Ce type de balise n'est pas obligatoire mais permet de donner diverses informations telles que l'encodage de la page, le nom de l'auteur, les mots cls (pour les moteurs de recherches), une description du contenu de la page...
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> <meta name="keywords" lang="fr" content="forum, discussion, logiciel, libre, PHP, mysql, xhtml, css" />

Les balises <link> La balise link permet d'effectuer des liens vers des ressources externes afin de dfinir par exemple les relations entre pages, mais aussi de dfinir le fichier de style CSS utiliser (que nous verrons plus tard).
<link rel="next" href="Chapitre3.html" /> <link rel="stylesheet" href="default.css" type="text/css" /

25

Cration d'une application WEB avec PHP / MySQL

Entte pour MyForum Pour notre application nous allons utiliser le code suivant :
<head> <title>myForum : Login</title> <meta http-equiv="content-type" content="text/html; charset=ISO-88591" /> <meta name="keywords" lang="fr" content="forum, discussion, logiciel, libre, PHP, mysql, xhtml, css" /> <meta name="author" lang="fr" content="Philippe Bousquet" /> <meta name="copyright" content="&copy; 2004 Philippe Bousquet." /> <meta name="license" content="GNU General Public License." /> <link rel="stylesheet" href="default.css" type="text/css" /> </head>

Bien entendu nous allons changer le titre pour chaque page.

Le contenu de la page : <body></body>


Le corps d'un document contient son contenu effectif. Ce contenu pourra tre reprsent par un agent utilisateur d'une multitude de faons. Par exemple, pour les navigateurs visuels, vous pourrez considrer le corps comme un cadre dans lequel le contenu apparat : texte, images, couleurs, dessins, etc. Pour les agents utilisateurs audio, le mme contenu pourra tre "parl". Balises de groupes <div></div> et <span></span> Les lments DIV et SPAN, en conjonction avec les attributs id et class, proposent un mcanisme gnrique pour renforcer la structuration d'un document. Ce sont les deux seuls lments du HTML qui n'ajoutent aucune information de prsentation leur contenu. De ce fait, il est possible de les utiliser associs des identificateurs et des assignations de classe pour pouvoir formater l'apparence de zones de texte par application ultrieure de feuilles de style. Balises d'enttes <h1>, <h2>, <h3>, <h4>, <h5>, <h6> Un lment de titrage dcrit brivement le thme de la section qu'il introduit. Les informations de titrage pourront tre rcoltes par les agents utilisateurs pour, par exemple, construire une table des matires automatiques pour ce document. Le HTML dfinit six niveaux de titrage depuis H1 affich comme le plus imposant jusqu' H6 le plus discret. Les navigateurs visuels utiliseront des polices plus ou moins grosses pour rendre compte du niveau de titre.
<h1>Niveau 1</h1> <h6>Niveau 6</h6>

26

Cration d'une application WEB avec PHP / MySQL

Le rsultat obtenu :

Niveau 1
Niveau 6 La balise de lien ou d'ancre <a></a> L'lment A peut tre utilis pour dfinir une ancre, un lien ou les deux. L'exemple qui suit spcifie un lien :
Pour plus d'information sur du W3C, consultez le <a href="http://www.w3.org/">site Web du W3C</a>

Ce lien dsigne la "home page" du World Wide Web Consortium. Lorsqu'un utilisateur active ce lien dans un agent utilisateur, ce dernier ira rcuprer la ressource pointe, et dans notre cas, un document HTML. L'exemple suivant illustre une dfinition d'ancre. Supposez que nous dfinissions une ancre nomme "ancre-une".
...texte prcdent l'ancre... <a name="anchor-one">l'endroit de l'ancre une</a> ...texte aprs l'ancre...

Cette dfinition assigne un nom d'ancre la zone entire du document qui contient le texte "l'endroit de l'ancre une". Normalement, le contenu des lments A ne seront pas affich diffremment que la normale lorsque l'lment A ne sert qu' dfinir une ancre. Une fois l'ancre dfinie, nous aimerions pouvoir nous y rfrer depuis un document (le mme ou un autre). Les URL qui dsignent les ancres se terminent par un "#" suivi du nom de l'ancre. Voici quelques exemples d'URL ainsi constitues :

Une URL absolue : http://www.mycompany.com/one.html#anchor-one Une URL relative : ../one.html#anchor-one Lorsque le l'ancre est situe dans le mme document : #anchor-one

27

Cration d'une application WEB avec PHP / MySQL

Texte prformats <pre></pre> L'lment PRE indique aux agents utilisateurs visuels que le texte qui y est inclus est "prformat". Les agents utilisateurs visuels doivent traiter le texte prformat comme suit :

Ils doivent laisser les espaces blancs intacts. Ils devront crire le texte avec une police espacement fixe. Le retour automatique la ligne pourra y tre dsactiv. Le traitement de la directionnalit doit rester oprationnel.

L'exemple suivant montre un texte prformat :


<pre> Bonjour, j'aimerais raliser un forum en PHP avec MySQL, Mais je ne sais pas du tout par ou commencer. </pre> Quelqu'un aurait il une ide ?

Voici le rendu de votre navigateur : Bonjour, j'aimerais raliser un forum en PHP avec MySQL, Mais je ne sais pas du tout par ou commencer. Quelqu'un aurait il une ide ?

Les tableaux <table></table>


L'lment TABLE contient tous les autres lments qui spcifient le titre, les lignes, le contenu, et le format d'un tableau.
<table> ... Le reste du tableau ... </table>

Titres de tableaux :<caption></caption> Lorsque prsent, le texte de l'lment CAPTION dcrira usuellement la nature du tableau. L'lment CAPTION doit venir immdiatement aprs la balise de dbut de l'lment TABLE.
<table> <caption>Liste des themes du forum</caption> ... Le reste du tableau ... </table>

28

Cration d'une application WEB avec PHP / MySQL

Groupes de lignes : <thead>,<tbody>,<tfoot> Un tableau doit contenir au moins un groupe de lignes. Chaque groupe de lignes est divis en trois parties : en-tte, corps, et pitement. Les en-ttes et pitements de tableaux sont optionnels. L'lment THEAD dfinit l'en-tte, l'lment TFOOT dfinit le pitement, et l'lment TBODY dfinit le corps de tableau. Lorsqu'il existe, chacun des instances d'lments THEAD, TFOOT, et TBODY DOIT contenir au moins une ligne (voir TR). L'exemple suivant illustre l'ordre et la structure des en-ttes, pieds et corps de tableaux.
<table> <thead> <tr> ...information d'en-tte... </tr> </head> <tfoot> <tr> ...information de pitement... </tr> </tfoot> <tbody> <tr> ...premire ligne du bloc de donnes... </tr> <tr> ...deuxime ligne du bloc de donnes... </tr> </tbody> </table>

Lignes de tableau : <tr></tr> L'lment TR agit comme un container accueillant des cellules d'une ligne d'un tableau. Cellules de tableau : <th> et <td> Les lments TH contiennent les en-ttes de colonnes (ou de ligne), tandis que les lments TD dfinissent des cellules de donnes. Cette distinction permet aux agents utilisateurs de reprsenter diffremment les en-ttes et les cellules de donnes, mme en l'absence de feuilles de style. Les cellules peuvent tre vides (c.--d., ne contenir aucune donnes).

29

Cration d'une application WEB avec PHP / MySQL

Example :
<table> <caption>MyForum : Liste des thmes</caption> <thead> <tr><th>Thme</th><th>Description</th><th> Sujets </th><th>Date</th></tr> </thead> <tbody> <tr> <td class="left"><a href="sujets.html">Dbutants</a></td> <td class="left"><a href="sujets.html">Aide aux dbutant sous Linux</a></td> <td class="right">15</td> <td class="right">2003-12-21 12:45</td> </tr> <tr> <td class="left"><a href="sujets.html">Devel</a></td> <td class="left"><a href="sujets.html">Qestions relatives au dveloppement</a></td> <td class="right">2</td> <td class="right">2003-12-21 10:42</td> </tr> </tbody> </table>

Les objets externes


Les images <img> Cette balise permet d'intgrer des images dans un document XHTML. Aujourd'hui, la plupart des navigateurs Web supportent les images, cependant Lynx (le navigateur le plus utilis par les aveugles et les malvoyants) ne les supportent pas, en effet un aveugle ne peu en aucun cas apprcier le contenu d'une image, sauf si on lui dcrit son contenu. Dans cette optique la balise <img> donne la possibilit dafficher un texte alternatif pour les navigateurs n'arrivant pas afficher les images :
<img src="bienvenue.jpg" alt="Bienvenue sur notre site web" title="Accueil" />

30

Cration d'une application WEB avec PHP / MySQL

Les objets externes <object> Dans les anciennes versions du HTML intgrer des scripts externes (Applet Java, Objet ActiveX, ...), n'tait pas toujours une chose aise. Aujourd'hui une seule balise permet d'implmenter ce type de ressource, la balise <object>. Celle ci permet en plus de proposer une solution alternative lorsque le navigateur ne peut afficher l'objet (plugin non activ, ...) :
<!-- En premier tenter l'applet Python --> <object title="The Earth as seen from space" classid="http://www.observer.mars/TheEarth.py"> <!-- Sinon essayer une vido MPEG --> <object data="TheEarth.mpeg" type="application/mpeg"> <!-- Sinon afficher un GIF anim --> <object data="TheEarth.gif" type="image/gif"> <!-- Sinon afficher un texte alternatif --> The <strong>Earth</strong> as seen from space. </object> </object> </object>

La balise OBJECT permet aussi d'intgrer des images (tout comme la balise IMG), aussi vaut il mieux prfrer OBJECT (car une image est un objet externe).

Les Formulaires <form></form>


L'lment FORM fait office de container pour des contrles. Il spcifie :

Le programme qui traitera le formulaire une fois complt et dment soumis (l'attribut action). La mthode par laquelle les donnes dposes par l'utilisateur seront transmises au serveur (l'attribut method, valeurs 'get' ou 'post').

Un formulaire peut contenir du texte et des balises (paragraphes, listes, etc.) ainsi que les contrles dtaills ci-aprs. La porte de l'attribut name associ chacun des contrles situ l'intrieur d'un lment FORM est limite cet lment FORM.

31

Cration d'une application WEB avec PHP / MySQL

La balise <label> L'lment LABEL peut tre utilis pour attacher une information un autre contrle ( l'exception des lments LABEL eux-mmes). Les labels pourront tre affichs par les agents utilisateurs d'une multitude de faons (ex., visuellement, auditivement par des synthtiseurs vocaux, etc.)
<form action="..." method="post"> <div class="field"> <label for="cuser">Code user :</label> <input type="text" name="cuser" id="cuser" value="" /> </div> <div class="field"> <label for="pass">Mot de passe :</label> <input type="password" name="passwd" id="pass" value="" /> </div> <div class="buttons"> <input class="button" type="submit" name="action" value="Je me connecte" /><br /> <input class="button" type="submit" name="action" value="J'ai perdu mon mot de passe" /> </div> </form>

Notez que les lments LABEL sont associs aux lments INPUT via l'attribut id. La balise <input> La nature d'un contrle dfini par un lment INPUT dpend de la valeur de son attribut type. Types de champs de saisie L'attribut type de l'lment INPUT dtermine quel contrle doit tre cr. text Ce type cre un champ de texte mono ligne. La valeur mise lors de la soumission du formulaire est le texte entr. password Comme le type "text", mais le texte entr est visualis l'cran de sorte que les caractres ne puissent tre reconnus (par exemple une srie d'toiles). Ce contrle est utilis pour l'entre de donnes sensibles telles que des mots de passe. La valeur mise lors de la soumission du formulaire est le texte tap (et non pas le texte affich (!)).

32

Cration d'une application WEB avec PHP / MySQL

checkbox Une case cocher est une sorte de commutateur bipolaire. Lorsqu'elle est coche, la case est dite "active". Lorsqu'elle est vide, la case est "inactive". La valeur de la case cocher n'est mise que si cette dernire est active. Plusieurs cases cocher du mme formulaire pourront partager le mme nom. Au moment de la soumission, toute case cocher "active" y compris celles de nom semblable met une paire nom/valeur dans laquelle le nom sera identique. Ceci permettra aux utilisateurs de choisir des valeurs multiples pour une proprit unique. radio Un bouton radio est aussi un commutateur bipolaire. Lorsqu'il est marqu, le bouton radio est dit "actif". Lorsqu'il est vide, il est rput "inactive". La valeur du bouton radio n'est mise que si ce dernier est actif. Plusieurs boutons radio du mme formulaire pourront partager le mme nom. Cependant, seul l'un d'entre eux pourra tre actif la fois. Lorsque l'un des boutons radio est marqu, tous les autres portant le mme nom sont automatiquement dslectionns. Pour cet ensemble de boutons radio, il ne peut donc tre mis qu'une seule paire nom/valeur. submit Cre un bouton de soumission. Lorsque l'utilisateur clique sur ce bouton, le contenu du formulaire est soumis au programme spcifi par la localisation dfinie par l'attribut action de l'lment FORM englobant. Un formulaire peut contenir plusieurs boutons de soumission. Cependant, seule la paire nom/valeur du bouton de soumission actionn sera envoye dans le formulaire. image Cre un bouton de soumission graphique. La valeur de l'attribut src spcifie l'URL de l'image qui servira de reprsentation graphique du bouton. Certains utilisateurs ne pourront visualiser cette image. Nous recommandons fortement d'adjoindre la dfinition d'un attribut alt valant pour alternative textuelle de l'image. reset Cre un bouton de rinitialisation. Lorsque ce bouton est activ par l'utilisateur, les valeurs de tous les contrles du formulaire sont remises leur valeur initiale, telle que mentionne dans l'attribut value. Le couple nom/valeur d'un bouton de rinitialisation n'est jamais envoy lors de la soumission d'un formulaire. hidden Cre un lment qui ne doit pas tre reprsent par l'agent utilisateur. Cependant, le couple nom/valeur de cet lment sera joint aux donnes envoyes lors de la soumission du formulaire. Ce type de contrle sera en gnral utilis pour enregistrer des donnes d'changes client/serveur qui seraient autrement perdues du fait de la nature volatile des processus HTTP.
33

Cration d'une application WEB avec PHP / MySQL

file Demande l'utilisateur de dsigner un fichier. Lorsque le formulaire est soumis, le contenu de ce fichier sera transmis au serveur comme une valeur de n'importe quel autre contrle. La balise <textarea> L'lment TEXTAREA cre une zone de saisie de texte multi lignes (par opposition au champ de texte INPUT d'une seule ligne). Le contenu de cet lment fournit le texte initial qui est prsent dans la zone de saisie.
<form action="..." method="post"> <div class="field2"> <label for="titre">Titre : </label><br/> <input type="text" name="titre" id="titre" value="" /> </div> <div class="field2"> <label for="message"> Message : </message><br/> <textarea cols="50" rows="12" name="message" id="message">Entrez ici votre texte...</textarea> </div> <div class="buttons"> <input class="button" type="submit" name="action" value="Envoyer" /> <input class="button" type="reset" name="reset" value="Reset" /> </div> </form>

Les balises <select> et <option> L'lment SELECT cre une liste d'options pouvant tre slectionnes par l'utilisateur. Chaque lment SELECT doit contenir au moins une dfinition d'option. Chaque option est spcifie par une instance de l'lment OPTION. Les agents utilisateurs se baseront sur le contenu de l'lment OPTION pour afficher le libell de l'option dans la liste.
<form action="..." method="post"> <select size="4" name="user"> <option selected value="darken">Philippe BOUSQUET </option> <option value="alex">Alex</option> <option value="akira">Akira </option> <option value="tiana">Tatiana</option> <option value="chris">Chistophe </option> <option value="liloune">Liloune</option> </select> <input type="submit" name="action" value="Valider" /> </form>

34

Cration d'une application WEB avec PHP / MySQL

Vrifier la validit des pages


Aprs l'criture ou la gnration de pages HTML il faut que les pages soient valides. Il ne suffit pas de vrifier le rendu des pages sur diffrents navigateurs, cette validation doit tre faite auprs des validateurs de rfrence du W3C : Service de validation HTML : http://validator.w3.org/ (fourni par le W3C) Lynx viewer est un service qui permet de vrifier le rendu de pages Web, telles qu'elles apparaissent dans le navigateur en mode texte Lynx. Lynx est trs utilis par les nonvoyants et les malvoyants ainsi que sur certaines configurations informatiques ne disposant pas d'interface graphique volue.

35

Cration d'une application WEB avec PHP / MySQL

VI.Les pages du forum en XHTML


Pour notre forum, nous avons donc besoins de six pages XHTML, que nous allons dcrire.

La page d'identification
Ceci est la page d'entre du forum; toute personne voulant utiliser le forum doit se signer (et donc doit tre inscrite). Cette page contient donc un formulaire, avec deux champs saisissables : Code user : reprsentant le pseudo de l'utilisateur Mot de passe : son mot de passe lui permettant de se connecter. Il y a deux boutons : Se connecter : qui permet d'effectuer la connexion proprement dit, et d'accder au forum J'ai perdu mon mot de passe : qui permet de renvoyer l'utilisateur son mot de passe par email. Pour les personnes qui ne sont pas encore inscrites, il y a galement un lien vers la page d'inscription.

La page d'inscription
Cette page est tout simplement le formulaire permettant une personne de s'inscrire sur le forum. Ce formulaire est compos de 6 champs saisissables et obligatoires : Le Nom de l'utilisateur Le Prnom de l'utilisateur L'email de l'utilisateur (pour pouvoir lui renvoyer son mot de passe) Le code user : l'utilisateur devra choisir un pseudo qui lui servira pour se connecter. Le mot de passe : l'utilisateur devra choisir un mot de passe qui lui servira pour se connecter. La confirmation : l'utilisateur devra ressaisir son mot de passe ici (vrifier l'galit avec le champ prcdent) Il y a deux boutons : S'inscrire : qui permet d'enregistrer les donnes de l'utilisateur, de plus cela effectue la connexion au forum Rtablir : qui permet de rinitialiser le formulaire.

36

Cration d'une application WEB avec PHP / MySQL

La liste des thmes


Cette page liste les thmes disponibles sur le forum, elle est constitue des lments suivants : La barre de navigation : la seule option propose est Quitter, qui renvoi vers la page d'identification. Le tableau dressant la liste des thmes : Nom du thme (lien vers la page des sujets) Description du thme (lien vers la page des sujets) Le nombre de sujets posts La date du dernier message

La liste des sujets


Cette page liste les sujets posts pour un thme donn sur le forum, elle est constitue des lments suivants : La barre de navigation : Quitter, qui renvoi vers la page d'identification. Thmes, qui renvoi vers la page de liste des thmes du forum Le tableau dressant la liste des sujets : Auteur du sujet Titre du sujet (lien vers la page des messages) Le nombre de rponses au sujet La date du dernier message concernant le sujet Un bouton Nouveau : qui permet de poster un nouveau sujet (lien vers Edition Message).

Les messages concernant un sujet


Cette page affiche la discussion concernant un sujet, elle est constitue des lments suivants : La barre de navigation : Quitter, qui renvoi vers la page d'identification. Thmes, qui renvoi vers la page de liste des thmes du forum Sujets, qui renvoi vers la page des sujets concernant le thme en cours Le tableau dressant la discussion, et ceci dans l'ordre d'arriv : Auteur du message Titre du message Date du message Texte du message Un bouton Rpondre : qui permet d'ajouter un message dans la discussion (lien vers Edition Message).

37

Cration d'une application WEB avec PHP / MySQL

L'dition d'un message


Cette page permet la cration dun sujet ou d'effectuer une rponse sur un sujet donn, elle est constitue des lments suivants : La barre de navigation : Quitter, qui renvoi vers la page d'identification. Thmes, qui renvoi vers la page de liste des thmes du forum Sujets, qui renvoi vers la page des sujets concernant le thme en cours Messages, qui renvoi vers la page affichant la discussion en cours (dans le cas ou l'on rpond un message) Un formulaire compos de deux champs saisissables : Un titre de message (pr aliment avec "RE : titre sujet" dans le cas d'une rponse) Une zone de texte, ou l'utilisateur saisira son message. Deux boutons : Un bouton Envoyer qui permet d'enregistre un message et de revenir ver la page de la discussion. Un bouton Rtablir qui permet de rinitialiser le formulaire. Le tableau dressant la discussion, dans l'ordre inverse d'arrive : Auteur du message Titre du message Date du message Texte du message

Une page XHTML valide


Voici par exemple le code source XHTML de la page d'dition d'un message au format XHTML (page valid par le validateur du W3C), sans mise en forme particulire.

<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>MyForum v0.1</title> <meta http-equiv="content-type" content="text/html; charset=ISO8859-1" /> <meta name="keywords" lang="fr" content="forum, discussion, logiciel, libre, php, mysql, xhtml, css" /> <meta name="author" lang="fr" content="Philippe Bousquet" /> <meta name="copyright" content="&copy; 2004 Philippe Bousquet." /> <meta name="license" content="GNU General Public License." /> </head> <body> <!-- Entete de site --> <div class="header"> <img class="icon" src="imgs/linux.png" alt="ABUL" />
38

Cration d'une application WEB avec PHP / MySQL <h1>MyForum v0.1</h1> <hr/> </div> <!-- La partie principale --> <div class="main"> <div class="pwd"> Darken &gt;&gt; <a href="login.html" title="quitter">Quitter</a> :: <a href="themes.html" title="retour aux thmes">Thmes</a> :: <a href="sujets.html" title="retour sur Devel">Sujets</a> :: <a href="messages.html" title="retour sur Comment raliser un forum en PHP ?">Messages</a> </div> <!-- Message d'erreur --> <div class="err"> ERREUR : Vous devez saisir vos identifiants pour vous inscrire </div> <!-- Rpondre au message --> <div class="box"> <h1>Rpondre au message</h1> <form action="messages.html" method="get"> <div class="field2"><label for="title">Titre : </label><br/><input type="text" id="title" name="titre" value="RE: Comment raliser un forum en PHP ?" size="50" /></div> <div class="field2"><label for="mess">Message : </label><br/><textarea cols="50" id="mess" rows="12" name="message">Saisissez votre texte ici...</textarea></div> <div class="buttons"> <input class="button" type="submit" name="action" value="Envoyer" /> &nbsp;<input class="button" type="reset" /> </div> </form> </div> <!-- La liste des themes --> <table class="old"> <caption>Devel : Comment raliser un forum en PHP ?</caption> <tbody> <!-- 1 message --> <tr class="row"><th class="left">Darken</th><th class="left">RE: Comment raliser un forum en PHP ?</th><th class="right">2003-12-21 12:45</th></tr> <tr class="row"><td colspan="3" class="left">Salut,<br />En fait tu tombe bien, je donne actuellement une confrence sur le sujet.<br/>Celle ci lieu au lic Kastler...<br/>@++</td></tr> <!-- 1 message --> <tr class="row"><th class="left">Akira</th><th class="left">Comment raliser un forum en PHP ?</th><th class="right">2003-12-21 10:05</th></tr> <tr class="row"><td colspan="3" class="left"><pre>Bonjour, j'aimerais raliser un forum en PHP avec MySQL,<br/>Mais je ne sais pas du tout par ou commencer.<br/>Quelqu'un aurrait il une ide....</pre></td></tr> </tbody> </table> </div> <!-- Le pied de page --> <div class="footer"> <hr/> Copyright &copy; 2003-2004 Philippe BOUSQUET<br /> Ce logiciel est sous licence Gnu Genral Public License </div>
39

Cration d'une application WEB avec PHP / MySQL </body> </html>

Et voici le rsultat dans votre navigateur internet :

40

Cration d'une application WEB avec PHP / MySQL

VII.La mise en forme par CSS


Lors la cration de nouveaux sites web, la sparation du contenu structur de sa prsentation est une aubaine pour les dveloppeurs Web. En effet, il est possible de crer des feuilles de style qui s'appliqueront un ou plusieurs documents, permettant ainsi de changer l'apparence d'un site en changeant simplement la feuille de style. Il faut essayer de sparer au maximum le contenu de la prsentation. Pour cela il est prfrable d'crire, de gnrer, des documents suivants la DTD XHTML 1.0 Strict plutt que la DTD XHTML 1.0 Transitional.

Le modle des botes


Chaque bote possde une aire de contenu (ex. un texte, une image, etc.) entoure en option par une aire d'espacement, une aire de bordure et une aire de marge ; Le schma suivant illustre les relations entre ces aires et la terminologie employe pour les dsigner :

On peut subdiviser la marge, la bordure et l'espacement selon qu'il s'agisse du ct gauche, droite, haut ou bas (ex. dans le schma, "MG" mis pour marge gauche [ndt. margin-left], "ED" mis pour espacement droit [ndt. padding-right], "BH" mis pour bordure haute [ndt. border-top], etc.).

41

Cration d'une application WEB avec PHP / MySQL

Les proprits de marge : 'margin-top', 'margin-right', 'margin-bottom', 'margin-left' et 'margin' Ces proprits spcifient la largeur de l'aire de la marge d'une bote. La proprit raccourcie 'margin' spcifie la valeur de la marge pour les quatre cts la fois, les autres proprits fixant celle de leur ct respectif. Les proprits dfinies ici se rfrent au type de valeur <marge-largeur>, celui-ci accepte une des valeurs suivantes : <longueur> : Spcifie une largeur fixe ; <pourcentage> : Le pourcentage est calcul par rapport la largeur du bloc conteneur de la bote gnre. Ceci est vrai aussi pour les proprits 'margin-top' et 'margin-bottom', sauf dans un contexte de page o le pourcentage se rfre la hauteur de la bote de la page. auto Les proprits d'espacement : 'padding-top', 'padding-right', 'padding-bottom', 'padding-left' et 'padding' Ces proprits spcifient la largeur de l'aire d'espacement d'une bote. La proprit raccourcie 'padding' spcifie la valeur de l'espacement pour les quatre cts la fois, les autres proprits fixant celle de leur ct respectif. Les proprits dfinies ici se rfrent au type de valeur <espacement-largeur>, celui-ci accepte une des valeurs suivantes : <longueur> : Spcifie une largeur fixe. <pourcentage> : Le pourcentage est calcul par rapport la largeur du bloc conteneur de la bote gnre. De mme pour les proprits 'padding-top' et 'padding-bottom'. la diffrence des proprits de marge, les valeurs d'espacement ne peuvent pas tre ngatives. Les valeurs de pourcentage des proprits d'espacement, tout comme celles des proprits de marge, se rfrent la largeur du bloc conteneur de la bote gnre.

42

Cration d'une application WEB avec PHP / MySQL

Les proprits de bordure Ces proprits spcifient l'paisseur, la couleur et le style de l'aire de bordure d'une bote. Celles-ci s'appliquent tous les lments. L'paisseur de bordure : les proprits 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width' et 'border-width' Ces proprits spcifient l'paisseur de l'aire de bordure. Les proprits dfinies ici se rfrent au type de valeur <bordure-paisseur>, celui-ci accepte l'une des valeurs suivantes : thin : Une bordure mince. medium : Une bordure moyenne. thick : Une bordure paisse. <longueur> : L'paisseur de la bordure a une valeur explicite. Cette valeur explicite ne peut tre ngative. L'interprtation des trois premires valeurs dpend de l'agent utilisateur. Cependant, celui-ci doit respecter les directives suivantes La couleur de bordure : les proprits 'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color' et 'border-color' Ces proprits spcifient la couleur des bordures d'une bote. Voici la signification des valeurs : <couleur> : Spcifie la valeur d'une couleur ; transparent : La bordure est transparent (tout en ayant une paisseur).

43

Cration d'une application WEB avec PHP / MySQL

Le style de bordure : les proprits 'border-top-style', 'border-right-style', 'borderbottom-style', 'border-left-style' et 'border-style' Ces proprits spcifient le dessin des bordures d'une bote (en trait plein, trait double, trait pointill, etc.). Les proprits dfinies ici se rfrent au type de valeur <bordure-style>, celuici accepte l'une des valeurs suivantes : none : Aucune bordure. Cette valeur force la valeur calcule de la proprit 'border-width' 0; hidden : Idem 'none', sauf pour la rsolution des conflits de bordure des lments de table ; dotted : La bordure est une ligne en pointill ; dashed : La bordure est une ligne en tirets ; solid : La bordure est une ligne en trait plein. double : La bordure est une ligne double, de deux traits pleins. La somme de ces lignes et de l'espace entre elles est gale la valeur de 'border-width'. groove : La bordure donne l'impression qu'elle est grave dans le canevas ; ridge : l'oppos de 'groove', la bordure semble sortir du canevas ; inset : La bordure donne l'impression que la bote entire est incruste dans le canevas ; outset : l'oppos de 'inset', la bordure donne l'impression que la bote entire est extrude du canevas La largeur du contenu : la proprit 'width' Cette proprit spcifie la largeur du contenu des botes gnres par les lments de type bloc. Les valeurs ont les significations suivantes : <longueur> : Spcifie une largeur fixe ; <pourcentage> : Spcifie une largeur en pourcentage. Le pourcentage est calcul en fonction de la largeur du bloc conteneur de la bote gnre ; auto La proprit 'width' n'admet pas de valeurs ngatives. La hauteur du contenu : la proprit 'height' Cette proprit spcifie la hauteur du contenu des botes gnres par les lments de type bloc. Les significations des valeurs sont : <longueur> : Spcifie une hauteur fixe ; <pourcentage> : Spcifie une hauteur en pourcentage. Celui-ci est calcul en fonction du bloc conteneur de la bote gnre. Si la hauteur du bloc conteneur n'est pas spcifie explicitement (c..d., celle-ci dpendant de la hauteur du contenu), sa valeur est considre comme tant 'auto' ;
44

Cration d'une application WEB avec PHP / MySQL

auto La proprit 'height' n'admet pas de valeur ngative.

Les couleurs et arrires plans


Chaque bote possde une aire de contenu (ex. un texte, une image, etc.) entoure en option par une aire d'espacement, une aire de bordure et une aire de marge ; Le schma La couleur d'avant-plan : la proprit 'color' Cette proprit dcrit la couleur d'avant-plan du contenu de texte d'un lment. Voici plusieurs faons d'indiquer la couleur rouge : Exemple(s) :
em { color: red } em { color: rgb(255,0,0) } em { color: #FF0000 } /* nom de couleur prdfini */ /* couleurs en RGB allant de 0 255 */ /* Couleur HTML RGB Hexadcimal */

L'arrire-plan Les auteurs peuvent spcifier l'arrire-plan d'un lment (c..d. la surface o celui est rendu) comme tant une couleur ou bien une image. Selon le modle de la bote, l'arrireplan correspond aux aires du contenu, de l'espacement et de bordure. Les couleurs et styles de bordure sont spcifies par les proprits de bordure. Les marges tant transparentes, l'arrire-plan du parent est toujours visible au travers de celles-ci. Bien que les proprits d'arrire-plan ne s'hritent pas, l'arrire-plan de la bote du parent transparatra par dfaut, du fait de la valeur initiale 'transparent' de la proprit 'backgroundcolor'. L'arrire-plan de la bote gnre par l'lment racine recouvre la totalit du canevas. Dans le cas de documents HTML, on recommande aux auteurs de spcifier un arrire-plan l'lment BODY, plutt qu' l'lment HTML. Les agents utilisateurs devraient suivre les rgles de prsance suivantes pour remplir le fond du canevas : quand la valeur de la proprit 'background' pour l'lment HTML diffre de 'transparent', alors utiliser la valeur spcifie, autrement utiliser celle spcifie par la proprit 'background' de l'lment BODY. Le rendu n'est pas dfini si la valeur finale reste 'transparent'. Les proprits : 'background-color', 'background-image', 'background-repeat', 'background-attachment', 'background-position' et 'background'

45

Cration d'une application WEB avec PHP / MySQL

'background-color' Valeur : <couleur> | transparent | inherit Initiale: transparent Cette proprit donne la couleur d'arrire-plan d'un lment, avec une valeur de <couleur>, ou bien avec le mot-cl 'transparent', celui-ci laissant ventuellement voir les couleurs situes plus en-dessous. 'background-image' Valeur : <uri> | none | inherit Initiale : none S'applique : tous les lments Cette proprit spcifie l'image d'arrire-plan d'un lment. En mme temps qu'une image, les auteurs devraient aussi spcifier une couleur d'arrire-plan, cette couleur tant employe en remplacement d'une image indisponible. Celle-ci, une fois disponible, vient se superposer sur le fond color. La couleur du fond tant ainsi visible au travers des zones transparentes de l'image. 'background-repeat' Valeur : repeat | repeat-x | repeat-y | no-repeat | inherit Initiale : repeat Quand on spcifie une image d'arrire-plan, cette proprit indique si l'image est rpte (appose) et la manire de la rptition. La mosaque de fond rsultante correspond aux aires de contenu, d'espacement et de bordure de la bote de l'lment en question. Les significations des valeurs sont : Un exemplaire de l'image d'arrire-plan est plac au centre, puis d'autres exemplaires de celles-ci se placent les unes au-dessus, les autres en-dessous, produisant une bande verticale derrire l'lment. 'background-attachment' Valeur : scroll | fixed | inherit Initiale : scroll Quand on spcifie une image d'arrire-plan, cette proprit indique si l'image est fixe par rapport l'espace de visualisation (pour la valeur 'fixed'), ou si celle-ci dfile en mme temps que le document (pour la valeur 'scroll'). 'background-position' Valeur : [ [<pourcentage > | <longueur> ]{1,2} | [ [top | center | bottom] || [left | center | right] ] ] | inherit Initiale : 0% 0%

46

Cration d'une application WEB avec PHP / MySQL

Quand on spcifie une image d'arrire-plan, cette proprit indique la position initiale de celle-ci. Quand l'image d'arrire-plan est fixe par rapport l'espace de visualisation (voir la proprit 'background-attachment'), cette image se place relativement celui-ci, et non par rapport l'aire d'espacement de l'lment.

Les polices
Chaque bote possde une aire de contenu (ex. un texte, une image, etc.) entoure en option par une aire d'espacement, une aire de bordure et une aire de marge ; Le schma La famille de polices : la proprit 'font-family' Cette proprit donne une liste, par ordre de priorit, de noms de familles de polices et/ou de noms de familles gnriques. Pour contourner certaines difficults, une police seule ne contenant pas ncessairement tous les glyphes pour le rendu de chacun des caractres d'un document, ou des polices tant absentes de certains systmes, ainsi la proprit permet aux auteurs de spcifier une liste de polices, celles-ci de mme style et taille, qui sont essayes successivement pour vrifier la correspondance d'un glyphe avec un caractre donn. On appelle cette liste un jeu de polices. La famille de polices gnrique sera utilise si une, ou plusieurs, des polices d'un jeu de polices n'taient pas disponibles. Bien que certaines polices fournissent un glyphe de substitution pour indiquer un "caractre manquant", celui-ci prenant typiquement l'aspect d'un carr, on ne devrait pas considrer ce glyphe comme une correspondance valide. Il existe deux types de noms de famille de polices : <famille-nom> Le nom d'une famille de polices choisi. Dans l'exemple prcdent, "Baskerville", "Heisi Mincho W3" et "Symbol" sont des noms de famille de polices. Celles dont l'intitul contient des blancs devraient tre crites entre guillemets. Si on omet les guillemets, chacun des caractres blancs avant et aprs le nom de la police sont ignors et chaque squence de blancs, dans celui-ci, est convertie en un seul espace ; <famille-gnrique> On dfinit les familles gnriques suivantes : 'serif', 'sans-serif', 'cursive', 'fantasy' et 'monospace'. Voir le passage traitant des familles de polices gnriques pour leur description. Les noms de famille de polices gnriques sont des mots-cls, on ne doit pas les mettre entre guillemets. On recommande aux auteurs de citer une famille de polices gnrique comme dernire alternative, pour une meilleure efficacit.

47

Cration d'une application WEB avec PHP / MySQL

Le style de police : les proprits 'font-style', 'font-variant', 'font-weight' et 'fontstretch' 'font-style' Valeur : normal | italic | oblique | inherit Initiale : normal La proprit 'font-style' slectionne, parmi les polices d'une famille de polices, celles avec un dessin normal (aussi appel "roman" ou "upright"), italique et oblique. Les significations des valeurs sont : normal Spcifie une police dite normale dans la base de donnes de police de l'agent utilisateur ; oblique : Spcifie une police dite oblique dans la base de donnes de police de l'agent utilisateur. Les polices dont le nom contient les mots Oblique, Slanted ou Incline sont typiquement tiquetes 'oblique' dans la base de donnes de police de l'agent utilisateur. Celles avec ce label ayant pu avoir t obtenues lectroniquement en inclinant une police normale ; italic : Spcifie une police dite italique dans la base de donnes de police de l'agent utilisateur, ou, s'il n'y en a pas, une avec un label 'oblique'. Les polices dont le nom contient les mots Italic, Cursive ou Kursiv seront typiquement tiquetes 'italic'. Exemple(s) : 'font-variant' Valeur : normal | small-caps | inherit Initiale : normal Dans une police en petites capitales, les glyphes des lettres minuscules ont un aspect similaire aux lettres majuscules, cependant avec une taille rduite et des proportions lgrement diffrentes. La proprit 'font-variant' appelle ce genre de police bicamrale (qui a deux casses, comme les critures latines). Celle-ci ne produit aucun effet visible pour les critures monocamrales (qui n'ont qu'une seule casse, comme la plupart des systmes d'criture mondiaux). Les significations des valeurs sont : normal : Spcifie une police qui n'est pas tiquete comme tant en petites capitales ; small-caps :Spcifie une police tiquete comme tant en petites capitales. S'il n'y a pas une telle police, les agents utilisateurs devraient en effectuer la simulation, par exemple en slectionnant une police normale et y remplaant les lettres minuscules par des majuscules mises l'chelle. En dernier ressort, les lettres majuscules inchanges d'une police normale peuvent se substituer aux glyphes en petites capitales, ainsi le texte apparatrait entirement en majuscule.

48

Cration d'une application WEB avec PHP / MySQL

'font-weight' Valeur : normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit Initiale : normal S'applique : tous les lments Hrite : oui Pourcentage : sans objet Mdias : visuel La proprit 'font-weight' spcifie la graisse de la police. 'font-stretch' Valeur : normal | wider | narrower | ultra-condensed | extra-condensed | condensed | semicondensed | semi-expanded | expanded | extra-expanded | ultra-expanded | inherit La proprit 'font-stretch' slectionne les dessins normal, comprim ou largi dans une famille de polices. Les valeurs des mots-cls absolus, du plus troit au plus espac, sont : - ultra-condensed - extra-condensed - condensed - semi-condensed - normal - semi-expanded - expanded - extra-expanded - ultra-expanded Le mot-cl relatif 'wider' spcifie la valeur d'expansion suprieure celle hrite (sans effet si la valeur hrite est dj 'ultra-expanded'), l'inverse du mot-cl relatif 'narrower' celui-ci spcifiant la valeur de contraction infrieure celle hrite (sans effet si la valeur hrite est dj 'ultra-condensed').

49

Cration d'une application WEB avec PHP / MySQL

La taille de police : la proprit 'font-size' 'font-size' Valeur : <taille-absolue> | <taille-relative> | <longueur> | <pourcentage> | inherit Initiale : medium Cette proprit dcrit la taille d'une police spcifie explicitement. Celle-ci correspond au carr em, un concept issu de la typographie. Noter que certains glyphes peuvent dborder de leur carr em. Les significations des valeurs sont : <taille-absolue> Un mot-cl <taille-absolue> se rfre une entre de la table des tailles de police, celle-ci tant dresse et mise en uvre par l'agent utilisateur. Les valeurs possibles : [ xx-small | x-small | small | medium | large | x-large | xx-large ] Pour un cran de moniteur, on suggre un facteur d'chelle de 1.2 entre les valeurs conscutives de la table ; si la valeur 'medium' correspond 12pt, la valeur 'large' devrait correspondre 14.4pt. Les facteurs d'chelle peuvent diffrer selon les mdias considrs. Par ailleurs, l'agent utilisateur devrait prendre en compte la qualit et la disponibilit des polices au moment du calcul de cette table. Celle-ci peut aussi diffrer d'une famille de polices une autre. <taille-relative> Un mot-cl <taille-relative> s'entend par rapport la table des tailles de police et par rapport la taille de la police de l'lment parent. Les valeurs possibles : [ larger | smaller ] Par exemple, quand l'lment parent a une taille de police de valeur 'medium', l'lment en question ayant une valeur 'larger', la taille de police rsultante de celui-ci correspondra 'large'. Si la taille de police de l'lment parent a une valeur trop loigne d'une des valeurs de la table, l'agent utilisateur est libre d'effectuer une interpolation entre les deux valeurs qui la circonscrivent ou un arrondi la valeur la plus proche. L'agent utilisateur peut devoir procder une extrapolation des valeurs de la table quand une valeur numrique sort du champ des mots-cls. <longueur> Une valeur de longueur spcifie une taille de police absolue (indpendante de la table des tailles de police de l'agent utilisateur). Les valeurs ngatives ne sont pas admises ; <pourcentage> Une valeur en pourcentage spcifie une taille de police absolue par rapport celle de l'lment parent. Leur emploi, de mme pour les valeurs exprimes en 'em', conduit des feuilles de style plus fiables, en plein accord avec le principe de la cascade. La valeur relle, pour cette proprit, peut diffrer de la valeur calcule, la proprit 'fontsize-adjust' ayant une valeur numrique et certaines tailles de police tant indisponibles.
50

Cration d'une application WEB avec PHP / MySQL

Le texte
L'alina : la proprit 'text-indent' 'text-indent' Valeur : <longueur> | <pourcentage> | inherit Initiale : 0 Cette proprit spcifie un alina pour la premire ligne du texte dans un bloc. Plus prcisment, celui de la premire bote de la premire range dans la premire bote de ligne de ce bloc. Cette bote est indente partir du bord gauche (ou droit, pour une mise en page de droite gauche) de la bote de ligne. Les agents utilisateurs devraient reprsenter cette indentation comme un espace vide. L'alignement : la proprit 'text-align' 'text-align' Valeur : left | right | center | justify | <chane> | inherit Initiale : selon l'agent utilisateur et selon le sens d'criture Cette proprit dcrit l'alignement d'un contenu en-ligne dans un lment de type bloc. Les significations des valeurs sont : left, right, center et justify Respectivement, l'alignement gauche, droite, centr et justifi d'un texte ; <chane> Spcifie une chane sur laquelle les cellules d'une table vont s'aligner (voir le passage sur l'alignement horizontal dans une colonne pour le dtail et pour un exemple). Cette valeur ne s'applique qu'aux cellules d'une table. Applique un autre lment, celle-ci sera considre comme tant 'left' ou 'right', en fonction de la valeur de la proprit 'direction', respectivement 'ltr' ou 'rtl'. Un pav de texte consiste en un empilement de botes de ligne. Pour les valeurs 'left', 'right' et 'center', cette proprit indique la faon dont les botes en-ligne, dans chacune des botes de ligne, s'alignent par rapport aux cts gauche et droite de ces botes de ligne ; l'alignement n'est pas effectu par rapport l'espace de visualisation. Pour la valeur 'justify', l'agent utilisateur peut, en plus des ajustements de position, tirer les botes de ligne. Voir galement les proprits 'letter-spacing' et 'word-spacing').

51

Cration d'une application WEB avec PHP / MySQL

La dcoration: la proprit 'text-decoration' 'text-decoration' Valeur : none | [ underline || overline || line-through || blink ] | inherit Initiale : none S'applique : tous les lments Cette proprit dcrit les dcorations qui sont ajoutes au texte d'un lment. Quand la proprit est applique un lment de type bloc, elle agit sur tous les descendants de type en-ligne de celui-ci. Quand elle est applique un lment de type en-ligne, ou agit sur celui-ci, cette proprit influence toutes les botes gnres par cet lment. Quand les lments sont vides ou sans contenu textuel (ex. l'lment IMG en HTML), les agents utilisateurs doivent ignorer cette proprit. Les significations des valeurs sont : none : Aucune dcoration ; underline : Chaque ligne de texte est souligne ; overline : Chaque ligne de texte reoit un trait au-dessus ; line-through: Chaque ligne de texte est raye en son milieu ; blink : Le texte clignote (une alternance entre visible et invisible). Les agents utilisateurs conformes ne sont pas tenus de reconnatre cette valeur. Cette proprit n'est pas hrite, cependant les botes qui descendent d'une bote de bloc donne devraient recevoir la mme dcoration que celle-ci (ex. toutes devraient tre soulignes). La couleur de la dcoration devrait tre conserve, mme si la valeur de la proprit 'color' des lments descendants tait diffrente.

52

Cration d'une application WEB avec PHP / MySQL

Divers
Le positionnement des flottants : la proprit 'float' 'float' Valeur : left | right | none | inherit Initiale : none S'applique : tous les lments, sauf ceux positionns et ceux dont le contenu est gnr Cette proprit spcifie le flottement d'une bote gauche, droite ou pas du tout. On peut l'employer pour des lments gnrant des botes qui ne sont pas en position absolue. Voici la signification des valeurs que celle-ci admet : left : L'lment gnre une bote de bloc qui flotte gauche. Le contenu s'coule sur son flanc droit en commenant en haut (en fonction de la valeur de la proprit 'clear'). En ignorant la valeur de la proprit 'display', sauf si cette valeur est 'none' ; right : Identique 'left', mais en inversant la gauche de la droite ; none : La bote ne flotte pas.

53

Cration d'une application WEB avec PHP / MySQL

Le contr le du flux autour des flottants : la proprit 'clear' 'clear' Valeur : none | left | right | both | inherit Initiale : none S'applique : ceux des lments de type bloc Cette proprit indique quels cts d'une ou des botes d'un lment ne doivent pas tre adjacents une bote flottante prcdente. (Il peut arriver que l'lment lui-mme ait des descendants flottants, la proprit 'clear' n'a alors aucun effet sur eux). Cette proprit ne peut s'appliquer quaux lments de type bloc (dont les flottants). Dans le cas des botes compactes et en enfilade, la proprit s'applique la bote de bloc finale laquelle celles-ci appartiennent. Voici la signification des valeurs admises par la proprit quand on l'applique aux botes de bloc non flottantes : left : La marge haute de la bote gnre est augmente juste assez pour que le bord haut de sa bordure soit sous le bord externe bas d'une bote flottant gauche issue d'un lment prcdent du document source ; right : Reprendre le prcdent en inversant gauche et droite ; both : La bote gnre se dplace sous chacune des botes flottantes qui sont issues d'lments prcdents du document source ; none : La bote ne subit aucune contrainte de position vis--vis des flottants.

54

Cration d'une application WEB avec PHP / MySQL

La proprit 'display' 'display' Valeur : inline | block | list-item | ........ | none | inherit Initiale : inline S'applique : tous les lments Les valeurs de cette proprit ont le sens suivant : block : induit un lment gnrer une bote de bloc principale ; inline : induit un lment gnrer une ou plusieurs botes en-ligne ; list-item : induit un lment (ex. l'lment LI en HTML) gnrer une bote de bloc principale et une bote en-ligne pour un item de liste ; Consulter la partie traitant des listes pour des informations et des exemples de mise en forme de celles-ci ; none : cette valeur fait qu'aucune bote n'est gnre par l'lment dans la structure de formatage (c..d., cet lment n'a pas d'influence sur la mise en forme du document). Les lments qui en descendent ne gnrent pas de botes non plus ; on ne peut plus modifier leur comportement avec la proprit 'display'. Il est noter qu'une valeur 'none' ne cre pas de bote invisible, elle ne cre pas de bote du tout. CSS comprend des mcanismes permettant la gnration de botes dans la structure de formatage, botes qui influencent la mise en forme mais qui ne sont pas visibles. La visibilit : la proprit 'visibility' 'visibility' Valeur : visible | hidden | collapse | inherit Initiale : visible S'applique : tous les lments La proprit 'visibility' spcifie le rendu, ou non, des botes gnres par un lment donn. Ces botes, bien qu'invisibles, influencent toujours la mise en forme du document (utiliser la proprit 'display' avec la valeur 'none' pour prohiber la gnration d'une bote, et ainsi toutes influences sur la mise en forme). Les valeurs ont les significations suivantes : visible : La bote gnre est visible ; hidden : La bote gnre est invisible (entirement transparente), mais celle-ci influenant toujours la mise en forme

55

Cration d'une application WEB avec PHP / MySQL

Le dbordement : la proprit 'overflow' 'overflow' Valeur : visible | hidden | scroll | auto | inherit Initiale : visible S'applique : ceux des lments de type bloc et ceux remplacs Cette proprit spcifie si le contenu d'un lment de type bloc doit tre rogn quand celui-ci dborde de la bote de cet lment (qui se comporte comme un bloc conteneur). Les significations des valeurs sont : visible : Le contenu ne sera pas rogn, et celui-ci peut tre reprsent hors de la bote du bloc ; hidden : Le contenu sera rogn et aucun mcanisme de dfilement ne devrait tre fourni pour voir la partie qui aura t rogne. On spcifie la taille et la forme du reliquat du rognage avec la proprit 'clip' ; scroll : Le contenu sera rogn et, si disponible, l'agent utilisateur fournit un mcanisme de dfilement visible l'cran (tel qu'une barre de dfilement ou un dispositif panoramique), celui-ci devrait apparatre pour une bote donne, que le contenu de celle-ci soit rogn ou non. Ceci pour viter l'inconvnient que reprsenterait des barres de dfilement apparaissant et disparaissant dans un environnement dynamique. Quand cette valeur est spcifie conjointement avec un type de mdia 'print, la partie du contenu ayant dborde devrait aussi tre imprime ; auto : L'interprtation de cette valeur dpend de l'agent utilisateur, cependant, celui-ci devrait fournir un mcanisme de dfilement quand les botes dbordent. Mme quand la valeur de la proprit 'overflow' est 'visible', il peut arriver que le contenu soit rogn par le systme d'exploitation, pour tenir dans la fentre du document de l'agent utilisateur.

Valider sa feuille de style CSS


Aprs l'criture ou la gnration de feuilles de styles CSS, on peut vrifier la validit de celles ci grce un service de validation du W3C. Service de validation CSS : http://jigsaw.w3.org/css-validator/ (fourni par le W3C)

56

Cration d'une application WEB avec PHP / MySQL

Exemple : MyForum avec CSS


Voici un exemple de feuille de style CSS (default.css) :
* { font-family: Verdana, Arial, sans-serif; } *.left { text-align: left; } *.center { text-align: center; } *.right { text-align: right; } body { background: #FFFFFF; color: #000000; } a:link { color: #800060; background: transparent; text-decoration: none; } a:visited { color: #800060; background: transparent; text-decoration: none; } a:hover { color: #FFFFFF; background: #800060; text-decoration: none; } div.header { border-bottom: 1px #800050 solid; } div.header h1 { font-size: 30pt; color: #800050; } hr { display: none; } img.icon { float: left; } div.main { margin: 20px; } div.err { text-align: center; font-size: 12pt; font-weight: bold;
57

Cration d'une application WEB avec PHP / MySQL color: #FF0000; } div.box { margin-left : 20%; margin-right : 20%; margin-top: 15px; margin-bottom: 15px; background: #800050; color: #FFFFFF; } div.box h1 { font-size: 14pt; text-align: center; color: #FFFFFF; } div.field { margin-top: 10px; width:70%; text-align:right; font-size: 8pt; font-weight: bold; } div.field2 { margin-top: 10px; margin-left: 10%; text-align:left; font-size: 8pt; font-weight: bold; } div.buttons { margin-top: 10px; padding-top: 10px; border-top: 1px white solid; text-align: center; font-size: 8pt; font-weight: bold; } input.button { margin: 5px; background: #C00060; color: #ffffff; border-color: #C00060; } div.pwd { background: #C0C0C0; font-size: 12pt; font-weight: bold; margin-bottom: 20px; } table { margin-top: 15px; margin-left : 10%; width:80%; border-collapse: collapse; border-spacing: 0; border: 1px #C00060 solid; background: #800050; color: #FFFFFF; } caption { margin: 15px;
58

Cration d'une application WEB avec PHP / MySQL text-align: center; color: #800050; font-size: 14pt; font-weight: bold; } table.old caption { display: none; } table a:link { color: #FFFFFF; background: transparent; text-decoration: none; } table a:visited { color: #FFFFFF; background: transparent; text-decoration: none; } table a:hover { color: #FFFF00; background: transparent; text-decoration: none; } td { border-top: 1px #C00060 solid; font-size: 8pt; } th { border-top: 1px #C00060 solid; background: #C00060; text-align: left; font-size: 8pt; font-weight: bold; } textarea { font-size: 8pt; } div.footer { border-top: 1px #800050 solid; font-size: 8pt; }

59

Cration d'une application WEB avec PHP / MySQL

Voici galement ce que celadonne lorsque l'on applique la feuille de style la page XHTML dveloppe prcdemment :

Pour appliquer la feuille CSS il faut rajouter la ligne suivante dans la partie <head></head> de la source XHTML :
<link rel="stylesheet" href="default.css" type="text/css" />

60

Cration d'une application WEB avec PHP / MySQL

VIII.Programmation de l'application
Une fois le modle de donnes dfinit et le maquettage de l'application ralis, on peut remplacer le contenu statique de nos page web par de la programmation PHP, Nous allons donc voir dans un premier temps les bases du langage PHP, puis, dans un deuxime temps la programmation que nous allons implmenter dans nos pages HTML pour rendre notre forum Oprationnel.

61

Cration d'une application WEB avec PHP / MySQL

IX.Le langage PHP


PHP est un langage de scripts multi plates-formes, embarqu dans des documents HTML. Plus simplement PHP vous offre un moyen de placer des instructions dans vos documents HTML en vue de crer des contenus dynamiques. Ces instructions sont lues et analyses par le serveur web. Elles ne parviennent jamais jusqu'au navigateur qui affiche la page. Le serveur web remplace le code PHP par le contenu que le code avait pour but de gnrer.

Les bases du langage


PHP est un vritable langage de programmation. Syntaxiquement il tient du Perl et du C. Il s'agit d'un langage interprt, c'est dire que les fichiers crits dans ce langage ne ncessitent pas de compilations ou de traitement spcifique de la part d'une application tierce. Ce que vous codez en PHP est directement utilisable sur votre serveur Web. Commentaires L'utilit de placer des commentaires judicieux dans votre code source n'est aujourd'hui plus dmontrer, en effet il permet de prciser les algorithmes utilis dans un langage humain, ce qui simplifie grandement la maintenance ou le dbogage du programme. Le PHP fournit trois types de commentaires :
/* Commentaire de type C */ // Commentaire de type C++ # Commentaire de type Shell ou Perl

62

Cration d'une application WEB avec PHP / MySQL

Variables Le PHP est un langage non typ. En clair, cela signifie qu'une variable peut contenir indiffremment une valeur numrique ou une chaine de caractres. par opposition, les langages typs comme le C obligent dfinir une variable d'un certain type en fonction de ce qu'elle va contenir. Les variables en PHP sont prfixs par le caractre '$'. Le langage PHP permet de manipuler trois genres de variables :

Les variables scalaires :


$toto=5

Les tableaux :
$tab[0]="philippe"

Les tableaux associatifs :


$age["philippe"]=27

Types de donnes PHP fournit trois types de donnes primaires : nombres entiers, nombres dcimaux et chanes. Entiers La plage des entiers dans PHP est quivalente la porte du type long du langage C. Sur les plateformes 32 bits, les valeurs entires vont de -2147483648 +2147483647. PHP convertit automatiquement les valeurs suprieures en nombre dcimaux. Un entier peut tre exprim en dcimal (base 10), hexadcimal (base 16) ou en octal (base 8). Par exemple :
$decimal = 16; $hex = 0x10; $octal=020;

Nombres dcimaux La plage des nombres dcimaux dans PHP est quivalente la port du type double en C. Les valeurs, sur la plupart des plateformes, vont de 1.7E-308 1.7E+308. Un nombre dcimal peut tre exprim sous forme de nombre normal avec un point dcimal ou en notation scientifique. Par exemple :
$var = 0.017; $var = 17.0E-3;

63

Cration d'une application WEB avec PHP / MySQL

Chanes Une chane est une squence de caractres. Une chane peut tre dlimit par des guillemets simples ou doubles :
'Bonjour tous' "C'est cool le PHP"

Les chaines places entre doubles guillemets sont sujettes aux substitutions de variables et au traitement des squences d'chappement, alors que celles places entre guillemets simples ne le sont pas :
$a = "jour!"; /* affiche : Bon jour! */ echo "Bon\t$a"; /* affiche : Bon\t$a */ echo 'Bon\t$a';

Tableau des squences d'chappements \n Nouvelle ligne \t \r \\ \$ Tabulation Retour chariot Anti slash Signe dollar

Valeurs Boolennes Chaque valeur possde dans PHP une valeur boolenne dite de vrit (true ou false) qui lui est associ. C'est typiquement utilis dans les structures de contrle, telles que if/else ou for. Expressions L'expression est la pierre matresse du langage. Tout ce qui possde une valeur peut tre considr comme une expression, voici quelques exemples :
5 5+5 $a $a==5 sqrt(9)

64

Cration d'une application WEB avec PHP / MySQL

Oprateurs Les expressions sont combines et manipules l'aide d'oprateurs. Le tableau ci dessous dresse la liste des oprateurs disponibles ainsi que leur priorit et leur associativit. Ces oprateurs devraient vous paratre familier si vous avez une exprience du C, Java ou de Perl : Oprateurs Priorit Associativit !, ~, ++, --, @, (oprateurs de transtypage) *, /, % +, -, . <<, >> <, <=, >=, > ==, != & ^ | && || ? : (oprateur conditionnel) And Xor Or 16 15 14 13 12 11 10 9 8 7 6 5 3 2 1 Droite Gauche Gauche Gauche Non associatif Non associatif Gauche Gauche Gauche Gauche Gauche Gauche Gauche Gauche Gauche Gauche

=, +=, -=, *=, /=, %=, ^=, .=, &=, |= 4

65

Cration d'une application WEB avec PHP / MySQL

Structures de contr les Les structures de contrle de PHP sont trs similaires celles utilises par le langage C. Elles sont utilises pour contrler un flux logique dans un script PHP. If L'instruction if est une condition standard que l'on trouve dans la plupart des langages. Elle force l'excution d'un code particulier si l'expression sur laquelle elle agit est true.
if (expr) { instructions } elseif (expr) { instructions } else { instructions }

Switch L'instruction switch peut tre utilise la place d'une longue instruction if. L'expression de chaque instruction case est compare l'expression switch et, si elles correspondent, le code suivant cette instruction est excute.
switch (expr) { case expr: instructions break; default: instructions break; }

While L'instruction while est une construction de boucle qui excute du code de faon rptitive aussi longtemps qu'une expression particulire est vraie. L'expression est vrifie avant chaque dmarrage de la boucle.
while (expr) { instructions }

On peut arrter le fonctionnement d'une boucle par l'instruction break. On peut galement sauter le reste des instructions et recommencer l'itration par le mot cl continue.

66

Cration d'une application WEB avec PHP / MySQL

Do/while L'instruction do/while est similaire l'instruction while, exception faite que l'expression est vrifie en fin d'itration au lieu du dbut :
do { instructions } while (expr)

For une boucle for offre une construction plus complexe que la simple boucle while. Elle contient trois expressions :

La premire est l'expression de dmarrage, elle n'est excuter qu'en dbut de la premire itration, on l'utilise en gnral pour initialiser un compteur. La seconde est une expression conditionnelle qui contrle l'itration de la boucle. Cette expression est vrifie en dbut de chaque itration. La troisime expression est value en fin de chaque itration. Elle est en gnral utilise pour incrmenter un compteur de boucle.
for (start_expr; cond_expr; iter_expr) { instructions }

Fonctions Une fonction est une squence d'instructions de code, dote d'un nom, qui peut accepter des paramtres et qui retourne une valeur. Un appel de fonction est une expression ayant une valeur; cette valeur est la valeur retourne par la fonction. PHP propose un grand nombre de fonctions internes. PHP prend galement en charge les fonctions dfinies par l'utilisateur. Pour dfinir une fonction on utilise le mot cl function :
function bonjour ($prenom) { return "Bonjour $prenom !"; }

Aprs avoir dfinit une fonction, on l'appelle l'aide d'arguments appropris :


echo bonjour("Philippe");

On peut galement dfinir des fonctions avec des paramtres optionnels. Il faut pour cela donner une valeur par dfaut au paramtre optionnel :
function bonjour ($prenom="tout le monde") { return "Bonjour $prenom !"; }

67

Cration d'une application WEB avec PHP / MySQL

Programmation objet Une classe est une collection de variables et de fonctions qui fonctionnent avec ces variables. Une classe est dfinie en utilisant la syntaxe suivante :
<? class Caddie { var $items; // Elments de notre panier

// Ajout de $num articles de type $artnr au panier function add_item ($artnr, $num) { $this->items[$artnr] += $num; } // Suppression de $num articles du type $artnr du panier function remove_item ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return TRUE; } else { return FALSE; } } } ?>

68

Cration d'une application WEB avec PHP / MySQL

L'exemple ci-dessus dfinit la classe Caddie qui est compose d'un tableau associatif contenant les articles du panier et de deux fonctions, une pour ajouter et une pour enlever des lments au panier. Note : En PHP 4, seuls les initialiseurs constants pour les variables var sont autoriss. Utilisez les constructeurs pour les initialisations variables, ou utilisant des expressions.
<? /* Aucune de ces syntaxes ne fonctionnera en PHP 4 */ class Caddie { var $date_du_jour = date("d/m/Y"); var $name = $firstname; var $owner = 'Fred ' . 'Jones'; /* etc... */ } /* Voici comment cela doit se faire dsormais. */ class Caddie { var $date_du_jour; var $name; var $owner; function Caddie() { $this->date_du_jour = date("d/m/Y"); $this->name = $GLOBALS['firstname']; /* etc... */ } } ?>

Les classes forment un type de variable. Pour crer une variable du type dsir, vous devez utiliser l'oprateur new.
<? $cart = new Caddie; $cart->add_item("10", 1); ?>

L'instruction ci-dessus cre l'objet $cart de la class Caddie. La fonction add_idem() est appele afin d'ajouter l'article numro 10 dans le panier. Une classe peut tre une extension d'une autre classe. Les classes "extended" ou "derived" hritent de toutes les variables et de toutes les fonctions de la classe pre plus toutes les dfinitions que vous rajoutez cette classe. Cela se fait avec le mot clef "extends". L'hritage multiple n'est pas support.
<? class Caddie_nomme extends Caddie { var $owner; function set_owner ($name) { $this->owner = $name; } } ?>

69

Cration d'une application WEB avec PHP / MySQL

L'exemple ci-dessus dfinit la classe Caddie_nomme qui possde les mme variables que la classe Caddie et la variable $owner en plus, ainsi que la fonction set_owner(). Vous crez un panier nominatif de la mme manire que prcdemment, et vous pouvez alors affecter un nom au panier ou en connatre le nom. Vous pouvez de toutes les faons utiliser les mmes fonctions que sur un panier classique.
<? $ncart = new Caddie_nomme; $ncart->set_owner ("kris"); print $ncart->owner; $ncart->add_item ("10", 1); pre) ?> // // // // Cration d'un panier nominatif Affectation du nom du panier Affichage du nom du panier (hritage des fonctions de la classe

Dans les fonctions d'une classe, la variable $this est gale l'objet de la classe. Vous pouvez utilisez la forme "$this->quelquechose" pour accder aux fonctions ou aux variables de l'objet courant. Aussi bien depuis l'objet lui-mme que de l'extrieur, vous n'avez pas besoin de $ pour accder aux proprits d'un objet.
<? $ncart->owner = "chris"; // pas de '$' $ncart->$owner = "chris"; // Ceci est invalide, car $ncart->$owner quivaut $ncart->"" $myvar = 'owner'; $ncart->$myvar = "chris"; // Ceci est valide, car $ncart->$owner quivaut $ncart->owner ?>

Le constructeur est la fonction qui est appele automatiquement par la classe lorsque vous crez une nouvelle instance d'une classe. La fonction constructeur a le mme nom que la classe.
<? class Auto_Caddie extends Caddie { function Auto_Caddie () { $this->add_item ("10", 1); } } ?>

L'exemple ci-dessus dfinit la classe Auto_Caddie qui hrite de la classe Caddie et dfinit le constructeur de la classe. Ce dernier initialise le panier avec 1 article de type numro 10 ds que l'instruction "new" est appele. La fonction constructeur peut prendre ou non, des paramtres optionnels, ce qui la rend beaucoup plus pratique.

70

Cration d'une application WEB avec PHP / MySQL

<? class Constructor_Caddie extends Caddie { function Constructor_Caddie ($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Place dans le caddie toujours la mme chose... $default_cart = new Constructor_Caddie; // Place dans le caddie des objets diffrents, comme dans la ralit $different_cart = new Constructor_Caddie ("20", 17); ?>

Pour les classes qui utilisent l'hritage, le constructeur de la classe pre n'est pas automatiquement appel lorsque le constructeur de la classe drive est appel.

71

Cration d'une application WEB avec PHP / MySQL

PHP dans les pages XHTML


Vous avez peut tre remarqu, que tout ce qui est affich l'aide de l'instruction echo figure dans le code HTML final, envoy au navigateur. C'est la base du fonctionnement de PHP comme langage embarqu dans HTML et galement sa grande force par rapport l'utilisation de scripts ou d'excutables CGI. L'imbrication de PHP dans HTML, permet ainsi de crer des fichiers mixtes. On comprend alors pleinement les avantages de PHP. Ci dessous un petit exemple de script PHP :
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Page de bienvenue</title> <meta http-equiv="content-type" content="text/html; charset=ISO8859-1"> </head> <body> <h1>Bienvenue sur ce site</h1> <hr /> <? $action=$HTTP_POST_VARS["action"]; if ($action!="OK") { echo "<form action=\"bienvenue.php\" method=\"POST\">\n"; echo "<h2>Veuillez entrer votre Prnom et votre anne de naissance</h2>\n"; echo "<strong>Prenom : </strong><input type=\"text\" name=\"prenom\" value=\"\" /><br/>\n"; echo "<strong>Anne de naissance : </strong><input type=\"text\" name=\"dnaiss\" value=\"\" /> <br/>\n"; echo "<input type=\"submit\" name=\"action\" value=\"OK\" />"; echo "</form>"; } else { $prenom=$HTTP_POST_VARS["prenom"]; $dnaiss=$HTTP_POST_VARS["dnaiss"]; $date=date("Y"); echo "<h2>Bonjour $prenom</h2>\n"; echo "Aujourd'hui nous somme le ",date("d/m/Y"),"<br />\n"; echo "Tu as <strong>",($date-$dnaiss),"</strong> ans.<br />\n"; } ?> <hr /> Copyright (c) 2003 - Philippe BOUSQUET.<br /> Ce logiciel est sous licence <strong>Gnu General Public License</strong>. </body> </html>

72

Cration d'une application WEB avec PHP / MySQL

Les fonctions prdfinies


Nous ne verrons ici que les fonctions dont nous allons nous servir pour la cration de notre forum, pour avoir la liste complte des fonctions disponibles en PHP veuillez consulter la page : http://dev.nexen.net/docs/php/manuel_toc.html#functions Sessions La gestion des sessions avec PHP est un moyen de sauver des informations entre deux accs. Cela permet notamment de construire des applications personnalises, et d'accrotre l'attrait de votre site. Chaque visiteur qui accde votre site se voit assigner un numro d'identifiant, appel plus loin "identifiant de session". Celui ci est enregistr soit dans un cookie, chez le client, soit dans l'URL. Les sessions vous permettront d'enregistrer des variables, pour les prserver et les rutiliser tout au long des requtes. Lorsqu'un visiteur accde votre site, PHP vrifiera automatiquement (si session.auto_start est 1) ou manuellement (explicitement avec session_start() ou implicitement avec session_register()) si une session a dj t ouverte. Si une telle session existe dj, l'environnement prcdent sera recr. Toutes les variables enregistrer seront enregistres sur le disque la fin de chaque requte. Les variables enregistres mais non dfinies seront marques comme tel. Lors des accs ultrieurs, elles ne seront dfinies que si l'utilisateur le fait. Il y a deux modes de propagation de l'identifiant de session :

Cookies Paramtre URL

Le module de session supporte les deux techniques. La mthode par cookie est optimale, mais tant donn le peu de fiabilit (les clients peuvent les refuser, ou les effacer), on ne peut pas se contenter de cette technique. La deuxime mthode place l'identifiant de session directement dans l'URL. session_start Initialise les donnes de session
bool session_start (void)

session_start() cre une session (ou continue la session courante, en fonction de l'identifiant de session pass par une variable GET ou par un cookie) session_start() retourne toujours TRUE. session_destroy Dtruit toutes les donnes enregistres d'une session
bool session_destroy (void)

session_destroy() dtruit toutes les donnes associes la session courante. session_destroy() retourne TRUE en cas de succs, et FALSE sinon.
73

Cration d'une application WEB avec PHP / MySQL

session_name Affecte et/ou retourne le nom de la session courante


string session_name (string name )

session_name()retourne le nom de la session courante. Si name est fourni, le nom de la session changera, et prendra la valeur fournie. Le nom de session fait rfrence l'identifiant de session dans les cookies. Il ne doit contenir que des caractres alphanumriques; il doit tre court et descriptif. (i.e. surtout pour les utilisateurs d'alertes de cookie). Le nom de session est remis une valeur par dfaut, enregistres dans session.name au moment du dmarrage. Ainsi, vous devez appeler session_name() chaque requte (et avant session_start() ou session_register()). Exemple:
<? # Change le nom de la session WebsiteID $previous_name = session_name ("WebsiteID"); echo "L'ancien nom de la session tait $previous_name<P>"; ?>

session_id Affecte et/ou retourne l'identifiant de session courante


string session_id (string id)

session_id() retourne l'identifiant de session courante. Si id est fourni, il remplacera l'identifiant courant de la session. La constante SID peut aussi tre utilise pour retrouver le nom de la session courante et son identifiant, comme chane ajouter dans les URL. session_register Enregistre une variable dans la session courante
bool session_register (mixed name, mixed ...)

session_register() enregistre une variable avec le nom name dans la session courante. session_register() accepte un nombre d'arguments variable, qui peuvent tre soit des chanes reprsentants le nom de la variable, soit un tableau, contenant des chanes ou d'autres tableaux (cas d'un tableau rcursif). session_register() retourne TRUE lorsque les variables sont correctement enregistres. session_unregister Supprime une variable dans la session courante
bool session_unregister (mixed name)

session_unregister() supprime la variable nomme name dans la session courante. session_unregister() retourne TRUE lorsque la variable a t correctement supprime de la session.

74

Cration d'une application WEB avec PHP / MySQL

Envoi de mail
bool mail (string to, string subject, string message, string additional_headers, string additional_parameters )

mail() poste automatiquement le message message destination de to. Les destinataires multiples doivent tre spars par des virgules. Envoi de courrier lectronique (mail)
<? mail("rasmus@lerdorf.on.ca", "Mon Sujet", "Ligne 1\nLigne 2\nLigne 3"); ?>

Le quatrime argument pass sera insr la fin de l'entte. Typiquement, cela permet d'insrer des enttes supplmentaires. Les enttes multiples doivent tre spars par des virgules. Si le cinquime argument additional_parameters est fourni, PHP l'utilisera dans son appel du programme d'envoi de courrier lectronique. Ceci est pratique pour passer une valeur correcte l'entte Return-Path, avec sendmail. Note : Le cinquime paramtre a t ajout en PHP 4.0.5. Envoi de eMail avec des enttes supplmentaires.
<? mail("nobody@aol.com", "Le sujet", $message, "From: webmaster@$SERVER_NAME\nReplyTo:webmaster@$SERVER_NAME\nX-Mailer:PHP/" . phpversion()); ?>

Avec le cinquime paramtre, vous pouvez ajouter d'autres paramtres de ligne de commande qui seront utiliss par le programme d'envoi de courrier. Dans l'exemple cidessous, l'entte Return-Path est correctement paramtr. Normalement, sendmail ajoute automatiquement l'entte X-Authentication-Warning (paramtre -f), car l'utilisateur "serveur web" n'est probablement pas un de ses utilisateurs de confiance ("trusted users"). Pour supprimer cette alerte, ajoutez l'utilisateur du serveur web dans la configuration de sendmail. Envoi de eMail avec des enttes supplmentaires et un paramtre de ligne de commande supplmentaire
<? ?> mail("nobody@aol.com", "the subject", $message, "From: webmaster@$SERVER_NAME", "-fwebmaster@$SERVERNAME");

75

Cration d'une application WEB avec PHP / MySQL

MySQL Ces fonctions vous permettent d'accder aux bases de donnes MySQL. Afin de pouvoir les utiliser, vous devez compiler PHP avec le support MySQL, en utilisant l'option --with-mysql. Si vous utilisez cette fonction sans prciser le chemin d'accs la base MySQL, PHP utilisera les librairies cliente MySQL fournies en standard. Les utilisateurs qui font tourner d'autres applications qui utilisent elles-mmes MySQL (par exemple, PHP 3 et PHP 4 utiliss comme des modules concurrents apache, ou encore auth-mysql), devrait toujours spcifier le chemin jusqu' MySQL : --with-mysql=/path/to/mysql. Cela va forcer PHP utiliser les librairies clientes installes par MySQL et vitera les conflits. Plus d'informations sont disponibles http://www.mysql.com/. La documentation de MySQL est disponibles http://www.mysql.com/documentation/, ainsi qu'en franais chez nexen. mysql_affected_rows Retourne le nombre de lignes affectes lors de la dernire requte SQL.
int mysql_affected_rows (resource link_identifier )

mysql_affected_rows() retourne le nombre de lignes affectes lors de la dernire requte INSERT, UPDATE ou DELETE sur le serveur associ l'identifiant de connexion. Si cet identifiant n'est pas prcis, mysql_affected_rows() utilise la dernire connexion ouverte. Si la dernire requte a chou, mysql_affected_rows() retourne -1. mysql_close Ferme la connexion MySQL
bool mysql_close (ressource link_identifier )

mysql_close() retourne TRUE en cas de succs et FALSE sinon. mysql_close() ferme la connexion au serveur MySQL associe l'identifiant link_identifier. Si cet identifiant n'est pas spcifi, cette commande s'applique la dernire connexion ouverte. mysql_connect Ouvre une connexion un serveur MySQL
int mysql_connect (string hostname, string username, string password )

mysql_connect() retourne un identifiant positif de connexion en cas de succs, et sinon FALSE. mysql_connect() tablit une connexion un serveur MySQL. Tous les arguments sont optionnels, et s'ils manquent, les valeurs par dfaut sont utilises ( ('localhost', nom du propritaire du processus, mot de passe vide). Si un second appel mysql_connect() est fait avec les mmes arguments, PHP ne va pas ouvrir une nouvelle connexion, mais va retourner l'identifiant de la connexion dj ouverte. Le lien sera ferm automatiquement ds que l'excution du script sera termine, moins d'tre ferm explicitement avec mysql_close().
76

Cration d'une application WEB avec PHP / MySQL

Example MySQL connect


<?PHP $link = mysql_connect ("kraemer", "marliesle", "secret") or die ("Connexion impossible"); print ("Connexion russie"); mysql_close ($link); ?>

mysql_db_query Envoie une requte MySQL un serveur MySQL


resource mysql_db_query (string database, string query, resource link_identifier)

mysql_db_query() retourne un identifiant de rsultat si la requte russit et FALSE sinon. mysql_db_query() slectionne une base de donnes et excute une requte. Si l'identifiant de lien link_identifier n'est pas prcis, mysql_db_query() prendra par dfaut la dernire connexion ouverte sur le serveur et si elle n'en trouve pas, elle tentera de se connecter, en utilisant la fonction mysql_connect(), sans arguments. mysql_errno Retourne le numro de message d'erreur de la dernire opration MySQL.
int mysql_errno (ressource link_identifier )

mysql_errno() retourne le numro de message d'erreur de la dernire opration MySQL sur la connexion courante, ou sur la connexion spcifie avec l'option link_identifier. Les erreurs qui sont remontes depuis le serveur MySQL ne sont plus des alertes. A la place, il faut utiliser mysql_errno() pour obtenir le numro d'erreur. mysql_error Retourne le texte associe avec l'erreur gnre lors de la dernire requte.
string mysql_error (resource link_identifier )

mysql_error() retourne le dernier message d'erreur MySQL sur la connexion courante, ou sur la connexion spcifie avec link_identifier. Les erreurs gnres par mySQL ne se transforment plus en alerte. A la place, elles sont accessibles via ces fonctions :
<?PHP mysql_connect("marliesle"); echo mysql_errno().": ".mysql_error()."<BR>"; mysql_select_db("nonexistentdb"); echo mysql_errno().": ".mysql_error()."<BR>"; $conn = mysql_query("SELECT * FROM nonexistenttable"); echo mysql_errno().": ".mysql_error()."<BR>"; ?>

77

Cration d'une application WEB avec PHP / MySQL

mysql_fetch_array Retourne une ligne de rsultat sous la forme d'un tableau associatif.
array mysql_fetch_array (resource result_identifier, int result_type )

mysql_fetch_array() retourne un tableau qui contient la ligne demande, ou FALSE si il ne reste plus de ligne. mysql_fetch_array() est une version tendue de mysql_fetch_row(). En plus d'enregistrer les donnes sous forme d'un tableau indice numrique, elle peut aussi les enregistrer dans un tableau associatif, en utilisant les noms des champs comme indices. Si plusieurs colonnes ont le mme nom, la dernire colonne aura la priorit. Pour accder aux autres colonnes du mme nom, vous devez utiliser l'index numriques, ou faire un alias pour chaque colonne. Il est important de souligne que mysql_fetch_array() N'est PAS plus lente que mysql_fetch_row(), tandis qu'elle ajoute un confort d'utilisation notable. .
<?PHP mysql_connect($host,$user,$password); $result = mysql_db_query("database","select * from table"); while($row = mysql_fetch_array($result)) { echo$row["user_id"]; echo $row["fullname"]; } mysql_free_result($result); ?>

mysql_fetch_row Retourne une ligne de rsultat sous la forme d'un tableau


array mysql_fetch_row (resource result_identifier)

mysql_fetch_row() retourne un tableau numr qui correspond la ligne demande, ou FALSE, si il ne reste plus de ligne. mysql_fetch_row() va rechercher une ligne dans le rsultat associ l'identifiant de rsultat spcifi. La ligne est retourne sous la forme d'un tableau. Chaque colonne est enregistr sous la forme d'un tableau commenant la position 0. Les appels suivants mysql_fetch_row() retourneront la ligne suivante dans le rsultat, ou FALSE si il n'y a plus de ligne disponible. mysql_free_result Efface le rsultat de la mmoire
int mysql_free_result (resource result_identifier)

mysql_free_result() n'est appeler que si vous avez peur d'utiliser trop de mmoire durant l'excution de votre script. Toute la mmoire associe l'identifiant de rsultat sera automatiquement libre.

78

Cration d'une application WEB avec PHP / MySQL

mysql_num_rows Retourne le nombre de ligne d'un rsultat


int mysql_num_rows (resource result_identifier)

mysql_num_rows() retourne le nombre de lignes d'un rsultat. Cette commande n'est valide que pour les commandes SELECT . Pour connatre le nombre de lignes retournes par INSERT, UPDATE ou DELETE, utilisez mysql_affected_rows(). Exemple mysql_num_rows() par crubel@trilizio.org
<?PHP $conn = mysql_connect("adresse de l'hote", "utilisateur", "mot de passe"); mysql_select_db("base",$conn); // ncessaire si vous avez plusieurs bases $Resultfornummembers = mysql_query("SELECT * FROM Accounts",$conn); $NumMembers = mysql_num_rows($Resultfornummembers); echo"$NumMembers Membres"; ?>

mysql_query Envoie une requte SQL un serveur MySQL


resource mysql_query (string query, resource link_identifier )

mysql_query() envoie une requte SQL la base de donnes actuellement active sur le serveur MySQL. Si link_identifier n'est pas prcis, la dernire connexion est utilise. Si aucune connexion n'a t ouverte, la fonction tentera d'en ouvrir une, avec la fonction mysql_connect() mais sans aucun paramtre (c'est dire avec les valeurs par dfaut). mysql_query() retourne TRUE ou FALSE, pour indiquer le succs ou l'chec de la requte. En cas de retour TRUE, la requte tait valide et a pu tre excut sur le serveur. Cela n'indique pas le nombre de ligne affectes, ou retournes. Il est parfaitement possible qu'une requte valide n'affecte aucune ligne ou ne retourne aucune ligne. mysql_result Retourne un champ d'un rsultat
mixed mysql_result (resource result_identifier, int row, mixed field )

mysql_result() retourne le contenu d'un champ dans le rsultat MySQL result_identifier. L'argument row peut-tre un offset de champs, ou le nom d'un champ, ou le nom de la table + point + le nom du champ ("table.champ"). Si la colonne a t aliase, utilisez de prfrence l'alias. Lorsque vous travaillez sur des rsultats de grande taille, vous devriez utiliser une des fonctions qui vont rechercher une ligne entire dans un tableau. Ces fonctions sont NETTEMENT plus rapides. De plus, l'utilisation d'un offset numriques est aussi beaucoup plus rapide que de spcifier un nom littral. Les appels mysql_result() ne devraient pas tre mlangs avec d'autres fonctions qui travaillent aussi sur le rsultat.

79

Cration d'une application WEB avec PHP / MySQL

mysql_select_db Slectionne une base de donnes MySQL


int mysql_select_db (string database_name, resource link_identifier )

mysql_select_db() retourne TRUE en cas de succs, FALSE sinon. mysql_select_db() change la base de donnes active sur la connexion reprsente par link_identifier. Si aucun identifiant n'est spcifi, la dernire connexion est utilise. S'il n'y a pas de dernire connexion, la fonction tentera de se connecter seule, avec mysql_connect() et les paramtres par dfaut. Toutes les requtes suivantes avec mysql_query() seront faites avec la base de donnes active. Chaines de Caractres strtoupper Met tous les caractres en majuscules
string strtoupper (string string)

strtoupper() retourne string avec tous ses caractres alphabtiques mis en majuscule. Notez que le caractre 'alphabtique' est dtermin par la table de caractres locale. Par exemple, dans la table des caractres par dfaut du "C", des caractres tels que a-umlaut () ne seront pas convertis. Exemple avec strtoupper()
<?PHP $str = "Marie A Un Petit Agneau, Et Elle L'Adore"; $str = strtoupper($str); print $str; # Affiche : MARIE A UN PETIT AGNEAU, ET ELLE L'ADORE ?>

strtolower Met tous les caractres en minuscules


string strtolower (string string)

strtolower() retourne string avec tous ses caractres alphabtiques mis en majuscule. ucfirst Met tous le premier caractre de la chane en majuscule
string ucfirst (string string)

ucfirst() retourne string avec le premier caractre mis en majuscule.

80

Cration d'une application WEB avec PHP / MySQL

X.L'application my Forum
Voici la structure de l'application :
myForum/ +----- imgs/ | +----- linux.png +----- inc/ | +----- config.inc.php | +----- session.inc.php | +----- user.inc.php +----- default.css +----- editer.php +----- inscription.php +----- inscrit.php +----- login.php +----- mail.php +----- messages.php +----- savemessage.php +----- sujets.php +----- themes.php

La classe Config
Cette classe permet de stocker dans un objet les donnes permettant d'accder la base de donnes, elle permet galement de vrifier que la connexion au serveur MySQL est OK.
<? //----------------// config.inc.php //----------------class var var var var Config { $db_host; $db_name; $db_user; $db_pass;

function Config() { $this->db_host="localhost"; $this->db_name="myforum"; $this->db_user="root"; $this->db_pass=""; } function getDbHost() { return $this->db_host; } function getDbName() {
81

Cration d'une application WEB avec PHP / MySQL return $this->db_name;

function getDbUser() { return $this->db_user; } function getDbPass() { return $this->db_pass; } function testConnection() { $dbh=mysql_connect($this->getDbHost(),$this->getDbUser(), $this->getDbPass()); if ($dbh==false) { return false; } else { $dbh=mysql_select_db($this->getDbName()); if ($dbh==false) { return false; } else { return true; } } }

} ?>

82

Cration d'une application WEB avec PHP / MySQL

La classe Session
Cette classe cre un objet permettant de grer les sessions : rcuprations de donnes, sauvegarde de donnes (notez l'utilisation de $_SESSION au lieu de session_(un)register), modifications des URL (ajout des params de session).
<? //----------------// session.inc.php //----------------class Session { // Constructeur function Session() { session_start(); } // Support Session pour les urls function parseURL($url,$vars="") { return $url."?".session_name()."=".session_id(). ($vars!=""?"&".$vars:""); } // Sauvegarde d'une variable function save($name,$value) { $_SESSION[$name]=$value; } // Charger une variable sauvegarde function load($name) { return $_SESSION[$name]; } // Fermer la session function close() { session_destroy(); }

} ?>

83

Cration d'une application WEB avec PHP / MySQL

La classe User
Cette classe cre un objet permettant de grer l'utilisateur.
//----------------// user.inc.php //----------------class var var var var User { $user_code; $user_name; $user_firstname; $user_email;

// Constructeur function User() { $user_code=""; $user_name=""; $user_firstname=""; $user_email=""; } // Verification de la session function isValid($session) { // La session est elle active $this->restoreData($session); if ($this->getId()=="") { return false; } else { // La session est active return true; } } function connect($cuser,$pass,$cfg,$session) { $this->user_code=$cuser; $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query("SELECT id_user, name, firstname, email FROM users WHERE id_user='$cuser' AND passwd='$pass';"); if (mysql_num_rows($dbr)>0) { $enr=mysql_fetch_array($dbr); if ($enr['id_user']==$this->user_code) { $this->user_name = $enr['name']; $this->user_firstname = $enr['firstname']; $this->user_email = $enr['email']; $this->saveData($session); return true; } else { return false; } } else { return false;
84

Cration d'une application WEB avec PHP / MySQL }

function saveData($session) { $session->save("userId",$this->user_code); $session->save("userName",$this->user_name); $session->save("userFirstname",$this->user_firstname); $session->save("userEmail",$this->user_email); return true; } function restoreData($session) { $this->user_code=$session->load("userId"); $this->user_name=$session->load("userName"); $this->user_firstname=$session->load("userFirstname"); $this->user_email=$session->load("userEmail"); return true; } function getId() { return $this->user_code; } function getName() { return $this->user_name; } function getFirstname() { return $this->user_firstname; } function getEmail() { return $this->user_email; } } ?>

85

Cration d'une application WEB avec PHP / MySQL

La page login
Ceci est la premire page sur lequel l'utilisateur va pouvoir s'authentifier.
<? //----------------// login.php //----------------require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); // Fermer une session qui serait reste ouverte $session=new Session; $user=new User; if ($user->isValid($session)) { $session->close(); } ?> <? echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>MyForum v0.1</title> <meta http-equiv="content-type" content="text/html; charset=ISO8859-1" /> <meta name="keywords" lang="fr" content="forum, discussion, logiciel, libre, php, mysql, xhtml, css" /> <meta name="author" lang="fr" content="Philippe Bousquet" /> <meta name="copyright" content="&copy; 2004 Philippe Bousquet." /> <meta name="license" content="GNU General Public License." /> <link rel="stylesheet" href="default.css" type="text/css" /> </head> <body> <!-- Entete de site --> <div class="header"> <img class="icon" src="imgs/linux.png" alt="ABUL" /> <h1>MyForum v0.1</h1> <hr/> </div> <!-- La partie principale --> <div class="main"> <!-- Message d'erreur --> <div class="err"> <? if ($ERROR!="") { echo "ERREUR : $ERROR"; } ?> </div> <!-- La boite de connection --> <div class="box"> <h1>Identifiez vous</h1> <?echo "<form action=\"".$session->parseURL("themes.php")."\" method=\"post\">"; ?> <div class="field">
86

Cration d'une application WEB avec PHP / MySQL <label for="cuser">Code user : </label><input type="text" id="cuser" name="cuser" value="" /> </div> <div class="field"> <label for="passwd">Mot de passe : </label><input type="password" id="passwd" name="passwd" value="" /> </div> <div class="buttons"> <input class="button" type="submit" name="action" value="Je me connecte" /><br /> <input class="button" type="submit" name="action" value="J'ai perdu mon mot de passe" /> </div> </form> </div> <div class="center"> Si vous n'tes pas encore inscrit veuillez cliquer <a href="inscrit.php">ici</a>. </div> </div> <!-- Le pied de page --> <div class="footer"> <hr/> Copyright &copy; 2003-2004 Philippe BOUSQUET<br /> Ce logiciel est sous licence Gnu Genral Public License </div> </body> </html>

87

Cration d'une application WEB avec PHP / MySQL

La page inscrit
Ceci est la page d'inscription lorsque l'utilisateur veut s'inscrire sur le forum.
<? //----------------// inscrit.php //----------------require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); // Fermer une session qui serait reste ouverte $session=new Session; $user=new User; if ($user->isValid($session)) { $session->close(); } ?> <? echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>MyForum v0.1</title> <meta http-equiv="content-type" content="text/html; charset=ISO8859-1" /> <meta name="keywords" lang="fr" content="forum, discussion, logiciel, libre, php, mysql, xhtml, css" /> <meta name="author" lang="fr" content="Philippe Bousquet" /> <meta name="copyright" content="&copy; 2004 Philippe Bousquet." /> <meta name="license" content="GNU General Public License." /> <link rel="stylesheet" href="default.css" type="text/css" /> </head> <body> <!-- Entete de site --> <div class="header"> <img class="icon" src="imgs/linux.png" alt="ABUL" /> <h1>MyForum v0.1</h1> <hr/> </div> <!-- La partie principale --> <div class="main"> <!-- Message d'erreur --> <div class="err"> <? if ($ERROR!="") { echo "ERREUR : $ERROR"; } ?> </div> <!-- La boite d'inscription --> <div class="box"> <h1>Inscription</h1> <form action="inscription.php" method="post"> <div class="field"> <label for="name">Nom :</label> <? echo '<input type="text" id="name" name="name" value="'.$name.'" />'; ?>
88

Cration d'une application WEB avec PHP / MySQL </div> <div class="field"> <label for="first">Prnom :</label> <? echo '<input type="text" id="first" name="firstname" value="'.$firstname.'" />'; ?> </div> <div class="field"> <label for="email">Email :</label> <? echo '<input type="text" id="email" name="email" value="'.$email.'" />'; ?> </div> <div class="field"> <label for="cuser">Code user :</label> <?echo '<input type="text" id="cuser" name="cuser" value="'.$cuser.'" />'; ?> </div> <div class="field"> <label for="passwd">Password :</label> <input type="password" id="passwd" name="passwd" value="" /> </div> <div class="field"> <label for="passwd2">Confirmation :</label> <input type="password" id="passwd2" name="passwd2" value="" /> </div> <div class="buttons"> <input class="button" type="submit" name="action" value="s'inscrire" /> &nbsp;<input class="button" type="reset" /> </div> </form> </div> </div> <!-- Le pied de page --> <div class="footer"> <hr/> Copyright &copy; 2003-2004 Philippe BOUSQUET<br /> Ce logiciel est sous licence Gnu Genral Public License </div> </body> </html>

89

Cration d'une application WEB avec PHP / MySQL

La partie mtier inscription


Ceci est purement un acte mtier qui ajoute l'utilisateur dans la base mySQL, elle redirigera ensuite vers la page de slection des thmes.
<? //----------------// inscripttion.php //----------------require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); // Fermer une session qui serait reste ouverte $session=new Session; $cfg=new Config; $user=new User; if ($user->isValid($session)) { $session->close(); } if (!($cfg->testConnection())) { header("Location: inscrit.php?ERROR=Erreur%20du%20serveur%20MySQL%20!"); exit(); } // Controles $name=strtoupper($name); $firstname=strtolower($firstname); $cuser=strtolower($cuser); if ($name=="") { header("Location: inscrit.php?ERROR=Vous%20devez%20saisir%20votre%20nom.&name=$name&first name=$firstname&email=$email&cuser=$cuser"); exit(); } if ($firstname=="") { header("Location: inscrit.php?ERROR=Vous%20devez%20saisir%20votre%20prnom.&name=$name&fi rstname=$firstname&email=$email&cuser=$cuser"); exit(); } if ($email=="") { header("Location: inscrit.php?ERROR=Vous%20devez%20saisir%20votre%20email.&name=$name&fir stname=$firstname&email=$email&cuser=$cuser"); exit(); } if ($cuser=="") { header("Location: inscrit.php?ERROR=Vous%20devez%20choisir%20un%20code%20user.&name=$name &firstname=$firstname&email=$email&cuser=$cuser"); exit(); } if ($passwd!=$passwd2) { header("Location: inscrit.php?ERROR=Mot%20de%20passe%20incorrect,%20pensez%20%20la%20con firmation.&name=$name&firstname=$firstname&email=$email&cuser=$cuser"); exit();
90

Cration d'une application WEB avec PHP / MySQL } // Verification de l'inexistence du code user $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(),$cfg>getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query("SELECT * FROM users WHERE id_user='$cuser';"); if (mysql_num_rows($dbr)>0) { header("Location: inscrit.php?ERROR=Code%20user%20dja%20utilis,%20veuillez%20en%20chois ir%20un%20autre.&name=$name&firstname=$firstname&email=$email&cuser="); exit(); } // Les controles sont ok inscription de l'utilisateur $requete="INSERT INTO `users` ( `id_user` , `passwd` , `name` , `firstname` , `email` ) VALUES ('$cuser', '$passwd', '$name', '$firstname', '$email');"; $dbr=mysql_query($requete); // On se connecte header("Location: themes.php?cuser=".$cuser."&passwd=".$passwd); ?>

91

Cration d'une application WEB avec PHP / MySQL

La partie mtier mail


Ceci est purement un acte mtier qui envoie l'utilisateur son mot de passe par email, si celui ci l'a oubli.
<? //----------------// mail.php //----------------require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=new Session; $cfg=new Config; $user=new User; // Controles if ($cuser=="") { header("Location: login.php?ERROR=Vous%20devez%20saisir%20votre%20code%20user."); exit(); } $requete="SELECT passwd, email FROM users WHERE id_user='$cuser';"; $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query($requete); if (mysql_num_rows($dbr)==0) { header("Location: login.php?ERROR=Cet%20 utilisateur%20est%20inconnu,%20veuillez%20vous%20inscrire."); exit(); } $enr=mysql_fetch_array($dbr); $text="Bonjour vous avez demand que l'on vous envoi votre mot de passe myForum.\n\nVotre mot de passe :".$enr['passwd']. "\n\nCordialement."; if (mail($enr['email'], "mot de passe myforum", $text, "From: webmaster@$SERVER_NAME\n Reply-To:webmaster@$SERVER_NAME\nX-Mailer:PHP/". phpversion())) { header("Location: login.php?ERROR=Votre%20mot%20 de%20passe%20vous%20%20t%20envoy%20par%20email."); } else { header("Location: login.php?ERROR=Il%20y%20a%20eu%20un%20 problme%20lors%20de%20l'envoi%20de%20mail."); } ?>

92

Cration d'une application WEB avec PHP / MySQL

La page de slection de thme


Cette page permet l'utilisateur de slectionner le themes qu'il veut consulter.
<? //----------------// themes.php //----------------if ($action=="J\'ai perdu mon mot de passe") { require("mail.php"); exit(); } require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=new Session; $cfg=new Config; $user=new User; if (!($cfg->testConnection())) { header("Location: login.php?ERROR=Erreur%20du%20 serveur%20MySQL%20!"); exit(); } if (!($user->isValid($session)) && !($user->connect($cuser,$passwd, $cfg,$session))) { header("Location: login.php?ERROR=Mot%20de%20passe%20incorrect, %20ou%20utilisateur%20inconnu."); exit(); } ?> <? echo '<?xml version="1.0" encoding="ISO-8859-1"?>' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>MyForum v0.1</title> <meta http-equiv="content-type" content="text/html; charset=ISO8859-1" /> <meta name="keywords" lang="fr" content="forum, discussion, logiciel, libre, php, mysql, xhtml, css" /> <meta name="author" lang="fr" content="Philippe Bousquet" /> <meta name="copyright" content="&copy; 2004 Philippe Bousquet." /> <meta name="license" content="GNU General Public License." /> <link rel="stylesheet" href="default.css" type="text/css" /> </head> <body> <!-- Entete de site --> <div class="header"> <img class="icon" src="imgs/linux.png" alt="ABUL" /> <h1>MyForum v0.1</h1> <hr/> </div> <!-- La partie principale --> <div class="main"> <div class="pwd"> <? echo $user->getId(); ?> &gt;&gt; <? echo "<a href=\"".$session->parseURL("login.php")."\" title=\"quitter\">"; ?
93

Cration d'une application WEB avec PHP / MySQL >Quitter</a> </div> <!-- La liste des themes --> <table> <caption>MyForum : Liste des thmes</caption> <thead> <tr class="title"><th>Thme</th><th>Description</th><th> Sujets </th><th>Date</th></tr> </thead> <tbody> <? $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query("SELECT id_theme, name, description FROM themes;"); while ($enr=mysql_fetch_array($dbr)) { echo '<tr>'; echo "<td class=\"left\"><a href=\"".$session>parseURL("sujets.php","id_theme=".$enr['id_theme'])."\">".$enr['name'] ."</a></td>"; echo "<td class=\"left\"><a href=\"".$session>parseURL("sujets.php","id_theme=".$enr['id_theme'])."\">".$enr['descri ption']."</a></td>"; $dbr2=mysql_query("SELECT COUNT(*) as nb_sujets, MAX(date) as date FROM subjects where id_theme='".$enr['id_theme']."';"); $enr2=array(); if (mysql_num_rows($dbr2)>0) { $enr2=mysql_fetch_array($dbr2); } else { $enr2['nb_sujets']="0"; $enr2['date']="0000-00-00 00:00:00"; } echo "<td class=\"right\">".$enr2['nb_sujets']."</td>"; echo "<td class=\"right\">".$enr2['date']."</td>"; echo '</tr>'; } ?> </tbody> </table> </div> <!-- Le pied de page --> <div class="footer"> <hr/> Copyright &copy; 2003-2004 Philippe BOUSQUET<br /> Ce logiciel est sous licence Gnu Genral Public License </div> </body> </html>

94

Cration d'une application WEB avec PHP / MySQL

La page de slection du sujet


Cette page permet l'utilisateur de slectionne le sujet sur lequel il veut consulter les messages, ou en crer un nouveau.
<? //----------------// sujets.php //----------------require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=new Session; $cfg=new Config; $user=new User; if (!($user->isValid($session))) { header("Location: login.php?ERROR=Utilisateur%20inconnu,%20 ou%20la%20session%20a%20expire."); exit(); } if (!($cfg->testConnection())) { header("Location: login.php?ERROR=Erreur%20du%20serveur%20 MySQL%20!"); exit(); } ?> <? echo '<?xml version="1.0" encoding="ISO-8859-1"?>' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>MyForum v0.1</title> <meta http-equiv="content-type" content="text/html; charset=ISO8859-1" /> <meta name="keywords" lang="fr" content="forum, discussion, logiciel, libre, php, mysql, xhtml, css" /> <meta name="author" lang="fr" content="Philippe Bousquet" /> <meta name="copyright" content="&copy; 2004 Philippe Bousquet." /> <meta name="license" content="GNU General Public License." /> <link rel="stylesheet" href="default.css" type="text/css" /> </head> <body> <!-- Entete de site --> <div class="header"> <img class="icon" src="imgs/linux.png" alt="ABUL" /> <h1>MyForum v0.1</h1> <hr/> </div> <!-- La partie principale --> <div class="main"> <div class="pwd"> <? echo $user->getId(); ?> &gt;&gt; <? echo "<a href=\"".$session->parseURL("login.php"). "\" title=\"quitter\">"; ?>Quitter</a> :: <? echo "<a href=\"".$session->parseURL("themes.php"). "\" title=\"retour aux thmes\">"; ?>Thmes</a> </div>
95

Cration d'une application WEB avec PHP / MySQL <!-- La liste des themes --> <table> <caption> <? $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query("SELECT name FROM themes WHERE id_theme='$id_theme';"); $enr=mysql_fetch_array($dbr); echo $enr['name']; ?> &nbsp;: Liste des sujets </caption> <thead> <tr class="title"> <th>Auteur</th> <th>Titre</th> <th>Rep.</th> <th>Date</th> </tr> </thead> <tbody> $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query("SELECT id_subject, title, date, id_user FROM subjects WHERE id_theme='$id_theme' ORDER BY date DESC;"); while ($enr=mysql_fetch_array($dbr)) { echo '<tr>'; echo "<td class=\"left\">".$enr['id_user']."</td>"; echo "<td class=\"left\"> <a href=\"".$session->parseURL("messages.php", "id_theme=".$id_theme."&id_subject=".$enr['id_subject']). "\">".$enr['title']."</a></td>"; $dbr2=mysql_query("SELECT COUNT(*) as nb_rep FROM messages WHERE id_subject='".$enr['id_subject']."';"); $enr2=array(); if (mysql_num_rows($dbr2)>0) { $enr2=mysql_fetch_array($dbr2); $enr2['nb_rep']--; } else { $enr2['nb_rep']=0; } echo "<td class=\"right\">".$enr2['nb_rep']."</td>"; echo "<td class=\"right\">".$enr['date']."</td>"; echo "</tr>\n"; } ?> <!-- Le boutton nouveau --> <tr class="row"><td colspan="4" class="center"> <? echo "<form action=\"".$session->parseURL("editer.php", "id_theme=".$id_theme)."\" method=\"post\">"; ?> <input class="button" type="submit" name="action" value="Nouveau" /> </form> </td></tr> </tbody> </table>
96

<?

Cration d'une application WEB avec PHP / MySQL </div> <!-- Le pied de page --> <div class="footer"> <hr/> Copyright &copy; 2003-2004 Philippe BOUSQUET<br /> Ce logiciel est sous licence Gnu Genral Public License </div> </body> </html>

97

Cration d'une application WEB avec PHP / MySQL

La page des messages


Cette page affiche la liste des messages concernant un sujet, l'utilisateur pourra galement spcifier qu'il veut rpondre sur ce sujet.
<? //----------------// messages.php //----------------require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=new Session; $cfg=new Config; $user=new User; if (!($user->isValid($session))) { header("Location: login.php?ERROR=Utilisateur%20inconnu,%20 ou%20la%20session%20a%20expire."); exit(); } if (!($cfg->testConnection())) { header("Location: login.php?ERROR=Erreur%20du %20serveur%20MySQL%20!"); exit(); } ?> <? echo '<?xml version="1.0" encoding="ISO-8859-1"?>' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>MyForum v0.1</title> <meta http-equiv="content-type" content="text/html; charset=ISO8859-1" /> <meta name="keywords" lang="fr" content="forum, discussion, logiciel, libre, php, mysql, xhtml, css" /> <meta name="author" lang="fr" content="Philippe Bousquet" /> <meta name="copyright" content="&copy; 2004 Philippe Bousquet." /> <meta name="license" content="GNU General Public License." /> <link rel="stylesheet" href="default.css" type="text/css" /> </head> <body> <!-- Entete de site --> <div class="header"> <img class="icon" src="imgs/linux.png" alt="ABUL" /> <h1>MyForum v0.1</h1> <hr/> </div> <!-- La partie principale --> <div class="main"> <div class="pwd"> <? echo $user->getId(); ?> &gt;&gt; <? echo "<a href=\"".$session->parseURL("login.php"). "\" title=\"quitter\">"; ?>Quitter</a> :: <? echo "<a href=\"".$session->parseURL("themes.php"). "\" title=\"retour aux thmes\">"; ?>Thmes</a> :: <? echo "<a href=\"".$session->parseURL("sujets.php",
98

Cration d'une application WEB avec PHP / MySQL "id_theme=".$id_theme)."\"title=\"retour aux sujets\">"; ?>Sujets</a> </div> <!-- La liste des themes --> <table> <caption> <? $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query("SELECT name FROM themes WHERE id_theme='$id_theme';"); $enr=mysql_fetch_array($dbr); echo $enr['name']." : "; $dbr=mysql_query("SELECT title FROM subjects WHERE id_subject='$id_subject';"); $enr=mysql_fetch_array($dbr); echo $enr['title']; ?> </caption> <tbody> $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query("SELECT id_user,title,text, date, id_user FROM messages WHERE id_subject='$id_subject' ORDER BY date, id_message;"); while ($enr=mysql_fetch_array($dbr)) { echo '<tr class="row">'; echo '<th class="left">'.$enr['id_user'].'</th>'; echo '<th class="left">'.$enr['title'].'</th>'; echo '<th class="right">'.$enr['date'].'</th>'; echo '</tr>'."\n"; echo '<tr class="row">'; echo '<td colspan="3" class="left"><pre>'.$enr['text']. '</pre></td>'; echo '</tr>'."\n"; }

<?

?>

<!-- Le boutton rpondre --> <tr class="row"><td colspan="3" class="center"> <? echo '<form action="'.$session->parseURL("editer.php", "id_theme=".$id_theme."&id_subject=".$id_subject). '" method="post">'; ?> <input class="button" type="submit" name="action" value="Rpondre" /> </form> </td></tr> <tbody> </table> </div> <!-- Le pied de page --> <div class="footer"> <hr/> Copyright &copy; 2003-2004 Philippe BOUSQUET<br /> Ce logiciel est sous licence Gnu Genral Public License </div> </body> </html>

99

Cration d'une application WEB avec PHP / MySQL

La page de cration de message


Cette page permet soit de rpondre sur un sujet donn, soit de crer son propre message sur un nouveau sujet.
<? //----------------// editer.php //----------------require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=new Session; $cfg=new Config; $user=new User; if (!($user->isValid($session))) { header("Location: login.php?ERROR=Utilisateur%20inconnu,%20 ou%20la%20session%20a%20expire."); exit(); } ?> <? echo '<?xml version="1.0" encoding="ISO-8859-1"?>' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>MyForum v0.1</title> <meta http-equiv="content-type" content="text/html; charset=ISO8859-1" /> <meta name="keywords" lang="fr" content="forum, discussion, logiciel, libre, php, mysql, xhtml, css" /> <meta name="author" lang="fr" content="Philippe Bousquet" /> <meta name="copyright" content="&copy; 2004 Philippe Bousquet." /> <meta name="license" content="GNU General Public License." /> <link rel="stylesheet" href="default.css" type="text/css" /> </head> <body> <!-- Entete de site --> <div class="header"> <img class="icon" src="imgs/linux.png" alt="ABUL" /> <h1>MyForum v0.1</h1> <hr/> </div> <!-- La partie principale --> <div class="main"> <div class="pwd"> <? echo $user->getId(); ?> &gt;&gt; <? echo "<a href=\"".$session->parseURL("login.php"). "\" title=\"quitter\">"; ?>Quitter</a> :: <? echo "<a href=\"".$session->parseURL("themes.php"). "\" title=\"retour aux thmes\">"; ?>Thmes</a> :: <? echo "<a href=\"".$session->parseURL("sujets.php", "id_theme=".$id_theme)."\"title=\"retour aux sujets\">"; ?>Sujets</a> <? if ($id_subject!="") {
100

Cration d'une application WEB avec PHP / MySQL echo ':: <a href="'.$session->parseURL("messages.php", "id_theme=".$id_theme."&id_subject=".$id_subject). '" title="retour sur les messages">Messages</a>';

} ?> </div> <!-- Message d'erreur --> <div class="err"> <?

if ($ERROR!="") { echo "ERREUR : $ERROR"; } </div> <!-- Rpondre au message --> <div class="box"> <? $titre=""; if ($id_subject!="") { $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query("SELECT title FROM subjects WHERE id_subject='$id_subject';"); $enr=mysql_fetch_array($dbr); $titre="RE: ".$enr['title']; } ?> <h1>Rpondre au message</h1> <? echo '<form action="'.$session->parseURL("savemessage.php", "id_theme=".$id_theme."&id_subject=".$id_subject). '" method="post">'; ?> <div class="field2"><label for="title">Titre : </label><br/> <? echo '<input type="text" id="title" name="titre" value="'.$titre.'" size="50" />';?></div> <div class="field2"><label for="mess">Message : </label><br/> <textarea cols="50" id="mess" rows="12" name="message"> Saisissez votre texte ici... </textarea></div> <div class="buttons"> <input class="button" type="submit" name="action" value="Envoyer" /> &nbsp;<input class="button" type="reset" /> </div> </form> </div> <!-- La liste des themes --> if ($id_subject!="") { echo '<table class="old" summary="Devel : Comment raliser un forum en PHP ?">'; echo '<caption>Devel : Comment raliser un forum en PHP ?</caption>'; echo '<tbody>'; $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query("SELECT id_user,title,text, date, id_user FROM messages WHERE id_subject='$id_subject' ORDER BY date DESC, id_message DESC;"); while ($enr=mysql_fetch_array($dbr)) {
101

?>

<?

Cration d'une application WEB avec PHP / MySQL echo echo echo echo echo echo echo '<tr class="row">'; '<th class="left">'.$enr['id_user'].'</th>'; '<th class="left">'.$enr['title'].'</th>'; '<th class="right">'.$enr['date'].'</th>'; '</tr>'."\n"; '<tr class="row">'; '<td colspan="3" class="left"><pre>'. $enr['text'].'</pre></td>'; echo '</tr>'."\n";

} echo '</tbody>'; echo '</table>'; ?> }

</div> <!-- Le pied de page --> <div class="footer"> <hr/> Copyright &copy; 2003-2004 Philippe BOUSQUET<br /> Ce logiciel est sous licence Gnu Genral Public License </div> </body> </html>

102

Cration d'une application WEB avec PHP / MySQL

La partie mtier de sauvegarde d'un message


Cette partie permet de crer un sujet en base MySQL (si besoin), ainsi que d'enregistrer le message saisi par l'utilisateur.
<? require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=new Session; $cfg=new Config; $user=new User; if (!($user->isValid($session))) { header("Location: login.php?ERROR=Utilisateur%20inconnu,%20 ou%20la%20session%20a%20expire."); exit(); } if ($titre=="") { header("Location: ".$session->parseURL("editer.php", "ERROR=Vous%20devez%20saisir%20un%20titre. &id_theme=".$id_theme."&id_subject=".$id_subject)); exit(); } if ($id_subject=="") { $requete="INSERT INTO `subjects` (`id_subject`, `title`, `date`, `id_user`, `id_theme`) VALUES ('', '$titre', '0000-00-00 00:00:00', '".$user->getId()."', '$id_theme');"; $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); $dbr=mysql_query($requete); $dbr=mysql_query("SELECT MAX(id_subject) as id_subject FROM subjects WHERE id_theme='$id_theme';"); $enr=mysql_fetch_array($dbr); $id_subject=$enr['id_subject']; } $date=date("Y-m-d")." ".date("H:i:s"); $requete="INSERT INTO `messages` (`id_message`, `title`, `text`, `date`, `id_user`, `id_subject`) VALUES ('', '$titre', '$message', '$date', '".$user->getId()."', '$id_subject');"; if ($dbh=="") { $dbh=mysql_connect($cfg->getDbHost(),$cfg->getDbUser(), $cfg->getDbPass()); $dbh=mysql_select_db($cfg->getDbName()); } $dbr=mysql_query($requete); $requete="UPDATE `subjects` SET `date` = '$date' WHERE `id_subject` = '$id_subject';"; $dbr=mysql_query($requete); header("Location: ".$session->parseURL("messages.php","id_theme=". $id_theme."&id_subject=".$id_subject)); ?>

103

Cration d'une application WEB avec PHP / MySQL

XI.Rfrences
Pour plus d'informations sur MySQL : http://www.mysql.com http://dev.nexen.net/docs/mysql/ Pour plus d'informations sur phpMyAdmin :

http://www.phpmydamin.org

Pour plus d'informations sur XHTML et CSS :


http://www.w3.org/ (Le site officiel du W3C) http://openweb.eu.org/ (Pour les standards du web. En franais)

Pour plus d'informations sur PHP :

http://dev.nexen.net/docs/php/

104