PHP – Exploiter une base MySQL

PRINCIPES DE BASE

 

Dialogue typique :

  • La requête arrive du navigateur via HTTP
  • Apache passe la requête au moteur de script PHP
  • Le script interroge une base de données MySQL pour obtenir des données qui y sont stockées.
  • MySQL répond avec les données exigées.
  • Le moteur PHP incorpore les données dans le HTML de réponse
  • La page HTML construite est passée au serveur Apache
  • Le serveur Apache renvoie la page générée comme réponse à la requête HTTP

 

elements_dun_systeme_web_diagram1

 

Exemple

Un exemple pas très utile dans le contexte d'un site web grand public, mais qui illustre bien le dialogue décrite ci-dessus, et qui devrait fonctionner sur votre clé USB / disque dur car chaque installation de MySQL a déjà les données nécessaires en place (liste d'utilisateurs qui ont accès aux différentes bases dans le serveur de base de données).

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Exploiter une base de données MySQL en PHP</title>
    </head>
    <body>
        <h1>Données MySQL</h1>
        <?php
          /* il faut mettre le vrai mot de passe à la place de
             la chaîne [password] */
          $link = mysqli_connect("localhost", "root", "[password]",
                              "mysql") or die(mysqli_error($link));
          echo "Connexion réussie.<br><br>";
          $query = "SELECT host, user, password FROM user "
                   . "ORDER BY user, host"
                   or die (mysqli_error($link));
          $result = $link->query($query);
          echo '<table border="1" cellpadding="8">';
          echo '<tr><th>User</th><th>Host</th>'
               . '<th>Password MD5 Hash</th></tr>';
          while($row = mysqli_fetch_array($result))
          {
            echo '<tr>'
                 . '<td>' . $row['user'] . '</td>'
                 . '<td>' . $row['host'] . '</td>'
                 . '<td>' . $row['password'] . '</td>'
                 . '</tr>';
          }
          echo '</table>';
        ?>
    </body>
</html>

 

Mini-exercice

Recréer l'exemple ci-dessus et le faire marcher contre la base de données installée sur votre clé USB / disque dur. Il ne faut pas oublier de mettre le bon mot de passe à la place de "[password]". Dans la plupart des cas on n'a pas spécifié de mot de passe pour l'utilisateur root donc on remplace "[password]" par "".

 

 

CRÉER ET EXPLOITER SES PROPRES DONNÉES

 

Créer une base de données via phpMyAdmin

Un serveur de base de données peut contenir plusieurs bases de données. Avoir plusieurs bases sert à établir une compartimentation des données - par exemple séparer les données pour deux sites internet distincts.

Pour créer une nouvelle base de données on se sert de l'outil de gestion MySQL "phpMyAdmin" (qu'on a installé sur sa clé USB / disque dur). Ouvrir l'outil (URL http://localhost/phpmyadmin/), se connecter en tant que root et créer une base de données nommée "boutique" - l'interface est plus ou moins intuitif.

 

Créer une table via phpMyAdmin

Toutes les données dans une base de données (ou au moins dans les base de données dites "relationnelle") sont organisées dans les tables (tableaux si on préfère).

Chaque table est une grille de données, qui peut se représenter conceptuellement comme ceci :

 

id titre prix image description
1 DVD 119.95 dvd.jpg Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc auctor odio est, ac pretium justo tristique quis. Pellentesque habitant morbi tristique.
2 Ixus 89.95 ixus.jpg Mauris semper scelerisque suscipit. Integer nec pretium neque, suscipit cursus eros. Morbi arcu nibh, mollis ac fringilla ac, vulputate eget velit.
3 Raquette de Ping Pong 19.50 raquette.jpg Aliquam mi augue, faucibus vel aliquam at, viverra in lacus. Fusce sit amet accumsan ex. Curabitur consequat nunc nulla. Nunc pharetra lacus et purus.

 

Pour pouvoir créer une table de ce genre dans votre base de données, il faut d'abord comprendre que chaque colonne contient un seul type de données (par exemple tous les prix sont numériques) mais que le type de données peut varier d'une colonne à l'autre (les prix sont numériques mais les descriptions sont textuelles). En gros :

  • id : numérique, entier
  • titre, image, description : texte
  • prix : numérique, décimal

Et oui : la colonne image contient du texte car c'est juste un nom de fichier, et non pas des données graphiques binaires !

 

Ouvrir phpMyAdmin, se connecter, sélectionner sa nouvelle base de données ("boutique"),  et créer une table qui s'appelle "produits" avec les colonnes suivantes :

  • id : integer (INT) : clé primaire (Index PRIMARY)
  • titre : varchar, taille 50
  • prix : decimal, taille 9,2
  • image : varchar, taille 50
  • description : varchar, taille 500

 

Puis mettre des données dans la table "produits", également via l'interface phpMyAdmin (choisir la table dans la colonne à gauche puis cliquer l'onglet "Insérer".

 

Code PHP pour exploiter les données

Pour mettre ce code en marche il ne faut pas oublier de modifier le mot de passe "[password]".

Il faut également ces 3 images : dvd.jpg, ixus.jpg et raquette.jpg - à mettre dans le même dossier que le script PHP.

 

<?php
/* récupérer tous les produits de la base de données */
$link = mysqli_connect("localhost", "root", "[password]", "boutique") or die(mysqli_error($link));
$query = "SELECT id, titre, prix, image, description FROM produits ORDER BY id"
                   or die (mysqli_error($link));
$result = $link->query($query);
/* stocker le tout dans un tableau PHP (array) */
$tous_mes_produits = array();
while($row = mysqli_fetch_array($result))
{
  $tous_mes_produits[$row['id']] = $row;
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Lister mes produits</title>
        <style>
          .cadre { background-color:#dddddd; padding:20px; margin:20px;}
          img { border:1px solid black; float:right; }
        </style>
    </head>
    <body>
        <h1>Mes produits</h1>
        <?php
          foreach ($tous_mes_produits as $produit)
          {
            echo '<div class="cadre">';
            echo '<img src="' . $produit['image'] . '">';
            echo '<h1>' . utf8_encode($produit['titre']) . '</h1>';
            echo '<h4>&euro;&nbsp;' . $produit['prix'] . '</h4>';
            echo '<p>' . utf8_encode($produit['description']) . '</p>';
            echo '<div style="clear:both;"></div>';
            echo '</div>';
          }
        ?>
    </body>
</html>

 


 

EXERCICES

 

1. Avec la base de données "boutique" et sa table "produits" remplie de données, intégrer l'exploitation d'une base MySQL dans le code de votre boutique en ligne (votre boutique créée pendant les exercices de la leçon "Implémenter un panier d’achat en PHP"). Votre code HTML/PHP n'aura plus, pour chaque produit, de mention explicite de titre, description, prix, nom de fichier image, etc car toutes ces choses viendront de la base de données. Une fois en place, ces changements permettront la modification d'un produit via des changements de données uniquement. Également, pour ajouter un produit il devrait suffire d'ajouter une ligne dans la table "produits".