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

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 fonctionlogin- 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$conndans 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->preparedans le fichier user.php. Ici, je ne sais vraiment pas pourquoi.

Je veux dire, enuser.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 commeDatabaseclass 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 uneuniqueinstance $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 PDOpour 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
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!