Comment utiliser la connexion PDO dans une autre classe ?
P粉548512637
P粉548512637 2023-10-23 09:37:51
0
1
768

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粉548512637
P粉548512637

répondre à tous(1)
P粉268284930
  • 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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal