PHP-MySQL : lire et afficher des données

Rappels et situation

Nous avons vu un moyen de créer une base de données [DB] MySQL avec phpMyAdmin, DB que nous avons nommée "Infobrol" sur le serveur mysql5test.
Nous avons vu ensuite comment créer une table avec phpMyAdmin, table que nous avons nommée "dictionnaire".
Enfin, nous avons vu comment ajouter des données dans notre table.

Voici pour rappel la structure de notre table :


Infobrol
Afficher: (1 Enregistrements) dictionnaire

Base de données Infobrol - Table dictionnaire sur le serveur mysql5test

 Structure Afficher SQL Sélectionner Insérer Exporter Opérations Vider Supprimer 
 Champ TypeAttributsNullDéfautExtraAction
  varchar(64) Non  ModifierSupprimerPrimaireIndexUniqueTexte entier
  char(1) Non  ModifierSupprimerPrimaireIndexUniqueTexte entier
  text Non  ModifierSupprimerPrimaireIndexUniqueTexte entier
  varchar(32) Non  ModifierSupprimerPrimaireIndexUniqueTexte entier
Pour la sélection : Pour la sélection :   Modifier Supprimer
  • La base de données se nomme Infobrol.
  • La table qui contient les données que nous allons afficher se nomme dictionnaire.
  • Cette table contient les champs suivants :
    • nom : contient le mot défini.
    • lettre : contient la première lettre du mot défini.
      Ce champ sert principalement à accélérer les recherches pour le glossaire3.
    • def : contient la définition du mot.
    • cat :contient la catégorie à laquelle appartient le mot.

Ces parties conçernent la partie "administration" de la gestion des données, par un outil intégré ou extérieur à notre site. Nous allons voir maintenant comment utiliser les informations de la base de données dans nos pages Web.

Table des matières Haut

Structure des tables

Comme nous allons devoir manipuler des données, nous devons prendre un moment pour comprendre comment elles sont structurées dans la DB. Nous pouvons nous représenter notre structure de données comme des tableaux (les tables de la DB), qui comportent des lignes (les “records” (en français, « enregistrements »), ou encore “row”5) et des colonnes (les « champs »6)

Un enregistrement est donc une ligne de notre tableau, composée de toutes les données qui constituent une entité.

Les colonnes (les « champs »6) groupent toutes les données de même type et dont la signification est identique.

Table des matières Haut

Notre première requête

Comment aller chercher dans la DB les données que nous avons sauvé dans notre table dictionnaire ?

Comme nous l'avons vu dans les pages précédentes, PHP n'est pas un langage d'interrogation de données. Nous allons donc utiliser SQL [“Structured Query Language”7].

  1. SELECT * FROM `dictionnaire`;

Majuscules et minuscules

Nous pouvons utiliser des majuscules ou des minuscules pour les commandes SQL, cela n'a pas d'importance9. J'ai pris l'habitude de noter les mots réservés de SQL en majuscule et les noms des tables et des champs en minuscule.

