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

Comment utiliser la connexion PDO dans une autre classe ?

Je pense que j'ai du mal à comprendre comment fonctionne la POO. J'ai modifié le code pour que ça fonctionne, mais ce n'est pas la bonne façon je pense. Le scénario suivant (non, je ne crée pas moi-même la connexion utilisateur, c'est juste pour que les développeurs locaux comprennent mieux la POO) :

J'ai un fichier database.php :

class Database {

    /* Properties */
    private $conn;
    private $dsn = 'mysql:dbname=test;host=127.0.0.1';
    private $user = 'root';
    private $password = '';

    /* Creates database connection */
    public function __construct() {
        try {
            $this->conn = new PDO($this->dsn, $this->user, $this->password);
        } catch (PDOException $e) {
            print "Error!: " . $e->getMessage() . "";
            die();
        }
        return $this->conn;
    }
}

Donc, dans cette classe, je crée une connexion à une base de données et renvoie cette connexion (objet ?)

Ensuite j'ai la deuxième classe, la fameuse classe User (en fait je n'utilise pas l'autoloading, mais je la connais) :

include "database.php";

class User {
    /* Properties */
    private $conn;

    /* Get database access */
    public function __construct() {
        $this->conn = new Database();
    }

    /* Login a user */
    public function login() {
        $stmt = $this->conn->prepare("SELECT username, usermail FROM user");
        if($stmt->execute()) {
            while($rows = $stmt->fetch()) {
                $fetch[] = $rows;
            }
            return $fetch;
        }
        else {
            return false;
        }
    }
}

Ce sont mes deux cours. Comme vous pouvez le constater, ce n’est pas grave. Maintenant, ne vous laissez pas tromper par le nom de la fonction login - 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'essaie d'y parvenir en :

$user = new User();
$list = $user->login();

foreach($list as $test) {
    echo $test["username"];
}

Voici le problème. Lorsque j'exécute ce code, j'obtiens le message d'erreur suivant :

Erreur non détectée : appel à une méthode non définie Database::prepare()

Et je ne suis pas sûr de vraiment comprendre la cause de cette erreur.

Le code fonctionne correctement lorsque je modifie les éléments suivants :

Changez $conn dans database.php en public au lieu de private (je pense que c'est mauvais... ? Mais quand c'est privé, je ne peux effectuer des requêtes qu'à l'intérieur de la classe de base de données, n'est-ce pas ? Je devrais donc mettre toutes ces requêtes dans la base de données classe ? je pense que c'est mauvais car dans un gros projet ça va devenir très gros..)

Le deuxième changement que je souhaite apporter est : Changez $this->conn->prepare修改为$this->conn->conn->prepare dans le fichier user.php. Ici, je ne sais vraiment pas pourquoi.

Je veux dire, en user.php 的构造函数中,我有一个 $this->conn = new Database() ,并且由于 new Database 将从 DB 类返回我的连接对象,我真的不知道为什么必须有第二个 conn->

P粉548512637P粉548512637383 Il y a quelques jours684

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

  • P粉268284930

    P粉2682849302023-10-24 09:06:16

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

    database.php :

     \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

    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