PHP, grâce à un très grand nombre de fonctions
natives, permet la connexion à de multiples systèmes
de gestion de bases de données. Dans cet article, nous prendrons
l'exemple de mSQL (MiniSQL), mais, avec quelques adaptations, il
pourrait tout aussi bien s'appliquer à MySQL ou tout autre
système basé sur le langage SQL.
Nous supposons que tous les outils nécessaires (un serveur
web, PHP, mSQL), sont correctement installés.
Créer la base
Prenons l'exemple d'une CD-thèque. Notre base comportera
deux tables:
- disque: identifiant, titre, artiste, prêté/disponible,
date de prêt, emprunteur (identifiant);
- emprunteur: identifiant, nom, adresse, nombre de disques empruntés,
disques empruntés (identifiants des disques)
Nous écrirons donc:
% msqladmin create documents
% msql documents < cdtheque.sql
où "cdtheque.sql" contiendra:
create table disque (
id char(10) NOT NULL, # identifiant unique
titre char(200) NOT NULL,
artiste char(200) NOT NULL,
dispo int, # 0 si prêté, 1 si disponible
emprunt int, # date d'emprunt (sous forme d'entier
pour faciliter les comparaisons)
emprunteur char(10), # identifiant de l'emprunteur
)\p\g
create unique index disque_idx on article
(id)\p\g
create table emprunteur (
id char(10) NOT NULL,
nom char(30) NOT NULL,
adresse char(200) NOT NULL,
nbdisques int,
diques char(100), # liste d'un ou plusieurs identifiants
séparés par des virgules
)\p\g
create unique index emprunteur_idx on article
(id)\p\g
Il nous faut, bien entendu, remplir ensuite cette base.
Créer l'interface PHP
Limitons-nous à un cas très simple: notre formulaire
HTML contient un seul champ texte, et fait appel à un programme
PHP qui fait l'interface avec la base mSQL. Notre unique champ texte
est supposé recevoir une requête de type select.
Bien sûr, notre interface est trop sommaire: nous devrons,
dans un deuxième temps, créer un formulaire plus "intuitif"
et reconstituer notre requête SQL à partir des données
du formulaire; mais laissons de côté cette étape
pour nous concentrer sur l'essentiel. Notre programme PHP ressemblera
au suivant en supposant que notre champ texte ait pour nom "chaine":
<?
$requete = stripslashes ($chaine);
$link = msql_pconnect ( ) ;
$res = msql ("documents", "select ".$requete,
$link);
if ($res) {
$nblignes = msql_num_rows ($res);
$nbchamps = msql_num_fields ($res);
printf ("<B>%d résultats</B>\n",$nblignes);
} else {
echo ("<BR>Recherche infructueuse<BR>\n");
}
?>
<TABLE BORDER>
<?
if ($res ) {
echo ("\n<TR>" );
for ($i=0; $i < $nbchamps; $i++) {
$nom = msql_fieldname ($res,$i );
echo ( "<TD>$nom</TD>"
);
}
echo ("</TR>");
for ($i=0; $i<$nblignes; $i++) {
echo ("\n<TR>");
$lignes = msql_fetch_row ($res);
for ($j=0 ;$j<$nbchamps ;$j++) {
$val = $lignes[$j];
if ($val == "") {
$val = stripslashes
(" \;");
}
echo ("<TD>".chop
($val ). "</TD>");
}
echo ("</TR>") ;
}
}
?>
</TABLE>
On le voit en se penchant sur ce code, la connexion à
la base et la récupération des données sous
forme de variables PHP sont très simples.
Troisième étape
Penchons-nous maintenant sur la deuxième
étape de notre interface. Nous devons récupérer
les données d'un formulaire moins "brut" que le
précédent. Par exemple, imaginons que l'utilisateur
entre, dans le champ "titre", une liste de titres de disques
(séparés par des virgules) afin de savoir lesquels
sont empruntés et lesquels sont disponibles. Nous devons
écrire une fonction qui puisse "éclater"
cette liste en ses différents constituants:
function traiteliste($cond, $input, $sep=
",", $q1= "'", $q2= "'") {
$temp = explode ($sep,$input);
$output = $cond . $q1 . $temp[0] . $q2;
if (count ($temp) > 1) {
for ($i=1 ; $i<count ($temp) ; $i++)
{
if ($temp[$i] != "")
{
$output .= "
or " . $cond . $q1 . $temp[$i] . $q2;
}
}
}
return "( " . $output . " )";
}
Le premier argument spécifie la condition SQL pour les
éléments de la liste (par exemple "titre like"),
le second argument spécifie la liste d'éléments,
le troisième le séparateur (une virgule), tandis que
les deux derniers contiennent les caractères entre lesquels
figurera un élément de la liste dans la requête
SQL (ce qui donnera par exemple: "titre like '%Supercompil%'
or titre like '%Music%' etc." - ici $q1 contient
"'%" et $q2 contient "%'"). A noter que sont
spécifiées des valeurs par défaut pour les
trois derniers arguments, ce qui en fait des arguments facultatifs.
Notre fonction sera appelée comme suit (par exemple):
if ($titre ) {
$choix = traiteliste ( "titre like ", strtolower
($titre), ",", "'%", "%'" );
}
et nous construirons notre requête select de la manière
suivante:
$requete = "titre,artiste,dispo FROM
disque WHERE";
$requete .= $titre ? $choix : "";
$requete .= " ORDER BY artiste, titre";
Et voilà! La jonction est effectuée
avec notre programme précédent. Evidemment, de nombreuses
améliorations sont à apporter: notre programme PHP
doit permettre de traiter plusieurs champs de formulaires, à
la fois des listes et des valeurs uniques, qui toutes interviendront
dans la construction de notre requête select. La convivialité
de notre programme doit également être améliorée,
et il serait aussi judicieux de sauvegarder toutes les requêtes
dans un fichier. Bref, le travail ne manque pas.
Si vous souhaitez plus d'informations sur le langage SQL, consultez
la page suivante:
http://w3.one.net/~jhoffman/sqltut.htm.
|