GERER UNE BASE DE DONNEE MYSQL VIA PDO

Cahier des charges

Soit une liste de récepteurs X2D stockés dans une table "Recepteur" :

L'objectif est de développer un formulaire permettant de rechercher le nom d'un récepteur à partir de son adresse.

Si le récepteur est trouvé, son nom s'affiche sous le formulaire dans la même page.

Dans le cas contraire, on affiche la valeur retournée par défaut.

L'infrastructure proposée est la suivante :

La base de données à utiliser a été développée dans le TP sur les BDD. Les fichiers développés seront stockés dans le dossier /perso/public_html/formulaire.

Accès à la base de données via PDO

PDO (PHP Data Objects) est une classe de PHP permettant d'accéder aux bases de données. L'intérêt d'utiliser cette classe, par rapport à d'autres solutions, est que quelle que soit le type de la base de données utilisée (MySQL, PostgreSQL...), le code permettant de la gérer reste le même.

1. A partir de la documentation en ligne sur PDO (www.php.net), lister les arguments attendus par le constructeur de la classe PDO.

2. Que fait la méthode "query()" de la classe PDO? Que retourne-t-elle ?

3. Que fait la méthode "fetch()"? Quels sont les arguments possibles?

Soit le code source du fichier "script.php" permettant un accès à la table "Recepteur" :

<?php
try {
  $pdo = new PDO('mysql:host=xxx;dbname=xxx','xxx','xxx');
  $sql = 'SELECT * FROM Recepteur';
  $req = $pdo->query($sql);
  echo "<h3>Resultat :</h3>";
  while($res=$req->fetch(PDO::FETCH_ASSOC)) {
    echo $res["adresse"]." : ".$res["nom"]."<br>";
  }
}
catch (PDOException $e) {
  die();
}
?>

4. Compléter les 'xxxx' respectivement par :

Tester le script et commenter le résultat obtenu.

5. La requête sql demande de récupérer toutes les données de la table "Recepteur", laquelle comporte cinq champs. Seulement deux champs sur les cinq sont effectivement visualisés, ce qui représente une charge de travail inutile pour le serveur. Modifier la requête sql pour ne récupérer que les enregistements utiles.

6. Mettre une url quelconque pour la classe PDO puis modifier le code comme il suit :

<?php
...
catch (PDOException $e) {
  die();
  echo "Accès à la base de données impossible.";
}
?>

Que constatez-vous? Que faut-il modifier pour obtenir le résultat escompté?

7. Remplacer le paramètre "fecth_style" de la méthode "fetch()" afin d'obtenir le résultat sous forme d'objet. Modifier le script et tester. De la documentation peut être trouvée à l'adresse http://php.net/manual/fr/pdostatement.fetch.php.

Gestion d'un formulaire

Mise en situation

L'objectif est d'élaborer le formulaire de saisie de l'adresse d'un récepteur. Lors de la validation du formulaire, si l'adresse est présente dans la table "Recepteur", le nom du récepteur est retourné, puis affiché dans la page.

L'application sera composée des fichiers suivants :

Vous pouvez obtenir jQuery de deux manières :

Mise en place du formulaire

Soit le code source du fichier "formulaire.html" :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="xxx"></script>
    <script src="xxx"></script>
  </head>
  <body>
    <h3>Recherche d'un récepteur dans la base</h3>
    <form id="formrecept" method="post">
      Adresse du récepteur : <input type="text" name="addrecept">
      <input type="submit" value="Rechercher">
    </form>
    <p id="nomrecepteur"></p>
  </body>
</html>

1. Compléter les xxx dans le « head » du fichier précédent en tenant compte de ce qui a été énoncé au III.1, laisser le fichier "requete.js" vide pour l'instant.

2. Valider l'apparition du formulaire dans un navigateur. Naturellement, la recherche ne fonctionne pas pour l'instant.

Gestion de l'envoi de la requête

Le code contenu dans le fichier "requete.js" permet :

$(document).ready(function() {
  $('#xxx').submit(function(event) {
    event.preventDefault();
    $.ajax({
      type: 'xxx',
      url: 'xxx',
      data: $(this).serialize(),
      dataType: 'xxx',
      success: function(data) {
        if(data=="") $('#xxx').html("Aucun récepteur à cette adresse");
        else $('#xxx').html("Nom du recepteur : "+data.nom);
      }
    });
  });
});

La méthode submit() est attachée à un formulaire. Elle est sollicitée lors d'un clic sur le bouton de type « submit ». La méthode html() est associée à un élément du DOM et permet d'insérer du contenu dans une balise.

1. Compléter les xxx dans le fichier requete.js.

2. Tester le formulaire avec le script PHP suivant (renvoi de la valeur saisie dans le formulaire au format JSON) :

<?php
$add=$_POST["addrecept"];
echo '{"nom":"'.$add.'"}';
?>

Sous quelle forme est envoyée la donnée lors de la requête POST? Visualiser également la donnée renvoyée par le serveur au format JSON.

Gestion du script d'interrogation de la base de données

L'objectif est maintenant d'élaborer le script PHP permettant, à partir de l'adresse fournie dans le formulaire, de retourner le nom du récepteur associé.

<?php
$add=$_POST["addrecept"];
try {
  $pdo = new PDO('mysql:host=xxx;dbname=xxx','xxx', 'xxx');
  $sql = 'xxx';
  $req = $pdo->query($sql);
  $r=$req->fetch(PDO::FETCH_ASSOC);
  $donnee=json_encode($r);
}
catch (PDOException $e) {
  die();
}
echo $donnee;
?>

1. Quelle est la requête SQL à mettre en œuvre pour remplir le cahier des charges ?

2. Compléter les xxx dans le fichier script.php. Que permet de faire précisément la ligne de code suivante?

$donnee=json_encode($r);

3. Tester le formulaire avec ce nouveau script.