Base de données et mysql

Nous allons modifier la version du garage pour la rendre dynamique avec une base de données plutôt qu’un tableau

Pour se faire vous devez dans local ouvrir adminer dans local sous l’onglet database

Dans adminer créer une table (dans le menu à gauche)

Saisissez les infos ci-dessous

insérer les 8 voitures à la main

Créer un nouveau dossier dans votre dossier local sites/php/app/public/ nommé garage

Dans ce dossier dupliquer le contenu de l’ancien exercice garage

supprimer le tableau php $garage (array) et commentez la boucle foreach

A l’endroit où les voitures s’affichaient insérer le code php pour se connecter à la base de données

<?php
$servname = "localhost"; $dbname = "local"; $user = "root"; $pass = "root";
    try{
        $dbco = new PDO("mysql:host=$servname;dbname=$dbname", $user, $pass);
        $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $sql="SELECT * FROM cars";
        $sth = $dbco->prepare($sql);
        $sth->execute();
        $resultats = $sth->fetchAll(PDO::FETCH_ASSOC);
        echo '<pre>';
        print_r($resultats);
        echo '<pre>';
    catch(PDOException $e){
        echo "Erreur : " . $e->getMessage().'<br>'.$sql;
    }
?>

A la place des lignes echo '<pre>' print_r et echo '</pre>' remettez la boucle en changeant le nom de la variable $garage par $resultats

Partie 2 Classement

Ajouter en dessous du titre un menu html pour classer les résultats :

<nav class="order">
  <p class="price">
    <a href="?order_by=price">Prix ↓</a> 
    <a href="?order_by=price&order=DESC">Prix ↑</a> 
  </p>
  <p class="year">
    <a href="?order_by=year">Année ↓</a> 
    <a href="?order_by=year&order=DESC">Année ↑</a> 
  </p>
  <p class="kms">
    <a href="?order_by=kms">KMS ↓</a> 
    <a href="?order_by=kms&order=DESC">KMS ↑</a> 
  </p>
</nav>

Remarquez les href qui envoient des paramètres dans l’url en GET

Ajouter un peu de css

nav.order{
 flex-basis: 100%;
 display: flex;
 flex-direction:row;
 flex-wrap:wrap;
 gap:2em;
 background: #ddd;
 padding: .5rem 1rem;
 border-radius:.8em;
}
nav.order>p{ 
 flex-basis: auto;
}
nav.order a{
 color: #000;
 text-decoration: none;
 display: inline-block;
 margin-right: 0.3em;
}

Entre la 2è ligne $dbco qui connecte à la base de données et la ligne $sql qui créer la requête.

A l’aide de la fonction isset de php (pour contrôler qu’une variable existe et d’un switch ou d’une suite de if / else if / else créer des tests pour récupérer dans un premier temps le paramètre $_GET order_by et ainsi modifier la requête SQL pour qu’elle ressemble à cela : SELECT * FROM cars ORDER BY price ou SELECT * FROM cars ORDER BY price ou SELECT * FROM cars ORDER BY kms

Le pseudo code serait le suivant :

si la variable $_GET['order_by'] existe
  si order_by est égal à prix
    ajoute ORDER_BY price à $sql
  autrement si order_by est égal à year
    ajoute ORDER_BY year à $sql
  autrement si order_by est égal à kms
    ajoute ORDER_BY kms à $sql
fin de si $_GET existe

Faire la même chose avec $_GET[‘order’] pour classer croissant ou décroissant pour que les requêtes ressemblent à ceci : SELECT * FROM cars ORDER BY price DESC ou SELECT * FROM cars ORDER BY kms DESC