Médiaforma

All posts in PHP MySQL

Vous avez découvert et expérimenté les requêtes SQL dans la console MySQL. Tout ce qui a été dit est également utilisable en PHP.

Voyons comment interroger une table

Après avoir créé un objet PDO :

$base = new PDO('mysql:host=localhost; dbname=nombdd', 'root', '');

Vous pouvez effectuer des sélections dans une table en utilisant la méthode query() :

$retour = $base->query("requête");

Où requete représente la requête SQL que vous voulez exécuter. Vous pouvez par exemple utiliser les requêtes s uivantes :

Requête Effet
SELECT * FROM table; Affiche tous les enregistrements de la table spécifiée
SELECT nom FROM table; Affiche toutes les valeurs du champ nom de la table spécifiée.
SELECT * FROM table WHERE ch=valeur; Affiche tous les champs de la table spécifiée pour lesquels le champ ch vaut valeur.
SELECT * FROM table WHERE ch=valeur ORDER BY ch2 ASC; Affiche tous les champs de la table spécifiée pour lesquels le champ ch vaut valeur, en classant les réponses par champ ch2 croissants.
SELECT COUNT(*) FROM table; Compte le nombre d’enregistrements de la table spécifiée.

 

Pour parcourir le résultat de la requête, vous utiliserez la méthode fetch() :

while ($data = $retour->fetch()) {
  echo $data['champ']."<br>"; // Liste les valeurs du champ spécifié
}

Une fois les traitements effectués, détruisez l’objet PDO. avec cette instruction :

$base=null;


Reprenez l’exercice précédent, mais cette fois-ci, utilisez une requête préparée.

Solution

Faites une pause dans la vidéo pour vous permettre de définir le code. Vous pourrez poursuivre le visionnage de la vidéo pour prendre connaissance de la solution.

<?php
  try {
    $base = new PDO('mysql:host=localhost; dbname=northwind', 'root', '');
  }
  catch(exception $e) {
    die('Erreur '.$e->getMessage());
  }
  $base->exec("SET CHARACTER SET utf8");
  $retour = $base->prepare('SELECT OrderID, Customer, ShipCity FROM orders WHERE ShipCountry=?');
  $retour->execute(array("France"));
  echo "<table>";
  while ($data = $retour->fetch()){
    echo "<tr><td>".$data['OrderID']."</td>";
    echo "<td>".$data['Customer']."</td>";
    echo "<td>".$data['ShipCity']."</td></tr>";
  }
  echo "</table>";
  $base = null;
?>

La plupart des instructions sont conservées. Notez cependant que la méthode query est remplacée par la méthode prepare. La valeur affectée au champ ShipCountry dans la clause WHERE n’est pas spécifiée en clair. Un point d’interrogation remplace la valeur à utiliser.

Pour indiquer que les enregistrements sélectionnés doivent avoir un champ ShipCountry égal à France, on invoque la méthode execute en lui passant la chaîne France.

Exécutons ce code dans WAMP Server. Le résultat est bien entendu identique à celui de l’exercice précédent.


Pour insérer des variables dans une requête MySQL, vous utiliserez des “requêtes préparées” :

$retour = $base->prepare('requête');

Où requête est une requête MySQL qui contient un ou plusieurs caractères “?”. Par exemple :

SELECT * FROM base WHERE champ1=? AND champ2=?

Les caractères “?” seront remplacés par des valeurs lors de l’exécution de la méthode execute :

$retour->execute(array($var1, $var2));

Interrogez la table orders et affichez les champs OrderID, Customer et ShipCity des enregistrements dont le champ ShipCountry vaut France.

Solution

