Академический Документы
Профессиональный Документы
Культура Документы
Bases de donnes
et Internet
Cours
Master Sciences et Techniques
en Gnie Industriel
Professeur : F. Kaghat
Plan du cours
Chapitre 1
Langage HTML/XHTML
Chapitre 2
Feuilles de style en cascade (CSS)
Chapitre 3
PHP 5
Premire partie : syntaxe de base et programmation en PHP
2me partie : cration de sites Web dynamiques
Chapitre 4
Introduction SQL et MySQL
Chapitre 5
MySQL
Chapitre 1
Langage HTML/XHTML
Langage HTML/XHTML
HTML - Introduction
HTML : HyperText Markup Language
Liens hypertextes
Langage base de balises
Objectif : publier sur le World Wide Web (ou WWW, W3 ou Web) des documents formats
Issu du SGML (Standard Generalized Markup Language), langage de dfinition de
langages
Dvelopp par Tim Berners-Lee au CERN (Suisse) en 1990 et utilis sur le Web depuis.
1990
1995
1995
1997
2000
2001
2003
:
:
:
:
:
:
:
HTML 1
HTML 2
HTML+ et HTML 3 (non standards)
HTML 3.2 et HTML 4 (W3C : World Wide Web Consortium)
XHTML 1.0 (HTML 4 rcrit en XML)
XHTML 1.1
XHTML 2 en prparation
De HTML XHTML
Le langage HTML est fond sur le modle du langage balise SGML.
Rcemment, un nouveau format issu lui aussi du SGML est apparu, on le nomme XML. Ce
langage permet de structurer et d'exprimer le type de donne, comme le HTML mais avec
un gros avantage : celui de ne pas possder de balises dfinies. Le concepteur est donc
libre de nommer ces balises, de dcrire le contenu qu'il veut.
Le XHTML n'est qu'une reformulation du HTML (en SGML) en XML. tout ceci dans le but de
conduire progressivement les webmasters utiliser le XML la place du HTML.
XHTML (the eXtensible Hyper Text Markup Language) signifie langage de balisage
hypertexte extensible.
Elment : nom, notion abstraite
Ex. Document html : html
Balise : forme concrte dun lment
Ex. de balise ouvrante : <html>
Ex. de balise fermante : </html>
Attribut : proprit dun lment (nom, valeur)
EX. <html xmlns="http://www.w3.org/1999/xhtml">
Nom
Valeur
Rgles dcriture
En-tte
Informations qui ne sont pas affiches mais qui sont utilises des fins diverses.
En-tte
Mtadonnes : Les mta-tags (ou mta, balises mta...) .
Ces balises ont deux attributs :
L'attribut charset indique les caractres utiliss (iso-8859-1 correspond au franais avec
les accents " "...).
Exemple den-tte
<head>
<!-- Jeu de caractres accentus -->
<meta http-equiv="Content-Type"
Content="text/html; charset=iso-8859-1" />
<!-- Titre -->
<title> Exemple de page XHTML </title>
<!-- Autres mtadonnes -->
<meta name="Author" content="Kaghat" />
<meta name="Keywords" content="Enseignement,Informatique" />
<meta name="Description" content="Exemple de page XHTML" />
</head>
Sparateurs :
Citation
Ex. <blockquote>Le langage HTML tire son origine du langage SGML</ blockquote>
Texte prformat
Formatage de texte
Accents franais
Codes ncessaires si la balise meta http-equiv nest pas renseigne
Accents :
(remplacer # par une lettre)
Structurer le texte
<h1>1. Documentation du Produit</h1>
<h2>1.1. Spcificit</h2>
<p>
Un premier paragraphe
</p>
<h2>1.2. Fonctions avances</h2>
<p>
Un deuxime paragraphe
</p>
Liens Hypertextes
La balise <a></a> permet la cration dun lien hypertexte (attribut href) ou dun lien
Liens Hypertextes
Il est bien sr possible de faire des liens vers autre chose qu'une page HTML. On peut
faire des liens vers des fichiers audio, des documents textes, etc.
Cet hyperlien peut tre de plusieurs types :
Un autre document HTML
<a href="http://www.php.net">Le site officiel de PHP</a>
Un lien vers une image
<a href="lphant.jpg">La mascotte de PHP</a>
Un lien sur fichier son, ou vido charger...
<a href="anim.mov">Cliquez ici pour visionner l'animation</a>
Un lien vers un programme de composition de mail.
<a href="mailto:alain.dupont@gmail.com"> Cliquer ici pour menvoyer un email </a>
Lien vers un fichier en tlchargement
<a href="archive.zip">Cliquez ici pour tlcharger le fichier</a>
etc.
Ancres
Permettent un lien vers un endroit prcis dans une page Web
Dfinition dans une page : attribut id
Images
Images
Balise : <img src="URL" alt="description" />
src indique ladresse du fichier :
Soit en relatif par rapport au fichier courant
Images
Les listes sont des outils bien utiles pour prsenter des informations. XHTML en offre 3
types diffrents. Le premier type de liste est la liste non ordonne ou liste puces.
Listes puces : <ul></ul>
<ul>
<li>1er lment</li>
<li>2me lment</li>
<li>3me lment</li>
</ul>
Elments de la liste : <li>
Ce type de liste sera prsent avec des petites puces avant le texte de chaque lment.
Le dernier type de liste est la liste de dfinition, permettant de crer des listes possdant
un terme et sa dfinition.
Liste de dfinitions : <dl>
On utilise l'lment <dl> (Definition list). l'intrieur de l'lment <dl>, <dt> (pour
definition term) est une entre du lexique, et <dd> (pour definition definition...) la
dfinition associe cette entre.
Listes de dfinitions
Exemple
<dl>
<dt>1er terme</dt>
<dd>Dfinition du 1er terme</dd>
<dt>2me terme</dt>
<dd>Dfinition du 2me terme</dd>
</dl>
Rsultat laffichage
1er terme
Dfinition du 1er terme
2me terme
Dfinition du 2me terme
Ce dernier type de liste est gnralement affich avec la dfinition en retrait du terme.
Tableaux simples
Un tableau HTML est dcoup en lignes contenant des cellules. Le nombre de cellules
dans chaque ligne doit tre le mme, ou alors il est ncessaire de spcifier des options de
recouvrement.
Tableau : Ensemble de lignes elles-mmes constitues de cellules
Dfinition dun tableau : <table> </table>
Lgende : <caption> </caption>
Dfinition dune ligne : <tr> </tr> (Table Row)
Dfinition dune cellule den-tte : <th> </th> (Table Heading)
Dfinition dune cellule normale : <td> </td> (Table Data)
Tableaux simples
<table border= 1>
<tr>
<td>Cellule 1.1</td>
<td>Cellule 1.2</td>
</tr>
<tr>
<td>Cellule 2.1</td>
<td>Cellule 2.2</td>
</tr>
</table>
border : dtermine l'paisseur de la bordure du tableau et des cellules, en pixels.
Exemple de tableau
<table>
<caption>Mes totaux</caption>
<tr>
<th>Jour de la semaine</th><th>Montant</th><th>Total</th>
</tr>
<tr>
<td>Lundi</td><td>456 dirhams</td><td>456 dirhams</td>
</tr>
<tr>
<td>Mardi</td><td>200 dirhams</td><td>656 dirhams</td>
</tr>
</table>
Tableaux simples
Les balises <tr> et </tr> dlimitent les lignes du tableau.
Dans la premire ligne, la balise <th> dsigne des cellules d'un type particulier : elles ne
contiennent pas de donnes, mais l'en-tte (ou titre) des colonnes correspondantes.
Dans les lignes suivantes, <td> spcifie les cellules de donnes.
Montant
Total
456 dirhams 456 dirhams
200 dirhams 656 dirhams
10
<table border="1">
<tr>
<td rowspan="2">Cellule 1</td>
<td>Cellule 2</td>
</tr>
<tr>
<td>Cellule 3</td>
</tr>
</table>
Exemple
<table>
<tr>
<td rowspan="2">ligne 1 et 2, colonne 1</td>
<td>ligne 1, colonne 2</td>
<td>ligne 1, colonne 3</td>
</tr>
<tr>
<td>ligne 2, colonne 2</td>
<td>ligne 2, colonne 3</td>
</tr>
<tr>
<td>ligne 3, colonne 1</td>
<td colspan="2">ligne 3, colonne 2 et 3</td>
</tr>
</table>
Formulaires
En sance de cours : PHP 5.
En sance de travaux pratiques.
11
Chapitre 2
12
Dfinition et caractristiques
Les Cascading Style Sheets ou Feuilles de Styles en Cascade ont t initialement conues
Avantages
Dfinitions de styles
Trois localisations possibles (+local au +global)
Dans une balise HTML : attribut style
Ex. <p style="color: blue; text-align: center;"></p>
Dans une page HTML : balise <style>
Dans len-tte de la page Web (head) :
<style type="text/css"></style>
Dans un fichier spar
Appel dans len-tte de la page Web (head) :
<link rel="stylesheet" type="text/css" href="feuille_style.css" />
La balise <style>
L'attribut type="text/css" : il s'agit de feuilles de style en cascade
La balise de commentaire <! -- ... -->
<head>
<style type="text/css">
<!-contenu d une feuille de style CSS
-->
</style>
</head>
13
<head>
<link rel="stylesheet" type="text/css" href="feuille_style.css" />
</head>
<link> : tablir un lien , peut y en avoir plusieurs
rel="stylesheet" : il s'agit d'une feuille externe
type="text/css" : il s'agit de feuilles de style en cascade (CSS)
href=" ... " dfinit l'emplacement de la feuille de style
cette solution qui consiste crire une feuille de style dans un fichier spar est prfre.
Notion de cascade
Imbrication des dfinitions : la plus locale lemporte.
Ex. Dfinition de style dans un fichier externe vs. Dfinition dans une balise
La dfinition locale de la balise prvaut
Imbrication des balises : le style dune balise sapplique aux balises imbriques.
Ex. <p><em></em></p>
Si un style est appliqu <p>, il sapplique <em>.
Concept de base
Feuille de style : ensemble de rgles
Un slecteur
Des proprits
Une valeur pour chaque proprit
Exemple
h1 { color: yellow;
font-weight: bold;
}
d'un slecteur qui indique l'lment auquel elle s'applique, et d'une ou de plusieurs
proprits ainsi que leurs valeurs respectives.
Slecteurs
Remarque : Les commentaires utiliss l'intrieur des feuilles de style sont similaires
ceux que l'on utilise en langage C.
14
Hritage
Considrons la rgle de style :
h1 { color: blue; }
Considrons le code HTML suivant :
automatiquement de la couleur de son lment parent (h1), soit bleue pour notre
exemple.
Hritage
Pour dfinir un style "par dfaut" pour tout un document, il suffit de le dfinir sur
l'lment parent tous les autres - llment racine - i.e en HTML, l'lment <body>.
body {
color : black;
background: white;
font-style: arial;
}
plusieurs styles diffrents pour une mme balise, chacun se dmarquant des autres par
un nom de classe.
Pour appliquer une classe de style, il faut lindiquer comme valeur dattribut class dans la
balise.
Ex.
.style_rouge { color: red; }
.style_bleu { color: blue; }
p.entete { font-style: italic; }
Dans le premier cas, on indique que tous les lments de classe "style_rouge", quels
qu'ils soient, devront tre affichs en rouge. Dans le 3me exemple, seuls les lments p
de classe "entete" devront tre affichs en italique.
15
Classes gnriques
On peut dfinir une classe sans lassocier une balise particulire et lappliquer ensuite au
cas par cas selon les balises du document. Par exemple :
.italique {font-style: italic}
cre une classe gnrique appele italique. Pour lutiliser, il suffit dassocier son nom
lattribut class.
<p class="italique">
<h1 class="italique">
Les classes gnriques sont pratiques et facilitent lapplication dun style particulier une
large gamme de balises.
Consulter le document :
Les balises XHTML - les proprits CSS
Proprits de couleur
color
color: black;
color: #000000;
background-color
background-color: white;
background-color: #FFFFFF;
background-iamge background-image: url("URL");
background-repeat
background-repeat: no-repeat;
background-position
background-position: center;
Proprits de typographie
font-family
font-size
font-style
font-weight
font-family: times;
font-family: arial, verdana;
font-size: 1.5em;
font-style: italic;
font-weight: bold;
16
font-weight: bolder;
font-decoration: underline;
font-decoration: line-through;
font-decoration
Proprits de texte
text-align
text-align: left;
text-align: right;
text-align: center;
text-align: justify;
text-indent: 10pt;
text-indent: 15px;
text-indent: 5%;
text-indent
width: 80pt;
height: 25%;
padding: 5px;
padding-bottom: 10px;
margin: 10px;
margin-left: 10%;
border: 2px solid #FF00FF;
border-style: dotted;
Proprits dhyperlien
Hyperliens
Proprits de liste
Listes non-ordonnes
list-style
list-style-image
list-style: disc;
list-style: circle;
list-style: square;
list-style-image: url("URL");
Listes ordonnes
list-style
list-style: decimal;
list-style: upper-roman;
list-style: lower-alpha;
Proprits de tableau
Balise table : border, width
Balise caption : caption-side top;
caption-side bottom;
Balise tr : height
Balises td et th : border, width
et
vertical-align top;
vertical-align middle;
17
vertical-align bottom;
Exemple
Application un document
Exemple : page_films.html : Document HTML avec feuille de style
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type"
Content="text/html; charset=iso-8859-1" />
<title>Document HTML avec feuille de style</title>
<meta name="Author" content="Kaghat" />
<meta name="Keywords" content="Cinma,film" />
<meta name="Description" content="Un site consacr l'art cinmatographique" />
<link rel="stylesheet" type="text/css" href="films.css" />
</head>
Application un document
<body>
<h1>Une table HTML</h1>
<table border="4">
<caption>Quelques films</caption>
<tr>
<th>Titre</th><th>Anne</th><th>Nom Ralisateur</th><th>Prnom</th> <th>Anne
naissance</th>
</tr>
<tr class="A0">
<td>Alien</td><td>1979</td><td>Scott</td><td>Ridley</td><td>1943</td>
</tr>
Application un document
18
<tr class="A1">
<td>Vertigo</td><td>1958</td><td>Hitchcock</td><td>Alfred</td> <td>1899</td>
</tr>
<tr class="A0">
<td>Van Gogh</td><td>1991</td><td>Pialat</td><td>Maurice</td> <td>1925</td>
</tr>
<tr class="A1">
<td>Titanic</td><td>1997</td><td>Cameron</td><td>James</td> <td>1954</td>
</tr>
</table></body></html>
Application un document
Exemple : exemple_liens.html : Document HTML avec feuille de style
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type"
Content="text/html; charset=iso-8859-1" />
<title>Document HTML avec feuille de style</title>
<meta name="Author" content="Kaghat" />
<meta name="Keywords" content="mot1,mot2" />
<meta name="Description" content="description du site" />
<link rel="stylesheet" type="text/css" href="style_liens.css" />
</head>
Application un document
<body>
Voici un paragraphe avec un
<a href="#">lien</a>,et encore un autre
<a href="#">autre lien</a>, et toujours de <a href="#">nouveaux liens</a>, ! De quoi
tester le rendu des liens en CSS.
</body>
</html>
19
Chapitre 3
PHP 5
Premire partie : syntaxe de base et
programmation en PHP
2me partie : cration de sites Web
dynamiques
20
Modle
Client
Requt
e
Interne
t
Rpons
e
Serveur
Appel de la
page
Base de
donne
s
MySQL
Extractio
n
de
donnes
Script
PHP
Excutio
n
Documen
t
Html
21
Histoire et origine
Il a t cr en 1994 par Rasmus Lerdorf pour les besoins des pages Web personnelles
(livre d'or, compteurs, etc.). A l'poque, PHP signifiait Personnal Home Page.
En 1997, PHP devient un projet collectif et son interprteur est rcrit par Zeev Suraski et
Andi Gutmans pour donner la version 3 qui s'appelle dsormais PHP : Hypertext
Preprocessor
PHP4, 2000
Juillet 2004 : version 5.0.0 de PHP, 30-juin-2009 : PHP 5.3.0
PHP 5 amliore l'orientation objet de PHP.
Quelques dfinitions
SGBD:
La gestion de la base de donnes se fait grce un systme appel SGBD (systme de
gestion de bases de donnes). Le SGBD est un ensemble de services (applications
logicielles) permettant de grer les bases de donnes, c'est--dire:
Prendre connaissance des donnes.
Manipuler les donnes prsentes dans la base de donnes (insertion, suppression,
modification.).
MySQL, Oracle sont des SGBD.
MySQL
C'est un Systme de Gestion de Bases de Donnes (SGBD) fonctionnant sous Linux et
Windows. Depuis la version 3.23.19, MySQL est sous Licence GPL (aussi bien sous Linux
que Windows), ce qui signifie qu'il peut tre utilis gratuitement.
Une des grandes forces de PHP est le support de nombreuses bases de donnes. Les
bases de donnes suivantes sont toutes supportes par PHP :
Adabas D
dBase
Empress
FilePro (lecture seule)
Hyperwave
IBM DB2
Informix
Ingres
InterBase
FrontBase
mSQL
Direct MSSQL
MySQL
ODBC
Oracle (OCI7 et OCI8)
Ovrimos
PostgreSQL
SQLite
Solid
Sybase
Velocis
Unix dbm
22
MySQL: prsentation
C'est en fait un serveur MySQL, un ensemble de programmes ayant pour tche
d'administrer les bases de donnes, il manipule les instructions adresses la BD.
Exemple: cration et gestion de bases, de tables.
Le dialogue avec une base de donnes s'effectue en envoyant des messages au serveur
de BD (ici MySQL). Le langage utilis pour ce faire sera, en ce qui nous concerne PHP. En
ralit, les requtes sont rdiges en langage SQL, mais PHP a pour rle de transmettre
les requtes SQL de faon transparente.
Couple PHP/MySQL:
Dans une application de base de donnes sur le web, PHP est la partie application et
MySQL est le ct base de donnes.
Un serveur Web qui hberge les pages et renvoie les rsultats des requtes aux
utilisateurs.
MySQL, le SGBDR que nous utiliserons qui permettra de manipuler les donnes de la
base.
PHP, le langage de script que nous utiliserons pour crire les programmes du site Web
dynamique.
Environnement de dveloppement
Trois outils sont ncssaires la ralisation d'un site PHP/mySQL:
Le serveur web (Apache pour nous).
Un SGBDR (en l'occurence, MySQL, en ce qui nous concerne), il manipulera les donnes
de la base.
PHP, le langage de script.
Cold Fusion.
JavaServer Page.
Microsoft ASP.
CGI et autres langages (Perl, C, C++, etc).
23
A - Syntaxe de base
1. Passer du HTML au PHP
Passer du HTML au PHP
Il y a quatre jeux de balises qui servent dlimiter des blocs de code PHP.
Seules deux d'entre elles sont toujours actives :
Exemple
<?php
echo "Nous utilisons apache comme serveur Web";
?>
<?
echo "Bonjour !";
?>
Le style script :
<script language="php">
echo "Bonjour !";
</script>
Le style ASP :
<%
echo "Bonjour !";
%>
Remarque
La premire mthode est gnralement utilise, car elle permet une implmentation aise
de PHP avec la prochaine gnration de XHTML.
Le sparateur d'instructions
Les instructions sont spares par un point virgule chaque fin d'instruction, comme en
langage C ou en Perl.
La balise de fin (?>) implique la fin d'une instruction, et donc ajoute implicitement un
24
Lchappement
Une des complications de lenvoi de donnes un navigateur est laffichage de guillemets
Remarques
PHP est insensible la casse en ce qui concerne les noms de fonctions:
echo() = ECHO() = eCHo()
On peut utiliser ces fonctions pour envoyer du HTML au navigateur:
echo '<b>Hello, <FONT SIZE=+2>world</FONT> !</b>';
Echo() (mais pas print) permet denvoyer plusieurs informations dcoupes au
navigateur en les sparant par des virgules:
echo 'Hello, ', "world!";
affiche, on peut utiliser les balises <br /> (rupture de ligne) ou <p></p> (marques de
paragraphe). Pour modifier lespacement du code HTML laide de PHP, on a le choix
entre:
Utiliser echo() ou print() entre plusieurs lignes;
Utiliser le caractre alina (\n) plac entre une paire de guillemets.
25
Commentaires
PHP supporte les commentaires comme en C, C++ et Shell Unix. Par exemple :
<?php
echo "Ceci est un test"; // Ceci est un commentaire sur une ligne comme en C++
/* Ceci est un commentaire sur plusieurs lignes,
comme en C et C++ */
echo "Ceci est encore un test";
echo "Enfin, le test final"; # Ceci est un commentaire comme en Shell Unix
?>
Faites attention ne pas emboter les commentaires de type langage C, ce qui arrive de
temps en temps lorsque vous voulez commenter une grande partie de code.
<?php
/*
echo "Ceci est un test"; /* Ce commentaire va poser un problme */
*/
?>
2. Les variables
Les variables, qu'est ce que c'est?
Les variables sont destines conserver temporairement des valeurs.
Le typage des variables est implicite en php. Il nest donc pas ncessaire de dclarer leur
type au pralable ni mme de les initialiser avant leur utilisation.
26
Utiliser des guillemets pour que les variables soient correctement affiches.
La concatnation est une opration importante pour les chanes de caractres. Elle est
l'quivalent de ce qu'est l'addition pour les nombres. Elle s'effectue avec l'oprateur (.).
<?php
# Listing - concat.php
// Cre les variables
$prnom = 'Jules';
27
$nom = 'Verne';
$auteur = $prnom . ' ' . $nom;
// Une nouvelle variable, $auteur, est cre pour recevoir le rsultat de la concatnation.
$livre = 'Vingt mille lieues sous les mers';
// Affichez les valeurs
echo "Le livre <i>$livre</i> a t crit par $auteur.";
// Le livre Vingt mille lieues sous les mers a t crit par Jules Verne.
?>
Remarques
PHP possde un grand nombre de fonctions de traitement de chanes de caractres. Par
exemple, pour connatre le nombre de caractres que contient une chane de caractres,
on peut utiliser la fonction strlen() :
$nb = strlen($chane);
Lorsqu'on affecte une nouvelle valeur une variable, elle crase la prcdente, dont
Ou :
$nom_complet = $prnom;
$nom_complet .= '' '';
$nom_complet .= $nom;
28
Oprateurs arithmtiques
Exemple
Nom
Rsultat
$a + $b
Addition
Somme de $a et $b
$a - $b
Soustraction
Diffrence de $a et $b
$a * $b
Multiplication
Produit de $a et $b
$a / $b
Division
Quotient de $a et $b
$a % $b
Modulo
Fonctions arithmtiques
Il existe une kyrielle de fonctions arithmtiques. Exemples :
round() : effectue un arrondi sur un nombre dcimal en lui donnant la valeur de lentier
le plus proche :
$n = 3.14;
$n = round ($n); // rsultat : 3
On peut spcifier le nombre de positions dcimales o doit intervenir larrondi au moyen
dun second argument dans lappel de la fonction :
$n = 3.142857;
$n = round ($n, 3); // rsultat : 3.143
29
5. Les constantes
Les constantes
Les constantes sont des types de donnes PHP spcifiques qui, la diffrence des
variables, conservent leur valeur initiale tout au long dun script.
Pour crer une constante, on utilise la fonction define () la place de loprateur
daffectation (=). Exemple :
define ('NOM', 'toto');
Contrairement aux variables, les identificateurs de constantes (et aussi ceux de fonction)
ne sont pas sensibles la casse.
Usuellement, les constantes scrivent en majuscules, mais ce nest pas une obligation.
Et, ce qui est plus important, leur nom ne commence pas par un caractre dollar ($)
comme cest le cas pour les variables.
Laffichage des constantes peut se faire de deux faons :
echo 'Hello, ' . NOM;
Ou
echo 'Hello, ' . NOM;
Mais on ne peut pas crire :
echo 'Hello, NOM''; (PHP afficherait tout simplement : Hello, NOM et non pas la valeur de la
constante NOM).
Il existe un certain nombre de constantes prdfinies dans PHP. Exemples :
PHP_VERSION (le numro de la version de PHP que vous utilisez) et PHP_OS (le
systme dexploitation du serveur).
30
B - Programmation en PHP
Au sommaire de ce partie
Comment utiliser PHP pour manipuler les valeurs transmises par les formulaires HTML?
La balise <form> :
<form action= ''script.php'' method=''post'>
<!-- On place les diffrentes balises dentre, botes de texte, boutons radio, cases cocher
..
</form>
Lattribut action indique quelle page seront envoyes les donnes du formulaire.
Lattribut method dun formulaire commande le choix de la faon dont les lments
recueillis seront envoys la page de traitement.
Les deux valeurs possibles get et post font rfrence la mthode du protocole HTTP
(HyperText Transfer protocol) qui sera utilis pour le transfert.
Lattribut method
La mthode get envoie les donnes sous forme dune suite de couples nom/valeur
abouts lURL. Exemple :
www.mon-site.com/decode-formu.php?name=Jules&genre=M
Lavantage de cette mthode : permet dajouter la page aux signets du navigateur (de la
bookmarker ).
On peut galement cliquer sur licne page prcdente du navigateur pour revenir la
page get ou la recharger sans problme.
Ces deux facilits sont interdites si le formulaire utilise la valeur post pour lattribut
method.
On est limit dans le nombre de couples nom/valeur envoys, et la scurit est mauvaise
car ces donnes sont parfaitement visibles puisquelles figurent la suite de lURL.
31
32
Formulaire HTML
Ce formulaire formu.html reoit 5 valeurs de quatre types diffrents : un nom (texte),
une adresse e-mail (texte galement), une indication de sexe (boutons radio) et des
commentaires (zone de texte). Le 5me lment est llment submit qui gnre le
bouton denvoi.
Si on a une bote dentre dans le formulaire dont la valeur de lattribut name est email,
PHP va placer le texte saisi dans la variable dont le nom est $email.
Ceci est valable quel que soit le type dentre. Dans notre exemple traite_formu.php peut
manipuler les variables $nom, $email, $sexe, $age, $commentaires et $submit.
33
charset=iso-8859-1" />
<title>Accus de rception de formulaire</title>
</head>
<body>
<?php
# Listing - traite_formu.php
echo "Merci, <b>$nom</b>, pour les commentaires suivants :<br />
<tt>$commentaires</tt>
<p>Nous allons y rpondre votre adresse e-mail <i>$email</i></p>";
?>
</body>
</html>
Magic Quotes
Lorsque cette option est active, apostrophes et guillemets seront automatiquement
34
structures de contrle :
Instructions conditionnelles. Ces instructions excutent du code si une condition est
fois jusqu ce quune condition soit value soit comme vraie, soit comme fausse.
Instructions conditionnelles
Le principe dune instruction conditionnelle est le suivant : une expression conditionnelle
est value et, si la condition est vraie ou fausse, du code est excut.
En PHP, les instructions conditionnelles les plus courantes sont :
if else elseif
switch case
Linstruction if
Syntaxe :
if (expression)
{
bloc dinstructions;
}
Linstruction if est utilise pour valuer une expression. Elle rend compte du rsultat de
cette valuation en renvoyant la valeur boolenne True ou False. Si la condition est
value comme vraie (True), le jeu dinstructions qui suit la condition if est excut. Dans
le cas contraire, le contrle est transfr aux instructions qui succdent au bloc if.
if else
Linstruction else est utilise uniquement avec linstruction if, et jamais sparment.
Syntaxe :
if (expression)
{
bloc dinstructions 1;
}
else
{
bloc dinstructions 2;
}
if elseif else
Une deuxime expression est value dans elseif si la premire est value False, la
35
partie else jouant le mme rle que prcdemment si aucune des deux conditions nest
remplie.
Syntaxe :
if (expression1)
{
bloc dinstructions 1;
}
elseif (expression2)
{
bloc dinstructions 2;
}
else
{
bloc dinstructions 3;
}
Remarques
Les accolades qui servent marquer le dbut et la fin dun bloc ne sont pas ncessaire si
Signification
Type
Exemple
assigne une
valeur
affectation
$n = 1;
==
gal
comparaison
$x = = $y
!=
diffrent de
comparaison
$x != $y
<
infrieur
comparaison
$x < $y
>
suprieur
comparaison
$x > $y
<=
infrieur ou gal
comparaison
$x <= $y
>=
suprieur ou
gal
comparaison
$x >=$y
36
Sens
or
OU
xor
Exemple
($a or $b) vaut true si $a OU $b valent true, et false
sinon.
and
ET
&&
ET
||
OU
NON
37
</body>
</html>
switch
Il existe en PHP une autre instruction conditionnelle appele switch que lon peut utiliser
la place dune cascade de if elseif else.
Syntaxe :
switch ($variable)
{case "valeur_1" :
// Faire ce traitement
Break;
case "valeur_2" :
// Faire cet autre traitement
Break;
default :
// Troisime traitement
}
Fonctionnement
La valeur de $variable est compare successivement toutes les valeurs de case.
Lorsquon trouve une galit, le code qui suit est excut jusques et y compris le break,
qui a pour effet de faire sortir du switch. Si aucune galit nest trouve, cest la clause
default qui est excute. A sa suite, aucun break nest videmment ncessaire.
switch - Exemple
switch ($sexe)
{ case "M" :
echo "<b><p>Bonjour Monsieur</p></b>";
break;
case "F" :
echo "<b><p>Bonjour Madame</p></b>";
break;
default :
echo "<b><p>Vous avez oubli d'indiquer votre sexe</p></b>";
}
Mais isset () prsente une difficult : le test dune chane de caractre vide revoie TRUE.
Pour liminer ce cas, il faut faire usage de la fonction strlen (), qui renvoie la longueur
38
39
Abouter lURL la valeur quon veut faire traiter par le script qui est appel :
www.mon-site.com/page.php?nom=Arthur
Technique qui mule la mthode get dun formulaire HTML.
40
41
42
Remarque
Les lments cachs dun formulaire ne sont pas affichs dans la fentre du navigateur
mais sont nanmoins prsents dans le source. Il ne faut jamais les utiliser pour conserver
des lments confidentiels.
5. Les tableaux
Les tableaux
Les chanes de caractres et les nombres sont des variables scalaires, c..d. qui nont
Valeur
Bruel
Piaf
Martin
Souchon
Valeur
France
BE
Belgique
CDN
Canada
MA
Maroc
Tableaux superglobaux
Il existe une notation permettant de reprer plusieurs types de tableaux par dfaut dfinis
43
envoyes au moyen dun attribut method=get (venant dun formulaire par exemple).
La variable $_POST reprsente lendroit o sont conserves toutes les variables et
sur notre serveur, on peut choisir dcrire, par exemple, $nom au lieu de
$_POST['nom'].
Les tableaux
Un tableau obit aux mmes rgles dappellation que nimporte quelle autre variable.
Hors de son contexte, on ne peut pas savoir si $var dsigne un scalaire ou un tableau.
La seule diffrence quil y a rside dans la faon de reprer un lment particulier lorsquil
Le script traite_calculateur.php
Rcrire le script traite_calculateur.php en utilisant les tableaux superglobaux :
44
Remarques
Un tableau peut utiliser une association de nombres et de chanes de caractres en guise
de cls. La seule exigence est que toutes les cls dun mme tableau soient uniques.
Pour une version plus ancienne que la 4.1 de PHP, on doit utiliser $HTTP_POST_VARS
Deux faons :
1) Placer des lments en par un :
$tableau[] = "une valeur";
$tableau[] = "une autre valeur";
$tableau['alpha'] = "encore une valeur";
2) Faire usage de la construction array () pour crer un tableau en une seule tape:
$tableau = array ('non'=>'Toto', 'profession'=>'boulanger');
On peut modifier lorigine des cls numriques (0, par dfaut) de cette faon :
$jours = array (3=>'mardi', 'mercredi', 'jeudi');
echo $jours[5]; // jeudi
45
46
calendrier.php
Ces trois menus droulants ont t crs avec des tableaux et une boucle foreach.
47
Remarques
Pour connatre le nombre dlments que contient un tableau, il existe la fonction sizeof
() et la fonction count () qui sont des synonymes :
$n = count ($tableau);
Depuis la version 4.1 de PHP, la fonction range () peut galement crer un tableau
squentiel de lettres :
$alphabet = range (a, z);
La fonction is_array () permet de vrifier quune variable est bien de type tableau.
Les noms qui interviennent dans la boucle foreach peuvent tre quelconques. Les
amricains prfrent $key et $value. Dans la version franaise, nous avons choisi $cl et
$valeur, mais on aurait aussi bien pu (au dtriment de la lisibilit du script) les appeler
$minet et $casimir.
$stars est un tableau deux dimensions. Pour accder au tableau $artistes, on crirait
$stars['artistes'] et, pour accder Monroe, on crirait $stars["vedettes"][1].
Rgle : crire le nom du tableau deux dimensions suivi par la cl du premier tableau
entre crochets suivi par la cl du second, galement place entre crochets.
48
<p><b>Interts :</b>
<input type="checkbox"
<input type="checkbox"
<input type="checkbox"
<input type="checkbox"
<input type="checkbox"
</p>
name="interet[]"
name="interet[]"
name="interet[]"
name="interet[]"
name="interet[]"
qqch.html
49
50
51
52
Exemple :
for ($i=1; $i<=10; $i++)
{echo "$i<br>";
}
53
require_once :
include_once ("monfichier.php");
require ("/chemin/vers/monfichier.php");
include() et require() produisent le mme rsultat lorsquelles sont correctement
employes, mais donnent lieu des erreurs dans le cas contraire.
Si un appel include() ne produit pas le rsultat escompt (le fichier ne peut pas tre
inclus, quelle quen soit la raison), un avertissement sera affich dans la fentre du
navigateur, mais le script continuera tourner.
Dans le cas de require(), un message derreur sera affich et le script sarrtera.
Si, gnralement par suite dune erreur, on avait voulu inclure deux fois de suite le mme
fichier, lopration ne serait effectue que la premire fois sans qu'un message derreur
soit affich. Exemple :
include_once ("monfichier.php");
54
</tr>
<tr>
<td bgcolor="#CCCCCC">
<table width="100%" border="0" cellspacing="1" cellpadding="2">
<tr>
<td align="center"><a href="index.php">Accueil</a></td>
<td align="center"><a href="menuder.php">Menus droulants</a></td>
<td align="center"><a href="calculateur.php">Calculateur</a></td>
<td align="center"><a href="enreg.php">Enregistrement</a></td>
</tr>
</table></td>
</tr>
</table>
<br />
<!-- Listing entete.inc -->
<!-- Le contenu spcifique d'une page commence ici -->
55
</table></td>
</tr>
</table>
<table width="90%" border="0" cellspacing="4" cellpadding="4" align="center">
<tr>
<td width="70%" valign="top"> <p><b>Content....</b></p>
<hr />
<p>Bla bla bla... et le reste...</p>
</td>
</tr>
</table>
<?php
include ('./pied_page.inc'); // Inclure le fichier du pied de page
?>
http://localhost/scripts_du_cours/chapitre3/index.php
Remarques
Il est prfrable dinclure les fichiers importants (comme ceux qui permettent la
connexion une base de donnes) avec require() et de rserver include() linclusion des
fichiers qui ne concernent que lapparence ou la mise en page.
56
Exemple : menuder.php
<?php
# Listing - menuder.php
// Crer le titre et inclure un fichier d'en-tte
$titre_page = 'Formulaire pour calendrier';
require ('./entete.inc');
// Tableau associatif des jours
$jours = array('Mon'=>'lundi', 'Tue'=>'mardi', 'Wen'=>'mercredi',
'Thu'=>'jeudi', 'Fri'=>'vendredi', 'Sat'=>'samedi',
'Sun'=>'dimanche');
// Cette fonction cre trois menus droulants : mois, jours et annes
function menu_der()
{ // Tableau index des mois
$mois = array (1 => 'janvier', 'fvrier', 'mars', 'avril', 'mai',
'juin', 'juillet', 'aot', 'septembre', 'octobre', 'novembre',
'dcembre');
// Cration des menus droulants
echo "<select name='jour'>";
for ($jour = 1; $jour <= 31; $jour++)
{ echo "<option value=\"$jour\">$jour</option>\n";
}
echo "</select>\n";
echo "<select name='mois'>";
foreach ($mois as $cl => $valeur)
{ echo "<option value=\"$cl\">$valeur</option>\n";
}
echo "</select>\n";
echo "<select name='anne'>";
$anne = 2003;
while ($anne <= 2010)
{ echo "<option value=\"$anne\">$anne</option>\n";
$anne++;
}
57
echo "</select>\n";
} // Fin de la fonction menu_der().
echo '<form action="menuder.php" method="post">'; // Crer le formulaire
menu_der ();
echo '</form>'; // Fin du formulaire
echo '<p>Nous sommes ', $jours[date ('D')], ' et il est ', date ('H \h i'), '.</p>';
include ('./pied_page.inc'); // Inclure le pied de page
?>
http://localhost/scripts_du_cours/chapitre3/menuder.php
58
http://localhost/scripts_du_cours/chapitre3/calculateur.php
59
traite_calculateur.php
<?php # Listing - traite_calculateur.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = 'Calculateur';
include ('./entete.inc');
/* --------------------------Cette fonction calcule un prix total d'aprs une quantit, un prix unitaire et un taux de
taxe puis affiche le rsultat.
*/
function calcul_total ($quantite, $prix, $taxe)
{ $total = ($quantite * $prix) * ($taxe + 1);
$total = number_format ($total, 2, ",", " ");
echo "Vous achetez <b>$quantite</b> machin(s) d'un cot unitaire ",
"de <b>$prix €.</b><br>";
echo "Le montant TTC de votre achat s'lve <b>$total</b> €.\n";
}
/*---------------------------------------------------------*/
// Vrification
if (is_numeric($_POST['quantite'])) // la quantit est-elle un nombre ?
{ calcul_total ($_POST['quantite'], $_POST['prix'], $_POST['taxe']);
60
}
else
{ // La quantit n'est pas un nombre
echo '<p><b>La quantit indique n\'est pas un nombre</b></p>';
}
include ('./pied_page.inc'); // Inclure le pied de page
?>
http://localhost/scripts_du_cours/chapitre3/traite_calculateur.php
61
ma_fonction ('Thomas');
ma_fonction ('Jean', 'Racine');
Dans le fichier calculateur.php,il faut modifier la balise qui cre le formulaire : <form
action="traite_calculateur-1.php" method="post">
http://localhost/scripts_du_cours/chapitre3/traite_calculateur-1.php
62
63
}
/* Lexcution de cette fonction naffiche plus rien, elle renvoie seulement le prix total sous
forme dune valeur numrique */
/*---------------------------------------------------------*/
// Vrification
if (is_numeric($_POST['quantite'])) // la quantit est-elle un nombre ?
{ $total = calcul_total ($_POST['quantite']);
echo "Le montant TTC de votre achat s'lve <b>$total</b> €.<br>";
}
else
{ // La quantit n'est pas un nombre
echo '<p><b>La quantit indique n\'est pas un nombre</b></p>';
}
include ('./pied_page.inc'); // Inclure le pied de page
?>
Dans le fichier calculateur.php,il faut modifier la balise qui cre le formulaire : <form
action="traite_calculateur-2.php" method="post">
http://localhost/scripts_du_cours/chapitre3/traite_calculateur-2.php
Remarques
Une fonction peut contenir plusieurs instructions return, par exemple dans une instruction
64
comme faisant partie de la page; cest galement vrai pour les variables qui sy trouvent
dfinies.
Les variables dfinies dans une fonction utilisateur ne sont visibles qu lintrieur de cette
fonction.
Sauf prcaution particulire, depuis lintrieur de cette fonction on ne "voit" pas les
variables dfinies dans le reste du script ou dans les autres fonctions utilisateur.
Une variable dfinie dans une fonction utilisateur peut donc avoir le mme nom quune
variable dfinie dans le reste du script sans quil y ait risque de confusion (cas de la
variable $total dans le listing prcdent traite_calculateur-2.php).
Linstruction global permet de modifier la visibilit dune variable dans une fonction
utilisateur :
function ma_fonction ()
{ global $ma_var;
}
$ma_var=12345;
Dans cet exemple, la variable $ma_var a la mme valeur lintrieur et lextrieur de la
fonction ma_fonction(). Si cette fonction modifie sa valeur, cette nouvelle valeur sera
accessible dans tout le script.
Il existe une autre possibilit de modifier la visibilit dune variable, cest de faire appel
aux superglobaux $_GET, $_POST, $_SESSION, etc. Puisquelles sont "superglobales",
ces variables sont accessibles de partout dans le script.
65
Dans le fichier calculateur.php,il faut modifier la balise qui cre le formulaire : <form
action="traite_calculateur-3.php" method="post">
http://localhost/scripts_du_cours/chapitre3/traite_calculateur-3.php
Remarques
Depuis la version 3 de PHP, on peut aussi utiliser la tableau $GLOBALS, qui renferme
toutes les variables et toutes les valeurs transmises au moyen des mthodes get ou post
ou des cookies.
66
le formulaire et le second pour traiter les valeurs qui ont t transmises par ce formulaire
(cette mthode fonctionne parfaitement).
Il peut savrer commode de regrouper ces deux scripts en un seul. Une instruction
conditionnelle permet dy parvenir :
if (isset($_POST['submit']))
{ // Traiter le formulaire
}
else
{ // Afficher le formulaire
}
Si on veut que le script raffiche le formulaire aprs en avoir affich les rsultats, on peut
crire :
if (isset($_POST['submit']))
{ // Traiter le formulaire
}
// Afficher le formulaire
Formulaire denregistrement
<?php # Listing - enregistrer.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = 'Enregistrement';
include ('./entete.inc');
if (isset($_POST['submit']))
{ // Traiter le formulaire. Si le formulaire a dj t envoy, il faut vrifier son contenu
// Vrifier la prsence d'un nom
if (strlen($_POST['nom']) > 0)
{ $nom = TRUE;
}
else
{ $nom = FALSE;
echo '<p>Vous avez oubli d\'indiquer votre nom</p>';
}
// Vrifier l'existence d'une adresse e-mail
if (strlen($_POST['email']) > 0)
{ $email = TRUE;
}
else
{ $email = FALSE;
echo "<p>Vous avez oubli d'indiquer votre adresse e-mail</p>";
}
// Vrifier la prsence d'un nom d'utilisateur
if (strlen($_POST['nom_d_utilisateur']) > 0)
{ $nom_d_utilisateur = TRUE;
}
else
{ $nom_d_utilisateur = FALSE;
echo "<p>Vous avez oubli d'indiquer votre nom d'utilisateur</p>";
67
}
// Vrifier l'existence et l'exactitude du mot de passe
if (strlen($_POST['mot_de_passe1']) > 0)
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $mot_de_passe = TRUE;
}
else
{ $mot_de_passe = FALSE;
echo '<p>Votre mot de passe est diffrent de celui que vous avez prcdemment
dclar</p>';
}
} else
{ $mot_de_passe = FALSE;
echo "<p>Vous avez oubli d'indiquer votre mot de passe</p>";
}
if ($nom && $email && $nom_d_utilisateur && $mot_de_passe)
{ // Si tout est correct
// Enregistrer l'utilisateur
echo "<p>Vous tes maintenant enregistr</p>";
}
else
{ // Quelque chose n'est pas correct
echo "<p>Veuillez avoir l'obligeance de recommencer</p>";
}
} else
{ // Afficher le formulaire
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>
<p><b>Nom :</b>
<input type="text" name="nom"
size="20" maxlength="40" />
</p>
<p><b>Adresse e-mail :</b>
<input type="text" name="email"
size="40" maxlength="60" />
</p>
<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_d_utilisateur"
size="20" maxlength="40" />
</p>
<p><b>Mot de passe :</b>
68
Remarques
69
if (isset($_POST['submit']))
{ // Traiter le formulaire
..
..
if ($nom && $email && $nom_d_utilisateur && $mot_de_passe)
{ // Si tout est correct, enregistrer l'utilisateur
$texte_message = "Merci de vous tre enregistr sur notre site.\n";
$texte_message .= "Votre nom d'utilisateur est : \"{$_POST['nom_d_utilisateur']}\"";
$texte_message .= " et votre mot de passe : \"{$_POST['mot_de_passe1']}\"";
mail ($_POST['email'],
'Merci de votre enregistrement', $texte_message,
'From: admin@site.com');
echo "<p>Vous tes maintenant enregistr. Un e-mail de confirmation a t envoy
l'adresse e-mail que vous nous avez indique.</p>";
}
else
{ // Quelque chose n'est pas correct
echo '<p>Veuillez avoir l\'obligeance de recommencer</p>';
}
} else
{ // Afficher le formulaire
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
...................
Remarques
On ne peut pas envoyer ainsi des pices jointes, mais on peut envoy un texte format
en HTML.
Pour ajouter plusieurs en-ttes, on les spare par des \r\n :
5. En-ttes HTTP
Redirection dun utilisateur laide de la fonction header()
HTTP (HyperText Transfer Protocol) : Protocole de transfert dinformations qui est au
cur du Web. Il dfinit la faon dont clients et serveurs communiquent entre eux.
On peut tirer parti de ce protocole en appelant la fonction native header() de PHP.
70
Comme cest en principe la dernire instruction de la page qui va tre excute (puisque
le contenu de cette page va tre remplac), elle devrait tre suivie dune instruction
exit() qui arrte lexcution du script.
La fonction header() doit tre appele avant que soit effectue une sortie dinformation
quelconque vers le navigateur. Mme du code HTML ou le moindre espace. Si le code
contient une instruction echo() ou print() ou des lignes vierges en dehors des balises PHP
ou sil inclut des fichiers qui peuvent jouer le mme rle, on verra safficher un message
indiquant limpossibilit de la redirection.
La fonction headers_sent() regarde si de linformation a dj t envoye au navigateur
:
if (! headers_sent())
{ header ("Location: http://www.url.com/page.php");
exit;
}
else
{ echo "La redirection ne peut pas tre effectue<p>";
}
Exercice : Modifier le script denregistrement pour que lutilisateur soit redirig vers une
autre page lorsque son enregistrement aura t ralis. Pour cela, il faut restructurer la
page pour viter que quelque chose soit envoy au navigateur avant lappel de header().
Suggestions :
71
{ $nom_d_utilisateur = TRUE;
}
else
{ $nom_d_utilisateur = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom d\'utilisateur</p>';
}
// Vrifier l'existence et l'exactitude du mot de passe
if (strlen($_POST['mot_de_passe1']) > 0)
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $mot_de_passe = TRUE;
}
else
{ $mot_de_passe = FALSE;
$message .= '<p>Votre mot de passe est diffrent de celui que vous avez
prcdemment dclar</p>';
}
} else
{ $mot_de_passe = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre mot de passe</p>';
}
if ($nom && $email && $nom_d_utilisateur && $mot_de_passe)
{ // Si tout est correct, enregistrer l'utilisateur
$texte_message = "Merci de vous tre enregistr sur notre site.\n";
$texte_message .= "Votre nom d'utilisateur est : \"{$_POST['nom_d_utilisateur']}\"";
$texte_message .= " et votre mot de passe : \"{$_POST['mot_de_passe1']}\"";
mail ($_POST['email'],
'Merci de votre enregistrement',
$texte_message,
'From: admin@site.com');
header("Location: merci.php");
exit;
}
else
{ // Quelque chose n'est pas correct
$message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
}
}
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = "Confirmation d'enregistrement";
include ('./entete.inc');
if (isset($message))
{ echo "<font color='red'>$message</font>";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
72
<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>
<p><b>Nom :</b>
<input type="text" name="nom" size="20" maxlength="40" />
</p>
<p><b>Adresse e-mail :</b>
<input type="text" name="email" size="40" maxlength="60" />
</p>
<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_d_utilisateur" size="20" maxlength="40" />
</p>
<p><b>Mot de passe :</b>
<input type="password" name="mot_de_passe1" size="20" maxlength="40" />
</p>
<p><b>Confirmez votre mot de passe :</b>
<input type="password" name="mot_de_passe2" size="20" maxlength="40" />
</p>
</fieldset>
<div align="center">
<input type="submit" name="submit" value="Envoyer les informations" />
</div>
</form><!-- Fin du formulaire -->
<?php
// Fin de l'instruction conditionnelle principale
include ('./pied_page.inc'); // Inclure le pied de page
?>
Remarques
Il est prfrable de faire usage dune adresse absolue dans largument pass la fonction
header() :
73
6. Formulaires mmoire
Formulaires mmoire
Formulaires qui gardent trace des informations quils ont reues et qui peuvent les
rafficher en cas derreur pour viter que lutilisateur ait toutes les valeurs ressaisir.
Lattribut value dune balise <input> donne une valeur prdfinie au contenu dun champ
de saisie :
<input type="text" size="20" maxlength="40" name="nom" value= "Jules" />
Pour que PHP prdfinisse cette valeur, on crit :
<input type="text" size="20" maxlength="40" name="nom" value="<?php echo
$_POST['nom']; ?>" />
Dans notre script denregistrement redir.php, on modifie toutes les instructions du
formulaire de saisie destines recueillir les informations de lutilisateur de faon que ces
instructions se prsentent sous cette forme :
<p><b>Nom dutilisateur :</b>
<input type="text" name="nom_d_utilisateur" size="20" maxlength="40"
value="<?php if (isset($_POST['nom_d_utilisateur']))
echo $_POST['nom_d_utilisateur']; ?>" /></p>
Formulaires mmoire
<?php # Listing - formem.php
if (isset($_POST['submit']))
{ // Traiter le formulaire
$message = NULL;
// Vrifier la prsence d'un nom
if (strlen($_POST['nom']) > 0)
{ $nom = TRUE;
}
else
{ $nom = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom</p>';
}
// Vrifier l'existence d'une adresse e-mail
if (strlen($_POST['email']) > 0)
{ $email = TRUE;
}
else
{ $email = FALSE;
$message .= "<p>Vous avez oubli d'indiquer votre $1$
adresse e-mail</p>';
}
74
75
Remarques
Pour des raisons videntes, il nest pas possible de dfinir la valeur dun champ dentre
du type password.
Pour prdfinir ltat dun bouton radio ou dune case cocher : ajouter lattribut checked
leur balise HTML :
<input type="radio" name="interets[]" value="Ski" checked />
Remarques
Pour prslectionner une rubrique de menu droulant : faire figurer lattribut boolen
76
77
Chapitre 4
78
Introduction
SQL : Structured Query Language (langage structur de requtes) est un langage de
requte vers les bases de donnes exploitant le modle relationnel.
Chaque SGBD important utilise SQL, et MySQL ne fait pas exception la rgle.
SQL a t cr au dbut des annes 70 daprs la thorie des bases de donnes
relationnelles, labore par E. F. Godd.
Le serveur de base de donnes MySQL est trs souvent utilis avec le langage de cration
de pages web dynamiques : PHP.
Sommaire
Conception dune table
Le moniteur mysql
Cration de bases de donnes et de tables
Insertion denregistrements
Slection de donnes
Affichages conditionnels
LIKE et NOT LIKE
Tri des rsultats de recherche
Limitation du nombre de rsultats affichs
Mise jour des donnes
Suppression denregistrements
On va crer une base de donnes quon appellera ma_base et dans laquelle seront
conserves des informations concernant des enregistrements dutilisateurs.
Elle contiendra une unique table, utilisateurs, compose de plusieurs colonnes destines
conserver
lidentificateur personnel de lutilisateur,
son nom,
son prnom,
son adresse e-mail,
son mot de passe
et la date laquelle il sest enregistr.
Le nom des colonnes respecte les rgles de grammaire de SQL : noms alphanumriques
sans espace avec le blanc soulign (_) possible.
79
Nom de la colonne
Exemple
id-utilisateur
834
prnom
Dupont
nom
Pierre
p.dupont@monserveur.com
mot_de_passe
56hf228
date_enreg
2003-05-13 17:03:24
Il faut dterminer le type de donnes de chacun des champs qui seront utiliss car il
faudra lindiquer lors de la cration de la structure de la base.
Pour tout SGBD, il existe 3 catgories principales de donnes:
Texte;
Nombres;
Dates et heures.
A lintrieur de chacune de ces catgories, il existe plusieurs variantes, certaines propres
MySQL.
Le choix de la catgorie la plus approprie a un impact non seulement sur le type des
informations pouvant tre conserv mais aussi sur les performances dexploitation
ultrieures.
nom
borne infrieure
borne suprieure
TINYINT
-128
127
TINYINT UNSIGNED
255
SMALLINT
-32768
32767
SMALLINT UNSIGNED
65535
MEDIUMINT
-8388608
8388607
MEDIUMINT UNSIGNED 0
16777215
INT*
-2147483648
2147483647
INT* UNSIGNED
4294967295
BIGINT
-9223372036854775808 9223372036854775807
BIGINT UNSIGNED
18446744073709551615
80
nom
domaine ngatif :
borne infrieure
borne suprieure
Domaine positif :
borne infrieure
borne suprieure
FLOAT
-3.402823466E+38
-1.175494351E-38
1.175494351E-38
3.402823466E+38
DOUBLE*
-1.7976931348623157E+308 2.2250738585072014E-308
-2.2250738585072014E-308 1.7976931348623157E+308
nom
longueur
CHAR(M)
CHAR(M) BINARY
VARCHAR(M)
VARCHAR(M) BINARY
nom
longueur
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
DECIMAL(M,D)*
81
nom
description
DATE
DATETIME
TIMESTAMP
TIMESTAMP(M)
TIME
YEAR
nom
description
TIMESTAMP(2)
AA
TIMESTAMP(4)
AAMM
TIMESTAMP(6)
AAMMJJ
TIMESTAMP(8)
AAAAMMJJ
TIMESTAMP(10)
AAMMJJHHMM
TIMESTAMP(12)
AAMMJJHHMMSS
TIMESTAMP(14)
AAAAMMJJHHMMSS
82
Les types ENUM et SET sont une extension de MySQL et nexistent donc pas dans
tous les SGBD. Leur emploi limite donc la potabilit dune base de donnes.
Lorsquon place une chane de caractres de cinq caractres dans un champ char (2),
les trois derniers caractres sont perdus. Cest la mme chose pour tous les champs
dont la longueur est dfinie lavance.
83
Nom de la colonne
Type
id_utilisateur
nombre
prnom
texte
nom
texte
texte
mot_de_passe
texte
date_enreg
date
Les nombres (les codes postaux, les prix, ) seront des zones de texte si on choisit de les
conserver avec leur ponctuation (caractre euro, tirets, espace), mais on obtiendra de
meilleures performances si on les conserve sous forme numrique (on les mettra en
forme au moment de leur utilisation).
Notre exemple :
Le champ id_utilisateur (qui est numrique) sera un MEDIUMINT (environ 17 millions de
valeurs sous forme non signe).
La date denregistrement (date_enreg) sera un DATETIME (conserver la date et lheure).
Les autres champs seront le plus souvent des VARCHAR puisque leur longueur peut
varier dun enregistrement lautre.
Le mot de passe sera une chane de caractres de longueur fixe.
Nom de la colonne
Type
id_utilisateur
MEDIUMINT
prnom
VARCHAR
nom
VARCHAR
VARCHAR
mot_de_passe
CHAR
date_enreg
DATETIME
84
Dfinir la longueur des zones de texte et des colonnes devant contenir des nombres ainsi
que les autres attributs (UNSIGNED ou NOT NULL par exemple).
La taille dun champ doit tre choisie la plus petite possible daprs la plus grande valeur
quon prvoit dy conserver. Par exp. si le champ id_utilisateur na que 3 chiffres : dfinir
la colonne qui le recevra comme un SMALLINT, (ce qui permet de loger 999 utilisateurs).
Il sera videmment du type non sign .
Dans notre exemple : tous les champs doivent tre renseigns (ils ne peuvent pas avoir la
valeur NULL), sauf en ce qui concerne ladresse e-mail.
Nom de la colonne
Type
id_utilisateur
prnom
nom
VARCHAR (40)
mot_de_passe
date_enreg
Le moniteur mysql
A part lusage de PHP, la faon la plus courante dadresser la serveur MySQL est de
passer par le client mysql (aussi appel le moniteur mysql). Avec lui, il est possible de se
connecter mysqld (la vritable application, qui contrle les bases de donnes) sur la
mme machine ou sur une autre.
Il ne faut pas confondre mysql avec MySQL, lequel est le systme de bases de donnes
considr dans son ensemble.
Sous Windows : on accde au client mysql au moyen dune fentre DOS.
Sous Mac OS X ou Linux : Utiliser lapplication Terminal pour cela.
Le client mysql utilise plusieurs arguments parmi lesquels le nom dutilisateur, le mot de
passe et le nom de lordinateur hte :
Mysql -u nom_d_utilisateur -p -h ordinateur_hte
Prsence de loption -p : mysql demandera le mot de passe. Mais on peut spcifier ce
dernier sur la ligne de commande en le tapant immdiatement aprs -p. Cette procdure
est moins scurise car tout le monde pourra ainsi le voir.
Sous mysqld, chaque commande MySQL doit se terminer par un point-virgule (;). On peut
donc poursuivre la frappe dune mme commande sur plusieurs lignes conscutives.
85
Lorsquon envoie des commandes mysql au moyen dun script, les commandes qui sy
trouvent ne doivent pas tre termines par un (;).
Index et cls :
Dans une base de donnes, un index permet de demander que cette base de donnes garde
un il sur les valeurs dune certaine colonne ou dun certain groupe de colonnes. De cette
faon, la lecture ou la mise jour de ces donnes seffectuera plus vite.
Dans une base de donnes, une cl fait partie intgrante du processus de normalisation mis
en place pour la conception de bases de donnes plus compliques. Il existe deux types de
cls, les cls primaires et les cls trangres (externes). En principe, chaque table doit avoir
une cl primaire. La cl primaire dune table est souvent lie une autre table sous forme
de cl externe.
La cl primaire dune table est un moyen artificiel de se rfrer un enregistrement et doit
respecter ces trois conditions :
Elle doit avoir une valeur.
Cette valeur ne doit jamais tre modifie.
Cette valeur doit tre unique pour chaque enregistrement de la base de donnes.
Dans la table utilisateurs, cest le champ id_utilisateur qui sera considr comme cl
primaire (MRIMARY KEY). Comme cest un nombre (toutes les cls primaires doivent
presque toujours tre des nombres), on lui a ajout lattribut AUTO_INCREMENT, ce qui
obligera MySQL incrmenter sa valeur chaque fois quune nouvelle valeur de id_utilisateur
86
sera ajoute la base de donnes. Vous verrez ce que cela signifie lorsque vous
commencerez insrer des enregistrements.
Cration de bases de donnes et de tables
Insertion denregistrements
Il existe deux formats pour enregistrer des valeurs dans une table :
1. On spcifie une une les colonnes garnir et les valeurs y placer :
INSERT INTO nom_base (col1, col2, ) VALUES (val1, val2, );
INSERT INTO nom_base (col4, col8, ) VALUES (val4, val8, );
Cette mthode nous permet de ne saisir que les valeurs non nulles. Les autres se verront
automatiquement affecter la valeur NULL ou toute autre valeur qui aurait pu tre
spcifie. Si parmi ces colonnes lune dentre elles a lattribut NOT NULL, une erreur sera
signale.
2. Saisir autant de valeurs quil y a de colonnes garnir:
INSERT INTO nom_base VALUES (val1, val2, NULL, , valn);
Il faut que toutes les valeurs soient spcifies , mme si certaines ont la valeur NULL. Sil ny
a pas exactement autant de valeurs quil existe de colonnes, une erreur sera signale.
On peut affecter des valeurs plusieurs lignes la fois :
INSERT INTO nom_base (col1, col2, )
VALUES (val1, val2, )
VALUES (valA, valB, )
VALUES (valx, valy, );
Cette mthode nest pas standard. Elle ne doit pas tre employe avec dautres SGBD que
MySQL.
87
Insertion denregistrements
Deux fonctions MySQL:
La fonction PASSWORD() : chiffrer les mots de passe qui permettent daccder MySQL.
Elle cre une chane de caractres qui a exactement 16 caractres (cest la raison du
choix de CHAR (16) dans la table utilisateurs). Lalgorithme de chiffrement est
irrversible, c--d quen partant du mot de passe chiffr il ny a aucun moyen de
retrouver le mot de passe original.
La fonction NOW() : insre un groupe date-heure correspondant au moment de linsertion
dans le champ o elle est appele.
Il ne faut pas placer une fonction de MySQL entre apostrophes ou entre guillemets. Il ne
doit pas y avoir despace entre la parenthse ouvrante et le dernier caractre du nom de
la fonction.
Insrer des donnes dans une table
1. Sous mysql, pour insrer une nouvelle ligne de donnes dans la table utilisateurs, on
utilise lune des 2 commandes suivantes :
INSERT INTO utilisateurs
(prenom, nom, email, mot_de_passe, date_enreg)
Values ('Jules', 'Cesar', 'j.cesar@roma.org',
PASSWORD('motpasse'), NOW());
INSERT INTO utilisateurs VALUES
('Jules', 'Cesar', 'j.cesar@roma.org',
PASSWORD('motpasse'), NOW());
88
Remarques
Pour insrer une valeur contenant une apostrophe ou un guillemet, on doit lchapper
avec un antislash :
INSERT INTO utilisateurs
(prenom, nom) VALUES ('Patrick', 'O\'Maley');
MySQL supprimera automatiquement les espaces terminaux dune valeur insrer dans
un champ de type VARCHAR.
Dans les versions actuelles de MySQL, le terme INTO qui intervient dans la commande
INSERT est facultatif.
En gnral, on place les chanes de caractres entre apostrophes et les nombres entre
apostrophes ou entre guillemets. Ceci est valable pour toutes les commandes et pas
seulement pour INSERT.
On peut afficher les colonnes dune table dans un ordre diffrent de leur ordre naturel.
Les colonnes seront affiches dans lordre o nous les numrons dans la commande
SELECT.
89
Affichages conditionnels
Les oprateurs les plus couramment utiliss avec une commande SELECT : (ils peuvent
tre associs dans des expressions parentses pour permettre une slection plus
fouille).
Oprateur
Signification
galit
<
infrieur
>
suprieur
<=
infrieur ou gal
>=
suprieur ou gal
!=
diffrent de
Oprateur
Signification
IS NOT NULL
a une valeur
IS NULL
na aucune valeur
BETWEEN
NOT BEETWEEN
OR (ou ||)
NOT (ou !)
90
Exemples
SELECT * FROM utilisateurs WHERE (id_utilisateur>=10)
AND (id_utilisateur<=20);
SELECT * FROM utilisateurs WHERE (nom='Mozart')
OR (nom='Mozar');
Slection des noms des utilisateurs qui nont pas dadresse e-mail:
Slection de lutilisateur dont le mot de passe est "sonate" : les mots de passe ont t
stocks aprs avoir t chiffrs avec la fonction PASSWORD(), il suffit de comparer
"sonate" avec le rsultat du chiffrement de ce mot par cette fonction :
91
Slectionnons les utilisateurs (nom, prnom) dont ladresse e-mail nest pas de la forme
xxx@menara.ma :
SELECT nom, prenom FROM utilisateurs WHERE email NOT LIKE '%@menara.ma';
Les caractres jokers peuvent tre utiliss au dbut et/ou la fin dune chane de
caractre :
Bien que LIKE et NOT LIKE soient normalement utilises avec des chanes de caractres,
elles peuvent aussi sappliquer des champs numriques.
Pour utiliser un caractre "_" et "%" dans une condition de recherche avec LIKE ou NOT
LIKE, il faut lchapper avec un antislash.
La clause ORDER BY modifie la prsentation des rsultats, par exemple en les triant sur
un champ donn dans un certain ordre.
Lorsquon ne prcise rien, les rsultas sont prsents dans un ordre imprvisible
(probablement dans lordre croissant des cls primaires).
Par dfaut, le sens du tri effectu par la clause ORDER BY est le sens ascendant (abrg
en ASC). Les nombres iront en croissant et les dates, du plus ancien au plus rcent.
On peut inverser le sens du tri au moyen de la clause DESC (descendant).
Slectionner tous les utilisateurs sur leur nom, par ordre alphabtique :
Afficher par ordre alphabtique les champs nom, prnom (dans cet ordre) pour tous les
utilisateurs :
92
SELECT prenom, nom FROM utilisateurs ORDER BY nom ASC, prenom ASC;
Afficher tous les utilisateurs par date denregistrement (le plus rcent en tte) :
On peut utiliser LIMIT en mme temps que WHERE et/ou ORDR BY en lajoutant la fin
de la requte :
93
Comme les suppressions, les mises jour sont lune des plus importantes raisons
dutiliser une cl primaire. (cette valeur qui ne devrait jamais changer) peut construire un
point de rfrence dans les clauses WHERE mme si chacun des autres champs doit tre
modifi.
Exemple : On veut modifier ladresse e-mail dun utilisateur (prnom : Fantz nom : Liszt).
On commence donc par dterminer la cl primaire de lenregistrement qui mintresse (
modifier) :
Utilisons toujours une clause WHERE pour faire une mise jour, sauf si nous voulons
modifier tous les enregistrements de la table.
Pour se protger contre une mise jour accidentelle dun trop grand nombre
denregistrements, on peut ajouter une clause LIMIT.
On ne doit jamais modifier le champ qui contient la cl primaire car cela pourrait
compromettre lintgrit des relations avec une autre table.
Suppression denregistrements
On peut supprimer des enregistrements dune table au moyen de la commande DELETE :
DELETE FROM nom_de_la_table WHERE champ='valeur';
Une fois supprim, un enregistrement est perdu sans espoir de rcupration.
Par prudence, on peut faire une copie de la table avant toute suppression.
Il est fortement recommand de faire figurer une clause WHERE dans la commande de
suppression. La requte DELETE FROM nom_de_la_table supprimera tout le contenu
dune table mais laissera intacte sa structure.
94
que sa structure mais recrera cette dernire. Le rsultat est identique, mais cette
mthode, inspire du SGBD Oracle, est plus rapide et plus sr.
Exemple de suppression de donnes :
Dterminons dabord la valeur du champ id_utilisateur (cl primaire) de lenregistrement
supprimer :
SELECT id_utilisateur FROM utilisateurs
WHERE prenom='Claudio' AND nom='Monteverdi';
MySQL affiche pour id_utilisateur : 14
Vrifions ensuite quil sagit bien de lenregistrement que nous voulons supprimer :
95
Chapitre 5
MySQL
96
MySQL
Sommaire
Ralisation de la maquette de notre application Web
Connexion MySQL et slection dune base de donnes
Gestion derreurs
Excution de requtes simples
Rcupration des rsultats dune requte
La scurit
Utilisation de mysql_num_rows()
Modification des enregistrements avec PHP
Introduction
Parmi toutes les API quon peut interfacer avec MySQL (Perl, Java, C, C++, Python et
autres), PHP est la plus rpandue.
Le support de MySQL doit tre dfini dans la configuration de PHP.
Dans ce chapitre, on va utiliser la base de donnes ma_base, cre au chapitre
prcdent, et raliser une interface permettant de dialoguer avec la table utilisateurs.
97
98
</td>
</tr>
<tr> <!-- LIGNE DE COPYRIGHT -->
<td bgcolor="#999966"> </td>
<td bgcolor="#999966">
<div align="center">
<font size="-l">Copyright © 2007 PHP & MySQL º
<a href="#">ProgWeb, Inc. </a>
</font>
</div>
</td>
<td bgcolor="#999966"> </td>
</tr>
</table> <!-- Script - pied_page.inc -->
</body>
</html>
Ralisation de la maquette
Cration de la Page daccueil :
<?php # Listing - index.php
$titre_page = "Bienvenue";
include ('modeles/entete.inc'); // inclure le fichier d'en-tte
echo '<p>Bienvenue ProgWeb.net</p>';
include ('modeles/pied_page.inc'); // inclure fichier de pied de page
?>
99
Gestion derreurs
Gestion derreurs
Erreurs frquentes :
Impossibilit de se connecter au gestionnaire de bases de donnes;
impossibilit de slectionner une base de donnes;
erreur dans lexcution dune requte;
absence de rsultat envoy par une requte.
Pour avoir des renseignements sur ces erreurs : on utilise les fonctions
mysql_error () : affiche une explication de lerreur qui est survenue sous forme de texte,
et mysql_errno () : renvoie le numro de lerreur.
Gestion derreurs
PHP propose deux moyens de prendre les erreurs en charge : @ et or die.
La prsence du caractre @ devant un nom de fonction empche cette fonction dafficher
un message derreur.
La fonction die () est un synonyme de la fonction
exit (). Toutes deux affichent la
valeur de lexpression (constante, variable, chane de caractres ) qui se trouve entre
parenthses et mettent fin lexcution du programme. Exemple :
$db = mysql_connect (DB_HOST, DB_USER, DB_PASSWORD) or die (mysql_error ());
Gestion derreurs
En rgle gnrale :
On emploie die () pour toute fonction dont le rsultat correct est vital pour la poursuite de
lexcution du script (connexion MySQL et slection de la base de donnes, par exp.).
On emploie @ pour les fonctions dont le rsultat nest pas certain mais qui, en cas
derreur, ne compromettent pas la suite du programme (inclusion dun fichier HTML ou
excution dune requte, par exp.).
100
Gestion derreurs
Nouvelle version de mysql_connect.php avec gestion derreurs:
<?php # Listing - mysql_connect-1.php
// Ce fichier contient les informations d'accs la base de donnes.
// Il tablit aussi une connexion avec MySQL et slectionne une base de donnes
// Dfinition des paramtres d'accs sous forme de constantes
DEFINE ('DB_USER', 'root'); // l'utilisateur root
DEFINE ('DB_PASSWORD', ''); // sans mot de passe
DEFINE ('DB_HOST', 'localhost');
DEFINE ('DB_NAME', 'ma_base');
Gestion derreurs
// Ouvrir la connexion et slectionner la base de donnes
$dbc = @mysql_connect (DB_HOST, DB_USER, DB_PASSWORD)
OR die ('Connexion MySQL impossible : '.mysql_error().'<br>');
mysql_select_db (DB_NAME)
OR die ('Slection de la base de donnes impossible : '.mysql_error().'<br>');
?>
Remarques :
Le caractre @ peut prfixer nimporte quelle fonction pour lempcher dafficher des
erreurs et pas seulement les fonctions MySQL. Exp. :
@include ('monfichier.php');
De la mme faon, la clause or die nest pas une exclusivit MySQL et peut tre utilise
sans faire intervenir mysql_error ().
101
102
{ $u = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom d\'utilisateur</p>';
}
else
{ $u = $_POST['nom_utilisateur'];
}
// Vrifier l'existence et l'exactitude du mot de passe
if (empty($_POST['mot_de_passe1']))
{ $mp = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre mot de passe</p>';
}
else
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $mp = $_POST['mot_de_passe1'];
}
else
{ $mp = FALSE;
$message .= '<p>Votre mot de passe est diffrent de celui que vous avez
prcdemment dclar</p>';
}
}
if ($p && $n && $e && $u && $mp)
{ // Si tout est correct, enregistrer l'utilisateur dans la base de donnes
require_once ('modeles/mysql_connect-1.php'); // connexion
// la base de donnes
// crer la requte
$rq = "INSERT INTO utilisateurs (nom_utilisateur, prenom, nom,
email, mot_de_passe, date_enreg)
VALUES ('$u', '$p', '$n', '$e', PASSWORD('$mp'), NOW())";
// lancer la requte
$result = mysql_query($rq);
if ($result) // Si l'enregistrement est correct
{ // Envoyer ventuellement un e-mail
echo "<p><b>Merci de vous tre enregistr sur notre site.
</b></p>";
include ('modeles/pied_page.inc'); // inclure le pied de page
exit();
// terminer le script
}
else
{ echo "<p>Vous n'avez pas pu tre enregistr cause d'une erreur systme".
"<p></p>" . mysql_error() . "<p></p>";
}
mysql_close();
// refermer la connexion avec la base de donnes
}
else
{ // Quelque chose n'est pas correct
$message .= '<p>Veuillez avoir l\'obligeance de recommencer</p>';
}
}
103
104
La fonction mysql_query () renvoie TRUE lorsque la requte a pu tre excute, mais cela
nimplique pas que les rsultats de cette requte soient conforme ce que nous esprions
(effectuer une vrification plus pousse).
On nest pas oblig de crer une variable temporaire, $rq. On peut crire la requte
directement dans lappel mysql_query (). Mais, pour les requtes complexes, cela
facilite le travail dcriture et de mise au point.
Mot cl
Exemple
MYSQL_ASSOC $enreg['champ']
MYSQL_NUM $enreg[3]
MYSQL_BOTH $enreg['champ'] ou
$enreg[3]
Mots cls dterminant le type de tableau renvoy par mysql_fetch_array ()
Rcupration des rsultats dune requte
Exemple de traitement des rsultats : on va crer un script visualiser.php, qui permet
dafficher les utilisateurs couramment inscrits.
<?php # Listing - visualiser.php
105
Comme pour nimporte quel tableau, lorsquon rcupre des enregistrements dune base
de donnes, on doit se rfrer aux colonnes exactement comme elles sont dfinies dans
106
le tableau si on utilise le mode associatif. Autrement dit, il faut se rappeler que les cls
sont sensibles la casse.
La scurit
La scurit
La scurit dune base de donnes manipule avec PHP concerne 2 larges domaines :
la protection des informations contre des accs indsirables ;
la prudence lors des insertions de donnes dans la base.
re
On peut satisfaire la 1
condition en Plaant le script de connexion en dehors du
rpertoire Web.
Pour la 2me condition :
Lorsquon effectue des requtes sur des bases de donnes, des apostrophes ou des
guillemets, par exp., pourraient crer des erreurs dans nos commandes SQL.
La scurit
On peut appeler la fonction mysql_real_escape_string () :
mysql_real_escape_string ($val);
La scurit
Magic Quotes et mysql_real_escape_string () :
Lorsque loption Magic Quotes est active, certains caractres particuliers saisis dans
un formulaire seront automatiquement chapps.
On commence par tester le statut de Magic Quotes au moyen dun appel la fonction
ini_get () qui va renvoyer ltat de loption dont le nom figure en argument, option qui
figure dans le fichier php.ini.
TRUE signifie que loption est active. Dans ce cas, on commencerai par dbarrasser la
chane de caractres de ses antislashes dchappement avant dappeler
mysql_real_escape_string ()
Utiliser mysql_real_escape_string ()
Nouvelle version du script denregistrement avec la fonction mysql_real_escape_string ()
:
<?php # Listing - enregistrer-1.php
// Dfinir le titre de la page et inclure l'en-tte de page
$titre_page = "Enregistrement";
include ('modeles/entete.inc');
if (isset($_POST['submit']))
{ // Traiter le formulaire
// se connecter la base
require_once ('modeles/mysql_connect-1.php');
// Crer une fonction pour chapper les donnes.
function echappement ($data)
107
108
{ $mp = echappement($_POST['mot_de_passe1']);
}
else
{ $mp = FALSE;
$message .= '<p>Votre mot de passe est diffrent de celui que vous avez
prcdemment dclar</p>';
}
}
if ($p && $n && $e && $u && $mp)
{ // Si tout est correct, enregistrer l'utilisateur dans la base
// crer la requte
$rq = "INSERT INTO utilisateurs(nom_utilisateur, prenom, nom, email,
mot_de_passe, date_enreg)
VALUES ('$u', '$p', '$n', '$e', PASSWORD('$mp'), NOW())";
// lancer la requte
$result = mysql_query($rq);
if ($result) // Si l'enregistrement est correct
{ // Envoyer ventuellement un e-mail
echo "<p><b>Merci de vous tre enregistr sur notre site.</b></p>";
include ('modeles/pied_page.inc'); // inclure le pied de page
exit();
// terminer le script
}
else
{ echo "<p>Vous n'avez pas pu tre enregistr cause d'une erreur systme".
"<p></p>" . mysql_error() . "<p></p>";
}
mysql_close();
109
Utilisation de mysql_num_rows()
Utilisation de mysql_num_rows()
La fonction mysql_num_rows () renvoie le nombre de lignes rcupres par une requte SELECT
partir de son rsultat.
Exemples dutilisation :
Modifier visualiser.php pour afficher le nombre dutilisateurs enregistrs.
Modifier enregistrer-1.php pour voir si un nom dutilisateur existe dj.
110
Utilisation de mysql_num_rows()
Nouvelle version du script visualiser.php :
Afficher le nombre dutilisateurs enregistrs
<?php # Listing - visualiser-1.php
// Ce script rcupre et affiche tous les enregistrements
// de la table utilisateurs
$titre_page = 'Utilisateurs couramment enregistrs';
include ('modeles/entete.inc');
// Connexion la base de donnes
require_once ('modeles/mysql_connect-1.php');
// Crer la requte.
$rq = "SELECT CONCAT(nom, ', ', prenom) AS nom_complet, ".
"DATE_FORMAT(date_enreg, '%d/%m/%Y') AS d_enr FROM utilisateurs ".
"ORDER BY date_enreg ASC";
// lancer la requte
$result = @mysql_query ($rq) or die (mysql_error());
$nb = mysql_num_rows($result); // Combien y a-t-il d'utilisateurs ?
if ($nb > 0)
{ // S'il y en a, afficher les enregistrements
echo '<table align="center" cellspacing="2" cellpadding="2" '.
'width="400">';
echo "<caption><big><b>Il y a actuellement $nb utilisateurs ".
"enregistrs</b></big></caption>
<tr><td align='center'><b>Nom</b></td>
<td align='center'><b>Date<br>d'enregistrement</b></td></tr>";
// Rcuprer et afficher tous les enregistrements
while ($ligne = mysql_fetch_array($result, MYSQL_NUM))
{ echo "<tr><td>".stripslashes($ligne[0])."</td>
<td align='center'>$ligne[1]</td></tr>\n";
}
echo '</table>';
mysql_free_result ($result); // Librer les ressources
}
else
{ // Il n'y a personne
echo "<p>Aucun utilisateur n'est actuellement enregistr.</p>";
}
mysql_close(); // Refermer la connexion avec la base de donnes
include ('modeles/pied_page.inc'); // Inclure le pied de page
?>
Utilisation de mysql_num_rows()
Nouvelle version du script enregistrer.php :
Vrification de lexistence dun nom dutilisateur identique
<?php # Listing - enregistrer-2.php
// Dfinir le titre de la page et inclure l'en-tte de page
$titre_page = "Enregistrement";
111
include ('modeles/entete.inc');
if (isset($_POST['submit']))
{ // Traiter le formulaire
// Crer une fonction pour chapper les donnes.
function echappement ($data)
{ global $bd;
// connexion ncessaire
if (ini_get('magic_quotes_gpc'))
{ $data = stripslashes($data);
}
return mysql_escape_string($data);
} // fin de la fonction
require_once ('modeles/mysql_connect-1.php'); // connexion la base de donnes
$message = NULL;
// crer une variable vide
// Vrifier la prsence d'un prnom
if (empty($_POST['prenom']))
{ $p = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre prnom</p>';
}
else
{ $p = echappement($_POST['prenom']);
}
// Vrifier la prsence d'un nom
if (empty($_POST['nom']))
{ $n = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom</p>';
}
else
{ $n = echappement($_POST['nom']);
}
// Vrifier l'existence d'une adresse e-mail
if (empty($_POST['email']))
{ $e = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre adresse e-mail</p>';
}
else
{ $e = echappement($_POST['email']);
}
// Vrifier la prsence d'un nom d'utilisateur
if (empty($_POST['nom_utilisateur']))
{ $u = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom d\'utilisateur</p>';
}
else
{ $u = echappement($_POST['nom_utilisateur']);
}
// Vrifier l'existence et l'exactitude du mot de passe
if (empty($_POST['mot_de_passe1']))
{ $mp = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre mot de passe</p>';
}
else
112
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $mp = echappement($_POST['mot_de_passe1']);
}
else
{ $mp = FALSE;
$message .= '<p>Votre mot de passe est diffrent de celui que vous avez prcdemment
dclar</p>';
}
}
if ($p && $n && $e && $u && $mp)
// Si tout est correct
{ // Voir si l'utilisateur existe dj
$rq = "SELECT id_utilisateur FROM utilisateurs WHERE nom_utilisateur='$u'";
$result = mysql_query ($rq);
// excuter la requte
if (mysql_num_rows($result) == 0) // pas encore enregistr
{ // crer une nouvelle requte
$rq = "INSERT INTO utilisateurs (nom_utilisateur, prenom, nom, email, mot_de_passe,
date_enreg) VALUES ('$u', '$p', '$n', '$e',
PASSWORD('$mp'), NOW())";
// lancer la requte d'enregistrement
$result = mysql_query($rq);
if ($result)
// Si l'enregistrement est correct
{ // Envoyer ventuellement un e-mail
echo "<p><b>Merci de vous tre enregistr sur notre site.</b></p>";
include ('modeles/pied_page.inc'); // inclure le pied de page
exit();
// terminer le script
}
else
{ echo "<p>Vous n'avez pas pu tre enregistr cause d'une erreur systme".
"<p></p>" . mysql_error() . "<p></p>";
}
}
else
{ $message .= "<p>Nom d'utilisateur dj utilis</p>";
}
mysql_close();
// refermer la connexion avec la base de donnes
}
else
{ // Quelque chose n'est pas correct
$message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
}
}
// Afficher ventuellement un ou plusieurs messages d'erreur
if (isset($message))
{ echo "<font color='red'>$message</font>";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>
<p><b>Prnom :</b>
<input type="text" name="prenom" size="15" maxlength="15"
value="<?php if (isset($_POST['prenom'])) echo $_POST['prenom']; ?>"/>
</p>
113
<p><b>Nom :</b>
<input type="text" name="nom" size="30" maxlength="30"
value="<?php if (isset($_POST['nom'])) echo $_POST['nom']; ?>"/>
</p>
<p><b>Adresse e-mail :</b>
<input type="text" name="email" size="40" maxlength="40"
value="<?php if (isset($_POST['email'])) echo $_POST['email']; ?>"/>
</p>
<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_utilisateur" size="10" maxlength="20"
value="<?php if (isset($_POST['nom_utilisateur']))
echo $_POST['nom_utilisateur']; ?>"/>
</p>
<p><b>Mot de passe :</b>
<input type="password" name="mot_de_passe1" size="20" maxlength="20" />
</p>
<p><b>Confirmez votre mot de passe :</b>
<input type="password" name="mot_de_passe2" size="20" maxlength="20" />
</p>
</fieldset>
<div align="center">
<input type="submit" name="submit" value="Envoyer les informations" />
</div>
</form><!-- Fin du formulaire -->
<?php
include ('modeles/pied_page.inc'); // Inclure le pied de page
?>
114
115
116
117
Annexe
Les balises (X)HTML - Les proprits CSS
Balises (X)HTML
<html></html>
BALISES FONDAMENTALES
Dlimite le document HTML.
<head></head>
<frameset></frameset>
<body></body>
< !---->
Commentaire.
href=""
BALISES DEN-TTE
Dfinit une valeur de rfrence globale pour le document. Utilis avec un et un seul
des attributs ci-dessous.
URL de rfrence, qui servira de base au traitement des URL relatives.
target=""
<meta></meta>
name=""
content=""
<meta></meta>
http-equiv=""
<base />
content=""
<link />
Lie le document une ressource externe (par exemple une feuille de style).
Utilis dans <head>.
href=""
Adresse de la ressource.
rel=""
type=""
<style></style>
<script></script>
<title></title>
<frameset></frameset>
118
rows=""
cols=""
<frame />
src=""
id=""
Saut de ligne.
<hr />
Ligne horizontale.
id=""
name=" "
<span></span>
<div></div>
class=""
Permet dappliquer un style dfini dans une feuille de style CSS (interne ou externe).
Utilisable dans <span>, <div>,<body> et dans la plupart des autres balises HTML.
Fortement recommand en XHTML.
Contient les dfinitions de style intgrs avec la syntaxe CSS. Utilisable dans
<span>, <div>,<body> et dans la plupart des autres balises HTML. Tolr par la
recommandation XHTML-Strict.
style=""
<table></table>
<th></th>
<tr></tr>
<td></td>
border="."
<form></form>
method=""
Type de mthode utilise pour lenvoi du formulaire. Valeurs autorises : get, post.
Valeur par dfaut : get.
action=""
119
<button></button>
<input></input>
type=""
Type de lentre standard. Valeurs autorises : text, hidden, checkbox, radio, submit,
reset.
checked="checked"
Indique quun lment de type radio (bouton radio) est coch par dfaut.
<select></select>
Liste droulante.
<option></option>
selected="selected"
<textarea></textarea>
Zone de texte.
<img />
src=""
alt=""
<a></a>
href=""
title=""
<applet></applet>
code=""
<object></object>
param=""
start=""
type=""
<li></li>
value=""
<dl></dl>
Valeur numrique de cet lment de liste ( affecte cet lment et tous les lments
suivants dans les listes <ol>).
Liste de dfinitions
<dt></dt>
<dd></dd>
<b></b>
120
<i></i>
Italique.
<u></u>
Soulign.
<strike></strike>
<small></small>
Petit texte.
<big></big>
Gros texte.
<sup></sup>
Exposant.
<sub></sub>
Indice.
<tt></tt>
<pre><pre>
Petite police tltype chasse fixe. Conserve les espaces et les sauts de ligne.
Taille de la police, de 1 7. La taille par dfaut est 3. Peut galement tre spcifie
comme valeur relative la taille actuelle, par exemple,+2 ou-1.
Change la couleur du texte.
face=""
height=""
width=""
121
1. Styles de police
font-family
Nom de police (une police prcise : Arial, Times, Helvetica...) ou une famille de police (serif,
sans-serif, cursive, fantasy, monospace)
h3 {font-family: Arial}
font-style
paisseur de la police : normal, bold, bolder ou lighter ou valeur numrique (100 | 200 | 300 | 400
| 500 | 600 | 700 | 800 | 900)
p {font-weight: bold}
font-size
Taille de la police : xx-small, x-small, small, mdium, large, x-large, xx-large, larger ou smaller ou
taille prcise en points (pt), inches (in), centimtres (cm), pixels (px) ou pourcentage de la
police parente(%).
p {font-size: 12pt}
font-variant
2. Styles de texte
text-align
Retrait dans la premire ligne d'un bloc de texte. Spcifi en inches (in), centimtres (cm),
pixels (px) ou pourcentage (%).
p {text-indent: 1cm}
text-decoration
122
Mise en forme particulire du texte (barr, clignotant, etc.) : blink, underline, line-through,
overline ou none.
a:visited {text-decoration: blink}
text-transform
Espacement des mots : valeur en points (pt), inches (in), centimtres (cm), pixels (px) ou
pourcentage (%).
p {word-spacing: 5pt}
letter-spacing
Espacement des lettres : valeur en points (pt), inches (in), centimtres (cm), pixels (px), ou
pourcentage (%).
p {letter-spacing: 2pt}
line-height
Interligne (i.e. espace entre les lignes du texte) : en points (pt), inches (in), centimtres (cm),
pixels (px) ou pourcentage (%).
p {line-height: 10pt}
width
Largeur d'un lment de bloc : en points (pt), inches (in), centimtres (cm), pixels (px), ou
pourcentage (%).
h1 {width: 200px}
height
Hauteur d'un lment de bloc : en points (pt), inches (in), centimtres (cm), pixels (px), ou
pourcentage (%).
h1 {height: 100px}
white-space
3. Arrire-plans
background-color
Couleur de l'arrire-plan : nom de couleur HTML 4.0, code RGB hexadcimal ou transparent.
body {background-color: #000000}
background-image
Spcifie si l'image d'arrire-plan reste fixe avec les dplacements de l'cran : scroll ou fixed.
body {background-image: image.gif; background-attachement: fixed}
background-position
Position de l'image d'arrire-plan par rapport au coin suprieur gauche de la fentre ; spcifie
par un couple de valeurs spares par une espace : {top ou center ou bottom ET left ou center
ou right}, ou en points (pt), inches (in), centimtres (cm), pixels (px) ou pourcentage (%).
body {background-image: img.gif; background-position: right top}
background
4. Marges
margin-top
Taille de la marge suprieure : auto ou en points (pt), inches (in), centimtres (cm), pixels (px)
ou pourcentage (%).
td {margin-top: 5px }
margin-right
Taille de la marge droite : auto ou en points (pt), inches (in), centimtres (cm), pixels (px) ou
pourcentage (%).
p {margin-right: 5px }
margin-bottom
Taille de la marge infrieure : auto ou en points (pt), inches (in), centimtres (cm), pixels (px)
ou pourcentage (%).
h1 {margin-bottom: 5px }
margin-left
Taille de la marge gauche : auto ou en points (pt), inches (in), centimtres (cm), pixels (px) ou
pourcentage (%).
h3 {margin-left: 5px }
margin-left
Taille de la marge pour les quatre cts la fois : auto ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h5 {margin: 5px }
124
5. Bordures et "enrobages"
border-top-width
paisseur de la bordure suprieure : thin ou medium ou thick ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {border-top-width: thin}
border-right-width
paisseur de la bordure droite : thin ou medium ou thick ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {border-right-width: medium}
border-bottom-width
paisseur de la bordure infrieure : thin ou medium ou thick ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {border-bottom-width: thick}
border-left-width
paisseur de la bordure gauche : thin ou medium ou thick ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {border-left-width: 0.5cm}
border-width
paisseur de la bordure des quatre cts la fois : thin ou medium ou thick ou en points (pt),
inches (in), centimtres (cm), pixels (px) ou pourcentage (%).
h4 {border- width: 5px}
border-color
Style du trait de la bordure : none, solid, dotted, dashed, double, groove, ridge, inset ou outset.
table {border-style: solid dashed}
border
Remplissage entre le haut du contenu de l'lment et le bord : en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {padding-top: 3px}
padding-right
Remplissage entre la droite du contenu de l'lment et le bord : en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {padding-right: 3px}
padding-bottom
125
Remplissage entre le bas du contenu de l'lment et le bord : en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {padding-bottom: 3px}
padding-left
Remplissage entre la gauche du contenu de l'lment et le bord : en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {padding-left: 3px}
padding
Remplissage entre le contenu de l'lment et le bord des quatre cts la fois : en points (pt),
inches (in), centimtres (cm), pixels (px) ou pourcentage (%).
h5 {padding: 3px}
6. Listes
list-style-type
126
Bibliographie
PHP 5 - MySQL 5 AJAX : 1re dition, 12/2007 Editions ENI, ISBN13 : 978-2-74604057-1
Pratique de MySQL et PHP : 3me dition, Janvier 2005 Editions O'Reilly, ISBN13 :
9782841773381
Premires applications Web 2.0 avec Ajax et PHP : Janvier 2008 Editions Eyrolles,
ISBN13 : 9782212120905
PHP 5 Avanc : 3eme dition, 2 octobre 2006 Editions Eyrolles, ISBN10 : 2212120044
127