PILOTAGE D'UNE PAGE WEB VIA UNE BASE DE DONNÉES

Requêtes SQL et PHP

Stéphane WOUTERS
https://stephanewouters.fr/

Connexion à une base de données SQL en PHP

Pour connecter PHP à MySQL, il faut utiliser une extension

Deux choix :

  • mysqli : Uniquement pour MySQL
  • PDO : Compatible avec toutes les BDD SQL

Dans ce cours nous utiliserons PDO.

PDO

Selon votre logiciel (WAMP, MAMP, laragon),
il faut parfois activer l'extension manuellement.

<?php

// Adresse du serveur
$host = "localhost";

// Numéro de port du serveur
$port = 3306;

// Nom de l'utilisateur
$user = "root";

// Mot de passe
$password = "root";

// Nom de la base de données
$dbname = "store";

// Connexion
$db = new PDO("mysql:dbname=$dbname;host=$host:$port", $user, $password);

// Afficher toutes les erreurs
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


?>

Connexion à une BDD avec PDO

Site web à pages multiples

Pour éviter de copier/coller les identifiants de connexion sur chaque page, on peut créer un fichier "connexion.php" :

<?php

$host = "localhost";
$port = 3306;
$user = "root";
$password = "root";
$dbname = "store";

$db = new PDO("mysql:dbname=$dbname;host=$host:$port", $user, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Puis on l'inclut dans chacune de nos pages :

<?php

include('connexion.php');

$db->query("select * from product");
// etc ...

LIRE DES DONNÉES

<?php

$result = $db->query("SELECT * FROM products");

$result contient un objet PDO qui n'est pas exploitable en l'état

On utilise $db->query pour exécuter une requête

<?php

$result = $db->query("SELECT * FROM products");

$ligne = $result->fetch();

Pour récupérer une ligne, on utilise la méthode "fetch()"

<?php

$result = $db->query("SELECT * FROM products");

$ligne = $result->fetch();

// Affiche le nom du produit
echo $ligne['name'];

// Affiche le prix du produit
echo $ligne['price'];

La variable $ligne est un tableau. On peut accéder aux valeurs de chaque colonne avec des crochets [ ]

Mais fetch ne récupère qu'une ligne...
Comment faire si on veut afficher tous les produits ?

<?php

$result = $db->query("SELECT * FROM products");

// Tant qu'il reste des produits à afficher
while ($ligne = $result->fetch()) {

    // Affiche le nom du produit
    echo $ligne['name'];

    // Affiche le prix du produit
    echo $ligne['price'];
}

Utiliser une boucle avec fetch()

<?php

$result = $db->query("SELECT * FROM products");

while ($ligne = $result->fetch()) { ?>

  Nom du produit : <b><?php echo $ligne['name']; ?></b>
  <br>
  Prix : <?php echo $ligne['prix']; ?>
  <br>
    
<?php } ?>

Pour mettre en forme, on mélange le PHP et l'HTML :

Deuxième possibilité avec la concatenation :

<?php

$result = $db->query("SELECT * FROM products");

while ($ligne = $result->fetch()) {

  echo "Nom du produit : <b>" . $ligne['name'] . "</b>";
  echo "<br>";
  echo "Prix : " . $ligne['prix'];
  echo "<br>";
    
}

Modifier des données

Rappel

Requête SQL pour réaliser une insertion

INSERT INTO [table] ([champ1, champ2])
VALUES ([valeur1, valeur2])

Insérer une ligne dans une table

Exemple pour ajouter un nouveau produit :

INSERT INTO product (name, price)
VALUES ("cookie 1", 1.80)

En PHP

<?php

$result = $db->query("INSERT INTO product (name, price) VALUES ('cookie 1', 1.80)");

L'exécution de cette page ajoutera "cookie 1" au prix de 1.80.

<?php

// Préparation de la requête en remplaçant les valeurs par des ?
$sth = $db->prepare("INSERT INTO product (name, price) VALUES (?, ?)");

// On remplace les ? par les variables voulues :
$sth->execute([$nom_produit, $prix_produit]);

Pour injecter des variables PHP dans une requête SQL, il faut composer en deux étapes :

<?php

$name_product = "Pizza 4 formages";
$price_product = 8.80;

Soit les variables suivantes :

Cette méthode est sécurisée et évite les intrusions malveillantes (failles d'injections SQL)

créer un formulaire d'ajout de produit

Soit le formulaire HTML suivant :

	
<form action="submit_form.php" method="POST">
  <div>
    <label for="name">Nom du produit</label>
    <input type="text" id="nom_produit" name="nom_produit" placeholder="Nom du produit">
  </div>
  <div>
    <label for="name">Prix du produit</label>
    <input type="text" id="prix" name="prix" placeholder="Prix du produit">
  </div>
  <br>
  <button type="submit">Envoyer</button>
</form>

insérer les données saisies dans la base de données

<?php

// On récupère les valeurs du forumlaire POST dans des variables :
$nom_produit = $_POST['nom_produit'];
$prix = $_POST['prix'];

// Préparation de la requête en remplaçant les valeurs par des ?
$sth = $db->prepare("INSERT INTO product (name, price) VALUES (?, ?)");

// On remplace les ? par les variables voulues :
$sth->execute([$nom_produit, $prix]);

fichier "submit_form.php"

Pour supprimer ou modifier, on utilise la même méthode

<?php

$prix = 1.80;
$id_produit = 3;

// Préparation de la requête en remplaçant les valeurs par des ?
$sth = $db->prepare("UPDATE product SET price=? WHERE id=?");

// On remplace les ? par les variables voulues :
$sth->execute([$prix, $id_produit]);
<?php

$id_produit = 3;

$sth = $db->prepare("DELETE FROM product WHERE id=?");
$sth->execute([$id_produit]);

Mettre à jour le prix du produit numéro 3

Supprimer le produit numéro 3

PARAMèTRES URL

UTILISER LES PARAMèTRES URL

Les paramètres URL permettent de passer des informations entre les pages et de dynamiser davantage un site web.

Ils permettent par exemple :

  • D'ajouter de la pagination dans un catalogue
  • D'afficher la fiche d'un produit en particulier
  • D'ajouter des boutons qui réalisent des actions : supprimer, modifier...
  • Ajouter des filtres dans un catalogue (tri par nom, prix, catégorie...)
  • ...

PARAMèTREs URL

Un paramètre URL de page se présente de la manière suivante :

http://monsite.com/index.php?monparametre=mavaleur

Ici, la page chargée sera toujours index.php.

Mais on y passe un paramètre :
"monparametre" qui a pour valeur "mavaleur"

Par exemple, dans un catalogue, on peut imaginer un paramètre "page" pour afficher une page spécifique :

http://monsite.com/catalogue.php?page=2

C'est le développeur qui décide des noms et du nombre de paramètres à passer.

PARAMèTREs URL

http://monsite.com/liste-produits.php
?page=2&tri=prix

Il est possible de passer plusieurs paramètres en les séparant par le caractère &

PARAMèTREs URL

Par défaut, les paramètres URL ne font rien. Ajouter ?page=2 dans l'URL ne changera pas l'affichage de la page si on ne l'exploite pas en PHP.

Pour récupérer la valeur d'un paramètre en PHP, on utilise la variable superglobable $_GET

Exemple, si j'appelle http://localhost/index.php?prenom=Jean

<?php

// Je récupère la valeur du paramètre 'prenom'
$prenom = $_GET['prenom'];

// Cette ligne affichera "Bonjour Jean !"
echo "Bonjour " . $prenom . " !"

EXEMPLE CONCRET

Je souhaite créer un fichier produit pour chacun de mes 200 produits.

Je ne vais pas créer 200 fichiers PHP...

Je peux créer une page "produit.php" générique qui récupère en paramètre le numéro du produit à afficher, et va chercher dans la base de données les informations de ce produit en particulier.

http://localhost/produit.php?id=1

http://localhost/produit.php?id=2

http://localhost/produit.php?id=....

EXEMPLE CONCRET

http://localhost/produit.php?id=2

<?php

// Je récupère le paramétre URL ?id=
$id_produit = $_GET['id'];

// Je récupère les informations du produit désiré
$sth = $db->prepare("SELECT * FROM products WHERE id=?");
$result = $sth->execute([$id_produit]);

$ligne = $result->fetch();

// Affiche le nom du produit
echo $ligne['name'];

// Affiche le prix du produit
echo $ligne['price'];

Visualisation en code PHP

Fichier produit.php

Autre exemple

Imaginons la page suivante :

On souhaite développer le comportement du bouton "supprimer"

Dans la génération du lien, je peux ajouter l'id du produit en paramètre URL :

 <?php while ($ligne = $result->fetch()) { ?>
   <tr>
    <-- code HTML pour les autres colonnes -->
    <td><a href="supprimer_produit.php?id=<?php echo $ligne['id']; ?>">Supprimer</a></td>
    </tr>
 <?php } ?>

Quand l'utilisateur cliquera sur supprimer, il sera redirigé vers le lien suivant :

http://localhost/supprimer_produit.php?id=3

Avec comme id l'identifiant du produit correspondant.

<?php

$id_produit = $_GET['id'];

// code SQL qui supprime le produit $id_produit

Sur ma page supprimer_produit.php, je peux récupérer l'id produit à supprimer.

Il reste à écrire le code qui permet de supprimer le produit qui a pour ID la valeur de la variable $id_produit

<?php

$id_produit = $_GET['id'];

$sth = $db->prepare("DELETE FROM product WHERE id=?");
$sth->execute([$id_produit]);

Créer un site e-commerce

EXERCICE

Made with Slides.com