Faites une pause dans la vidéo pour vous permettre de définir le code. Vous pourrez poursuivre le visionnage de la vidéo pour prendre connaissance de la solution.

 <!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Accès à la table orders de la bdd Northwind avec PDO</title>
    <style>
      td { padding-right: 30px;}
    </style>
  </head>
  <body>
    <?php
      try {
        $base = new PDO('mysql:host=localhost; dbname=northwind', 'root', '');
      }
      catch(exception $e) {
        die('Erreur '.$e->getMessage());
      }
      $base->exec("SET CHARACTER SET utf8");
      $retour = $base->query('SELECT OrderID, Customer, ShipCity FROM orders WHERE ShipCountry="France"');
      echo "<table>";
      while ($data = $retour->fetch()){
        echo "<tr><td>".$data['OrderID']."</td>";
        echo "<td>".$data['Customer']."</td>";
        echo "<td>".$data['ShipCity']."</td></tr>";
      }
      echo "</table>";
      $base = null;
    ?>
  </body>
</html>

La base de données est ouverte en créant un objet PDO.

Si une erreur se produit à l’ouverture de la base, elle est affichée et le programme s’arrête

Si tout s’est bien passé, on indique que l’encodage à utiliser est UTF-8

Puis une requête SQL est appliquée à la table orders. Cette requête récupère les champs OrderID, Customer et Shipcity pour lesquels le champ shipcountry vaut France.

Les données filtrées par la requête sont obtenues avec la fonction fetch. Une boucle while permet de parcourir toutes les données de la table. Les champs de chaque enregistrement sont alors affichés dans les colonnes d’un tableau HTML.

Enfin, l’objet PDO $base est supprimé pour mettre fin à la connexion.

Exécutons ce script dans WAMP Server. Voici le résultat.

 


Affichez tous les champs de tous les enregistrements de la table customers dans un tableau.

Solution

Faites une pause dans la vidéo pour vous permettre de définir le code. Vous pourrez poursuivre le visionnage de la vidéo pour prendre connaissance de la solution.

Voici le code à utiliser :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Accès à la bdd testconsole avec PDO</title>
  </head>
  <body>
    <?php
      try {
        $base = new PDO('mysql:host=localhost; dbname=northwind', 'root', '');
      }
      catch(exception $e) {
        die('Erreur '.$e->getMessage());
      }
      $base->exec("SET CHARACTER SET utf8");
      $retour = $base->query('SELECT * FROM customers');
      echo "<table>";
      while ($data = $retour->fetch()){
        echo "<tr><td>".$data['CustomerID']."</td>";
        echo "<td>".$data['CompanyName']."</td>";
        echo "<td>".$data['ContactName']."</td>";
        echo "<td>".$data['ContactTitle']."</td>";
        echo "<td>".$data['Address']."</td>";
        echo "<td>".$data['City']."</td>";
        echo "<td>".$data['PostalCode']."</td>";
        echo "<td>".$data['Country']."</td></tr>";
      }
      echo "</table>";
      $base = null;
    ?>
  </body>
</html>

La base de données est ouverte en créant un objet PDO.

Si une erreur se produit à l’ouverture de la base, elle est affichée et le programme s’arrête

Si tout s’est bien passé, on indique que l’encodage à utiliser est UTF-8

Puis une requête SQL est appliquée à la table customers. Cette requête retourne tous les champs de tous les enregistrements de la table customers.

Les données filtrées par la requête sont obtenues avec la fonction fetch. Une boucle while permet de parcourir toutes les données de la table. Les champs de chaque enregistrement sont alors affichés dans les colonnes d’un tableau HTML.

Enfin, l’objet PDO $base est supprimé pour mettre fin à la connexion.


Pour travailler sur des données plus consistantes, vous allez utiliser plusieurs tables fournies en exemple par Microsoft dans la base de données Northwind.

Commencez par télécharger les fichiers suivants :

Fichier Emplacement
customers.csv https://www.mediaforma.com/encours/customers.csv
orders.csv https://www.mediaforma.com/encours/orders.csv
order_details.csv https://www.mediaforma.com/encours/order_details.csv

 

Ouvrez phpMyAdmin en tant qu’utilisateur root. Importez ces trois tables dans la base de données northwind, sous les noms customers, orders et order_details.

Solution

Faites une pause dans la vidéo pour vous permettre de créer la base de données northwing et d’y importer les trois tables que vous aurez téléchargées. Poursuivez la lecture de la vidéo pour avoir des informations détaillées sur l’importation.

