Easy-Micro

LANGAGE Intro POO PHP
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']);
Le fichier classes/manager.class.php
<?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 associe une valeur à un marqueur correspondant. Elle permet d'exécuter une requête préparée avec des marqueurs nommés

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


Flux RSS Easy-Micro - Abonnez-vous Easy-Micro [ François Bisch ]