Cette requête charge tous les champs (utilisation de l'étoile après le mot SELECT) de toutes les lignes de la table dictionnaire.

Nous avons ici entouré le nom de la table par des accents aigus diacritiques10 comme le résultat de la requête généré par phpMyAdmin, mais ce n'est absolument pas nécessaire, et nous ne les emploierons plus par la suite.

SQL: ne charger que certaines colonnes

Si nous ne désirons pas charger toutes les colonnes (les champs), nous pouvons remplacer l'étoile par les champs à charger.

  1. SELECT mot, def FROM dictionnaire;

Dans le langage des opérateurs relationnels, nous parlons de projection.

SQL: ne charger que certaines lignes

Si nous ne désirons pas charger toutes les lignes, nous pouvons procéder de deux manières :

  • spécifier le nombre de lignes11 avec la clause LIMIT.
  • spécifier certaines restrictions avec la clause WHERE.

Nous allons donc adapter notre requête pour ne charger que les champs mot et def, et limiter les résultats à la lettre "a".

  1. SELECT * FROM dictionnaire WHERE lettre='a';

Dans le langage des opérateurs relationnels, nous parlons de sélection.

Table des matières Haut

Exécuter la requête

Nous pouvons à présent demander à PHP d'envoyer notre commande SQL vers la DB MySQL grâce à la fonction PHP mysqli::query.

Ensuite, nous avons le choix entre deux manières pour récupérer les données pour chaque ligne :

  • Sous la forme d'un tableau dont les indices12 sont les noms des champs.
  • Sous la forme d'un objet, pour lequel chaque champ correspond à un attribut publique.

Enregistrement dans un tableau avec mysql_fetch_array

  1. <html>
  2.   <head>
  3.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  4.     <title>Dictionnaire: lettre a</title>
  5.   </head>
  6.   <body>
  7.   <h1>Mots qui débutent par la lettre "a"</h1>
  8.   <?php  
  9.     // Informations de connexion
  10.     include_once('scripts/variables.php');
  11.     // Tentative de connexion et de selection de la base de donnees
  12.     $mysqli = new mysqli(DB_SERVER, DB_LOGIN, DB_PASSWORD);
  13.     // Gestion des erreurs de connexion
  14.     if ($mysqli->connect_errno) {
  15.         echo 'Echec lors de la connexion à MySQL : ('
  16.             . $mysqli->connect_errno . ') '
  17.             . $mysqli->connect_error;
  18.     }else{
  19.         // creation de la requete
  20.         $query='SELECT nom, def FROM dictionnaire WHERE lettre=\'a\';';
  21.         // execution de la requete
  22.         if ($result = $mysqli->query($query) ){
  23.             // lecture des enregistrements
  24.             while ($fields = $result->fetch_assoc()){
  25.                 // Les donnees d'un enregistrement sont dans le tableau $fields
  26.                 echo '<dl><dt>'.$fields['nom'].'</dt><dd>'.$fields['def'].'</dl>';
  27.             }
  28.             // liberer le resultat
  29.             $result->close();
  30.         }else{
  31.             // gestion de l'erreur
  32.             echo 'Echec lors de la requête MySQL : ' . $mysqli->error;
  33.         }
  34.         // liberer la connexion
  35.         $mysqli->close();
  36.     }
  37.   ?>
  38.   </body>
  39. </html>

Vous pouvez cliquer ici pour afficher les exemples de codes PHP avant msqli.

Vous pouvez cliquer ici pour afficher les exemples de codes PHP sans les balises d'une page HTML (seulement les différences).

Table des matières Haut

Enregistrement dans un objet avec mysql_fetch_object

  1. <html>
  2.   <head>
  3.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  4.     <title>Dictionnaire: lettre a</title>
  5.   </head>
  6.   <body>
  7.   <h1>Mots qui débutent par la lettre "a"</h1>
  8.   <?php  
  9.     // Informations de connexion
  10.     include_once('scripts/variables.php');
  11.     // Tentative de connexion et de selection de la base de donnees
  12.     $mysqli = new mysqli(DB_SERVER, DB_LOGIN, DB_PASSWORD);
  13.     // Gestion des erreurs de connexion
  14.     if ($mysqli->connect_errno) {
  15.         echo 'Echec lors de la connexion à MySQL : ('
  16.             . $mysqli->connect_errno . ') '
  17.             . $mysqli->connect_error;
  18.     }else{
  19.         // creation de la requete
  20.         $query='SELECT nom, def FROM dictionnaire WHERE lettre=\'a\';';
  21.         // execution de la requete
  22.         if ($result = $mysqli->query($query) ){
  23.             // lecture des enregistrements
  24.             while ($obj = $result->fetch_object()){
  25.                 // Les donnees d'un enregistrement sont dans l'objet $obj
  26.                 echo '<dl><dt>'.$obj->nom.'</dt><dd>'.$obj->def.'</dl>';
  27.             }
  28.             // liberer le resultat
  29.             $result->close();
  30.         }else{
  31.             // gestion de l'erreur
  32.             echo 'Echec lors de la requête MySQL : ' . $mysqli->error;
  33.         }
  34.         // liberer la connexion
  35.         $mysqli->close();
  36.     }
  37.   ?>
  38.   </body>
  39. </html>

Vous pouvez cliquer ici pour afficher les exemples de codes PHP sans les balises d'une page HTML (seulement les différences).

Table des matières Haut

Exemple

  1. <?php
  2.  
  3. // Affichage du formulaire
  4. echo '<form name="dicoSearch" method="post">';
  5. echo '<fieldset>';
  6. echo '<legend>Critères de recherche</legend>';
  7. echo '<input type="text" name="dicoLetter" />';
  8. echo '<input type="submit" name="Submit" value="Envoyer" />';
  9. echo '<br /><label for="dicoLetter">Veuillez entrer une lettre et cliquer sur le bouton Envoyer</label>';
  10. echo '</fieldset>';
  11. echo '</form>';
  12. echo '<br /><br />';
  13.  
  14. // Si une valeur a été postée
  15. if(isset($_POST['dicoLetter'])){
  16.  
  17. $dicoLetter=$_POST['dicoLetter'];
  18.  
  19. // On n'accepte qu'une seule lettre, entre a et Z
  20. if(preg_match('#^[a-z]{1}$#i', $dicoLetter)!==1){
  21. echo '<b>'.$dicoLetter.'</b> n\'est pas un argument valide...';
  22. }else{
  23.  
  24. // Fichier qui contient les données nécessaires
  25. include('scripts/variables.php');
  26.  
  27. // Fichier dans lequel on se connecte sur la DB
  28. include ('scripts/dbconnect.php');
  29.  
  30. // Requête à exécuter
  31. $query = 'SELECT mot, def FROM dictionnaire WHERE lettre = \''.$dicoLetter.'\';';
  32. // Résultat de la requête
  33. if ($result = doMysqliQuery($query) ){
  34.  
  35. // Nombre de lignes trouvées
  36. $cnt=$result->num_rows;
  37.  
  38. // Si nous avons des résultats
  39. if($cnt>0){
  40.  
  41. // Début de l'affichage des résultats
  42. echo '<div align="center">';
  43. echo '<table width="90%" border="0" cellpadding="2" cellspacing="1" class="table">';
  44. echo '<thead><tr><th>N&deg;</th><th>Mot défini</th><th>Définition</th></tr></thead>';
  45. echo '<tbody>';
  46.  
  47. // Déclaration d'un compteur
  48. $k=0;
  49.  
  50. // Affichage des lignes
  51. while($obj = $result->fetch_object()){
  52.  
  53. // Une ligne sur 2 est d'un style différent
  54. echo '<tr class="'.(($k%2==0)?'td':'td2').'">';
  55.  
  56. echo '<td>'.++$k.'</td><td>'.$obj->mot.'</td><td>'.$obj->def.'</td>';
  57. echo '</tr>';
  58. }
  59. }
  60. // Fichier dans lequel on ferme la connexion
  61. include ('scripts/dbclose.php');
  62.  
  63. // Fin du tableau
  64. echo '</tbody>';
  65. echo '</table>';
  66.  
  67. }else{
  68.  
  69. // Message si une valeur a été postée mais que la requête n'a produit aucun résultat
  70. echo 'Aucun enregistrement ne correspond à <b>'.$dicoLetter.'</b>';
  71. }
  72. }
  73. }
  74. ?>

Table des matières Haut

Trier les résultats

Nous pouvons trier les éléments de la base de données grâce à l'instruction ORDER BY, suivie du nom du champ sur lequel porte le tri.
Cette instruction peut être suivie des options ASC ou DESC qui permettent un tri ascendant ou descendant.

La page de résultats est similaire à la précédente (nous ne présentons que les enregistrements dont le champ "lettre" est égal à la lettre demandée), mais nous permet de sélectionner le type de tri effectué sur le champ "mot", et nous présente la requête à la manière de PhpMyAdmin.

Table des matières Haut

Sécurité

Injection de code SQL

Ces exemples sont simples afin de les comprendre plus facilement. Mais il faut toujours sécuriser les données que l'utilisateur nous fournit.

En effet, si nous utilisons les données du formulaire sans les vérifier, une personne malveillante peut injecter du code avec les données, et par exemple vider complétement la base de données, ou récupérer des données confidentielles, etc.

Table des matières Haut

Document créé le 21/11/2003, dernière modification le 27/10/2018
Source du document imprimé : https://www.gaudry.be/php-mysql-select.html

L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.

Notes

  1. a,b,c,d,e,f… 1 en plus… DataBase : correspond à « base de données » en français

  2. a,b,c,d,e,f… 1 en plus… DB : “DataBase” (en français, « base de données »)

  3.  Champ "lettre" : Ceci va à l'encontre de la normalisation de la base de données, mais nous évite d'utiliser une requête qui comporte "LIKE", et "UCASE". Ce choix est tout à fait discutable, mais nous ne devons pas nous tracasser de ces notions pour l'instant.

  4.  records : correspond à « enregistrements » en français

  5.  row : correspond à « ligne » en français

  6. a,b champs : correspond à “fields” en anglais

  7. a,b Structured Query Language : correspond à « langage structuré d'interrogation » en français

  8.  SQL : “Structured Query Language” (en français, « langage structuré d'interrogation »)

  9.  Majuscules et minuscules : Si le serveur MySQL est sur une machine Unix ou Linux, nous devons faire attention à bien respecter les majuscules et minuscules pour les noms des tables et pour les noms des champs. Nous pouvons être plus négligents sous Windows qui ne fait pas la différence.

  10.  Accents : Nous pouvons utiliser comme délimiteurs de chaînes de caractères différents guillemets et accents. Exemples :
    guillemets « »
    accent aigu ´
    accent grave `
    minutes ′
    guillemet simple à gauche ‘
    guillemet simple à droite ’
    guillemet bas simple ‚
    guillemets doubles à gauche “
    guillemets doubles à droite ”
    doubles guillemets bas à droite „

  11.  LIMIT(0, 30) : La commande LIMIT n'est pas une commande standard en SQL, et ne fonctionne donc pas avec tous les systèmes de gestion de bases de données. MySQL reconnaît cependant cette commande LIMIT, ce qui est pratique pour faire de la pagination avec une DB.

  12.  Indice d'un tableau : L'indice est l'adresse d'une cellule (une case) d'un tableau.

Table des matières Haut