Comment utiliser la connexion PDO dans d'autres classes
P粉293550575
2023-08-24 15:10:58
<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>
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.database.php :
utilisateur.php
app.php
sortie :
Consultez mon (le seul correct) tutoriel PDO pour plus de détails sur le PDO.