Stéphane WOUTERS
https://stephanewouters.fr/
Deux choix :
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
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 ...
<?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>";
}
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)
<?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)
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>
<?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"
<?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
Les paramètres URL permettent de passer des informations entre les pages et de dynamiser davantage un site web.
Ils permettent par exemple :
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.
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 &
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 . " !"
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=....
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
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