TUTORIELS 
Rechercher dans une base de données en PHP
Comprendre les notions d'héritage de style et le "en cascade" de "feuilles de style en cascade".  (16 mars 2001)
 

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 ("&nbsp\;");
      }
      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.

 
[ Jérôme MorlonJDNet
 
Accueil | Haut de page