
CRUD 2
Introduction à la programmation orientée objet en PHP
Relier notre instance de classe à la classe manager
Notre CRUD (Create, Read, Update, Delete) enregistre maintenant directement la nouvelle instance de classe
Le fichier index.php<!DOCTYPE html>
<html lang="fr">
<head>
<title>POO PHP</title>
<meta charset="utf-8">
<link rel="stylesheet" href="css/mesStyles.css">
</head>
<body>
<h1>Inscription</h1>
<?php
require 'classes/utilisateur.class.php';
require 'classes/admin.class.php';
require 'classes/abonne.class.php';
require 'config/login.php';
require 'classes/manager.class.php';
$Abonne1 = new Abonne('Papy44', 123, 'Nord');
$Manager = new Manager($bdd);
$Manager -> createInscrits($Abonne1);
$Manager -> readInscrits();
?>
</body>
</html>
⚠ les trois getters getNom(), getPass() et getRegion() doivent avoir un return et nom pas un echo. Sinon cela affiche les infos lors de la création
Autre solution
Une technique beaucoup plus simple (mais extrêmement dangereuse) que celle présentée ici est de récupérer les trois infos directement dans la méthode createInscrits depuis un formulaire avec des $_POST[] comme ceci :
$Manager -> createInscrits($_POST['nom'], $_POST['pass'], $_POST['region']);
<?php
class Manager {
private $_db; // Instance de PDO
public function __construct($bdd) {
$this->setDb($bdd);
}
public function setDb($bdd) {
$this->_db = $bdd;
}
// Méthode createInscrits() non sécurisée - voir en bas de page
public function createInscrits($Abonne) {
$requete = 'INSERT INTO inscrits(id_inscrits, nom_inscrits, pass_inscrits, region_inscrits)
VALUES(null,"'.$Abonne ->getNom().'","'.$Abonne ->getPass().'","'.$Abonne ->getRegion().'")';
$resultat = $this -> _db -> prepare($requete);
$resultat -> execute();
}
public function readInscrits() {
$requete = 'SELECT id_inscrits, nom_inscrits FROM inscrits ORDER BY id_inscrits DESC';
$resultat = $this -> _db -> query($requete);
echo '<ul>';
while($ligne= $resultat->fetch(PDO::FETCH_ASSOC)){
echo '<li>N° '.$ligne['id_inscrits'].' : '.ucfirst($ligne['nom_inscrits']).'</li>';
}
echo '</ul>';
}
public function updateInscrits($new_nom, $id) {
$requete = "UPDATE inscrits SET nom_inscrits = '".$new_nom."' WHERE id_inscrits='".$id."'";
$resultat = $this -> _db -> prepare($requete);
$resultat -> execute();
}
public function deleteInscrits($id) {
$requete = 'DELETE FROM inscrits WHERE id_inscrits ='.$id;
$this -> _db -> query($requete);
}
}
Sécurisation des données
Il est primordial de réaliser la sécurisation des données par échappement SQL via la préparation PDO. Pour cela, et conjointement avec l'utilisation de la méthode prepare(), on remplace toutes les valeurs dynamiques par des marqueurs inoffensifs comme par exemple : :nom ou :prenom. Ensuite, à l'exécution de la requête, soit on injecte les valeurs sous forme de tableau ([:marqueur => valeur]) et dans ce cas, toutes les valeurs sont considérées comme du texte, soit on les rattache une par une avec bindValue(:marqueur, valeur, type) ou bindParam(:marqueur, valeur, type).
La méthode createInscrits() corrigée<?php
public function createInscrits($Abonne) {
$requete = 'INSERT INTO inscrits(id_inscrits, nom_inscrits, pass_inscrits, region_inscrits)
VALUES(null,:nom, :pass, :region)';
$resultat = $this -> _db -> prepare($requete);
$resultat->bindValue(':nom', $Abonne -> getNom(), PDO::PARAM_STR);
$resultat->bindValue(':pass', $Abonne -> getPass(), PDO::PARAM_INT);
$resultat->bindValue(':region', $Abonne -> getRegion(), PDO::PARAM_STR);
$resultat -> execute();
}
bindValue() vs bindParam()
Notez qu'il existe une légère différence entre bindValue() et bindParam() au niveau du passage des valeurs : bindValue() les passe par valeur alors que bindParam() par référence. bindParam() est indiquée dans les cas où la même requête doit être exécutée plusieurs fois d'affilée. Comme par exemple dans l'insertion de plusieurs jeux de données