Maison  >  Questions et réponses  >  le corps du texte

Comment utiliser la connexion PDO dans d'autres classes

<p>J'ai l'impression d'avoir du mal à comprendre le fonctionnement de la programmation orientée objet (POO). J'ai modifié le code pour qu'il fonctionne, mais je ne pense pas que ce soit la bonne façon. Voici un scénario (non, je ne crée pas moi-même la connexion utilisateur, c'est juste pour mieux comprendre la POO) : </p> <p>J'ai un fichier database.php :</p> <pre class="brush:php;toolbar:false;">class Base de données { /* Les attributs */ connexion $ privée ; private $dsn = 'mysql:dbname=test;host=127.0.0.1'; privé $utilisateur = 'root'; privé $mot de passe = ''; /* Créer une connexion à la base de données */ fonction publique __construct() { essayer { $this->conn = new PDO($this->dsn, $this->user, $this->mot de passe); } catch (PDOException $e) { print "Erreur ! : " . $e->getMessage() . mourir(); } retourner $this->conn; } }</pré> <p>Donc, dans cette classe, je crée une connexion à la base de données et renvoie la connexion (objet ?)</p> <p>Ensuite j'ai une deuxième classe, la fameuse classe User (en fait je n'utilise pas l'autoloading, mais je la connais) : </p> <pre class="brush:php;toolbar:false;">inclure "database.php"; Utilisateur de classe { /* Les attributs */ connexion $ privée ; /* Obtenir l'accès à la base de données */ fonction publique __construct() { $this->conn = new Database(); } /* Connexion utilisateur */ connexion de fonction publique() { $stmt = $this->conn->prepare("SELECT nom d'utilisateur, usermail FROM user"); if($stmt->execute()) { while($rows = $stmt->fetch()) { $fetch[] = $lignes ; } retourner $fetch ; } autre { renvoie faux ; } } }</pré> <p>Ce sont mes deux cours. Comme vous pouvez le constater, ce n’est pas grave. Maintenant, ne soyez pas dérouté par le nom de la fonction <code>login</code> - en fait, j'essaie simplement de sélectionner des noms d'utilisateur et des adresses e-mail dans la base de données et de les afficher. J'ai essayé d'y parvenir par : </p> <pre class="brush:php;toolbar:false;">$user = new User(); $liste = $user->login(); foreach($liste comme $test) { echo $test["nom d'utilisateur"]; }</pré> <p>Il y a un problème ici. Lorsque j'exécute ce code, j'obtiens le message d'erreur suivant : </p> <blockquote> <p>Erreur non détectée : appel à une méthode non définie Database::prepare()</p> </blockquote> <p>Je ne suis pas sûr de vraiment comprendre la cause de cette erreur.</p> <p><strong>Le code fonctionne correctement lorsque je modifie les éléments suivants : </strong></p> <p>Changement de <code>$conn</code> dans database.php de privé à public (je pense que c'est mauvais...? Mais quand il est privé, je ne peux l'utiliser que dans la classe Database pour exécuter des requêtes en interne, n'est-ce pas ? Alors devrais-je mettre toutes ces requêtes dans la classe Database ? Je pense que c'est mauvais car dans un gros projet, cela deviendra très énorme...)</p> ; <p>Le deuxième changement est : </p> <p>Modifiez <code>$this->conn->prepare</code> dans le fichier user.php en <code>$this->conn->conn->prepare< code>. Je n'en ai vraiment aucune idée. </p> <p>Je veux dire, dans le constructeur de <code>user.php</code>, j'ai un <code>$this->conn = new Database()</code>, depuis la nouvelle base de données renverra l'objet de connexion de la classe DB, je ne sais vraiment pas pourquoi il doit y avoir un deuxième <code>conn-></code></p>
P粉293550575P粉293550575423 Il y a quelques jours452

répondre à tous(1)je répondrai

  • P粉451614834

    P粉4516148342023-08-25 11:13:39

    • Ne créez pas une classe comme Database car elle ne sert à rien. Il est logique de créer une classe wrapper de base de données si elle ajoute des fonctionnalités supplémentaires à PDO. Mais étant donné son code actuel, il est préférable d'utiliser du PDO brut.
    • Créez une unique instance $db à partir du PDO d'origine ou de votre classe de base de données.
    • Transmettez-le comme paramètre de constructeur à chaque classe nécessitant une connexion à la base de données.

    database.php :

    <?php
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $charset = 'utf8';
    
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $pdo = new \PDO($dsn, $user, $pass, $opt);

    utilisateur.php

    <?php
    class User {
        /* Properties */
        private $conn;
    
        /* Get database access */
        public function __construct(\PDO $pdo) {
            $this->conn = $pdo;
        }
    
        /* List all users */
        public function getUsers() {
            return $this->conn->query("SELECT username, usermail FROM user")->fetchAll();
        }
    }

    app.php

    include 'database.php';
    $user = new User($pdo);
    $list = $user->getUsers();
    
    foreach($list as $test) {
        echo $test["username"],"\n";
    }

    sortie :

    username_foo
    username_bar
    username_baz

    Consultez mon (le seul correct) tutoriel PDO pour plus de détails sur le PDO.

    répondre
    0
  • Annulerrépondre