Maison > Questions et réponses > le corps du texte
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粉2682849302023-10-24 09:06:16
Database
class 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. 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.