1)      Une fois connecté à phpMyAdmin en tant que root, sélectionnez l’onglet Importer et importez les fichiers customers.csv, orders.csv et order_details.csv . Vous utiliserez le paramétrage suivant :

  • Jeu de caractères UTF8
  • Format CSV
  • Colonnes séparées par des points-virgules
  • Colonnes entourées par des guillemets
  • Cochez la case “La première ligne du fichier contient le nom des colonnes de la table”

2)      Renommez la base de données csv_db en northwind. Pour cela, cliquez sur csv_db dans le volet gauche, sélectionnez l’onglet Opérations et utilisez le groupe d’options Changer le nom de la base de données pour.

3)      Modifiez le nom des tables en customers, orders et order_details. Pour cela, cliquez sur leur nom dans le volet gauche, basculez sur l’onglet Opérations et utilisez le groupe d’options Copier la table vers.


Nous allons établir une connexion avec la table testtable de la base testconsole définie dans une section précédente. Si vous avez supprimé cette table, créez-la dans la console MySQL et insérez-y les données suivantes :

Pierre, Dubur, 34, NOW()
Chantal, Garnier, 128, NOM()
Jean, Dupont, 2, NOW()
Belle, Vercor, 45, NOW()

La connexion avec la base de données se fait en créant une instance de la classe PDO :

$base = new PDO('mysql:host=nomserveur; dbname=nombase', 'nomutilisateur', 'motdepasse');

Où :

  • nomserveur est le nom du serveur de base de données ;
  • nombase est le nom de la base de données ;
  • nomutilisateur est le nom d’utilisateur avec lequel se connecter sur la base de données ;
  • motdepasse est le mot de passe associé au nom d’utilisateur choisi.

Par exemple, pour se connecter sur la base testconsole du serveur localhost en utilisant le nom d’utilisateur root auquel aucun mot de passe n’est associé, vous utiliserez l’instruction suivante :

$base = new PDO(‘mysql:host=localhost; dbname=testconsole’, ‘root’, ”);

Pour identifier les erreurs qui pourraient se produire sur cette instruction, vous utiliserez une structure try catch :

<?php
  try {
    $base = new PDO('mysql:host=localhost; dbname=testconsole', 'root', '');
  }
  catch(exception $e) {
    die('Erreur '.$e->getMessage());
  }
?>

Exécutez ce code. Si aucun message d’erreur n’est affiché, la base de données est bien accessible.

Avant de lire les données dans la base de données, vous allez indiquer l’encodage à utiliser avec la méthode exec() :

$base->exec("SET CHARACTER SET utf8");

Pour lire les données contenues dans une table, vous utiliserez une requête SQL. Cette requête sera passé à l’objet PDO $base avec la méthode query() :

$retour = $base->query('requete');

Où requête est la requête SQL à exécuter.

Par exemple, pour obtenir toutes les données de la table testtable, vous utiliserez l’instruction suivante :

$retour = $base->query('SELECT * FROM testtable');

Il ne reste plus qu’à traiter les données retournées avec une boucle while :

while ($data = $retour->fetch()){
  echo $data['prenom'].' '.$data['nom'].' : connecté '.$data['compteurvisite'].' fois (dernière connexion le '.$data['dernierevisite'].')<br>';
}

Lorsque les données auront été extraites de la base de données, vous pourrez supprimer l’objet PDO $base pour mettre fin à la connexion :

$base = null;

Voici le code complet :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Accès à la bdd testconsole avec PDO</title>
  </head>
  <body>
    <?php
      try {
        $base = new PDO('mysql:host=localhost; dbname=testconsole', 'root', '');
      }
      catch(exception $e) {
        die('Erreur '.$e->getMessage());
      }
      $base->exec("SET CHARACTER SET utf8");
      $retour = $base->query('SELECT * FROM testtable');
      while ($data = $retour->fetch()){
        echo $data['prenom'].' '.$data['nom'].' : connecté '.$data['compteurvisite'].' fois (dernière connexion le '.$data['dernierevisite'].')<br>';
      }
      $base = null;
    ?>
  </body>
</html>

La boîte de dialogue est bien accessible et la requête produit plusieurs enregistrements qui sont affichés sur l’écran avec l’instruction echo