Bonjour à tous, je viens de suivre un tutoriel de 4 vidéos sur Youtube afin de m'initier à la création d'un site web en architecture MVC, le problème est qu'il s'arrète juste après la connexion à la base données et je ne comprend pas comment afficher une donnée particulière.

Par exemple, imaginons que je veuille afficher l'username de chaque utilisateur :

// models/Database.php
<?php 

class Database {

    public static $host = "localhost"; 
    public static $dbName = "members";
    public static $username = "root";
    public static $password = "";

    private static function connect() {
        $pdo = new PDO("mysql:host=".self::$host.";dbname=".self::$dbName.";charset=utf8",self::$username,self::$password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;

    }

    public static function query($query, $params = array()) {
        $statement = self::connect()->prepare($query);
        $statement->execute($params);

        if (explode(' ', $query)[0] == 'SELECT') {
            $data = $statement->fetchAll();
            return $data;
        }
    }
}
?>
// Controllers/AllUsers.php
<?php 

class AllUsers extends Controller {
    public static function GetAllUsers() {

        self::query("SELECT * FROM users");
    }
}
?>

Le fait de faire un print_r() sur le self::query affiche tout les utilisateurs en array, mais je ne comprend pas comment par exemple, afficher des données spécifiques, telles que le username ou l'age ou whatever de façon basique, comme j'ai l'habitude de faire :

$req = $bdd->prepare("SELECT * FROM users");
$req->execute();

while ($user = $req->fetch(PDO::FETCH_OBJ)) {
    echo $user->username;
    echo "<br>";
}
// Tout simplement

Je fais au mieux pour essayer d'apprendre !
Merci à vous !

1 réponse


Bonjour Toinou,

Je peux vous donner quelques informations.

Votre code ci-dessous est problématique car à chaque à chaque fois que vous utiliserez une requête avec votre fonction query vous allez instanciez une nouvelle connexion.

// models/Database.php
private static function connect() {
    $pdo = new PDO("mysql:host=".self::$host.";dbname=".self::$dbName.";charset=utf8",self::$username,self::$password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $pdo;
}

Je vous conseil de le changer pour qu'il ressemble à cela:

// models/Database.php
class Database {
    private static $instance;
    // ici les autres attributs

    // privée pour ne pas pouvoir instancier d'objet
    private function __construct() { /* ne rien faire */ }

    private static function connect() {
          if (self::$instance == null) {
            self::$instance = new PDO("mysql:host=".self::$host.";dbname=".self::$dbName.";charset=utf8",self::$username,self::$password);
            self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          }
          return self::$instance;
    }

    public static function query($query, $params = array()) {
        self::connect();

        $statement = self::$instance->prepare($query);
        $statement->execute($params);

        if (explode(' ', $query)[0] == 'SELECT') {
            $data = $statement->fetchAll();
            return $data;
        }
    }
}

Les changements apportés porte le nom de Pattern Singleton, je vous invite à consulter cette vidéo.

C'est du détail, mais en général le nom des controller porte le nom du model associé, si votre entité s'appel User, appelé votre controller UserController.
Ca vous évite de multiplier les fichiers, sachant que l'apporche MVC est déjà une approche qui les multiplies, on essaiera donc d'avoir le minimum nécessaire (qui sera déjà beaucoup). Dans votre code, je ne vois pas l'utilisation d'une entitée User.

class UserController extends Controller {
    public static function getAllUsers() {
        self::query("SELECT * FROM users");
    }

     public static function getUserWithId(integer $id) {
        // ...
     }

     // $request qui contient les données POST réceptionné d'un formulaire
     public static function create(Request $request) {
        // ...
     }

     // $request qui contient les données POST réceptionné d'un formulaire
     public static function update(Request $request) {
        // ...
     }

     // $id qui contient le numéro de la clé primaire
     public static function delete(integer $id) {
        // ...
     }
}

Votre code ci-dessous est étrange, vous essayer de vérifier si la requête est un SELECT et si c'est le cas vous retournez les enregistrements.
Il est courant de voir cela quand on apprend, mais c'est une très mauvaise façon de faire. Pour mieux comprendre les bonnes pratiques, prenez le temps d'étudier un framework MVC.

public static function query($query, $params = array()) {
    // ...

    if (explode(' ', $query)[0] == 'SELECT') {
        $data = $statement->fetchAll();
        return $data;
    }
}