Heim  >  Fragen und Antworten  >  Hauptteil

So verwenden Sie die PDO-Verbindung in anderen Klassen

<p>Ich habe das Gefühl, dass ich ein Problem damit habe, zu verstehen, wie objektorientierte Programmierung (OOP) funktioniert. Ich habe den Code so geändert, dass er funktioniert, aber ich glaube nicht, dass es der richtige Weg ist. Hier ist ein Szenario (nein, ich erstelle die Benutzeranmeldung nicht selbst, dies dient nur dem besseren Verständnis von OOP): </p> <p>Ich habe eine Datenbank.php-Datei:</p> <pre class="brush:php;toolbar:false;">class Datenbank { /* Attribute */ private $conn; private $dsn = 'mysql:dbname=test;host=127.0.0.1'; private $user = 'root'; privates $password = ''; /* Datenbankverbindung erstellen */ öffentliche Funktion __construct() { versuchen { $this->conn = neues PDO($this->dsn, $this->user, $this->password); } Catch (PDOException $e) { print "Fehler!: " $e->getMessage() . sterben(); } return $this->conn; } }</pre> <p>In dieser Klasse erstelle ich also eine Datenbankverbindung und gebe die Verbindung (Objekt?) zurück</p> <p>Dann habe ich eine zweite Klasse, die berühmte User-Klasse (eigentlich verwende ich kein Autoloading, aber ich weiß davon): </p> <pre class="brush:php;toolbar:false;">include "database.php"; Klasse Benutzer { /* Attribute */ private $conn; /* Datenbankzugriff erhalten */ öffentliche Funktion __construct() { $this->conn = new Database(); } /* Benutzer anmelden */ öffentliche Funktion login() { $stmt = $this->conn->prepare("SELECT username, usermail FROM user"); if($stmt->execute()) { while($rows = $stmt->fetch()) { $fetch[] = $rows; } return $fetch; } anders { falsch zurückgeben; } } }</pre> <p>Das sind meine beiden Kurse. Wie Sie sehen, keine große Sache. Lassen Sie sich nicht durch den Funktionsnamen <code>login</code> verwirren – eigentlich versuche ich nur, einige Benutzernamen und Benutzermails aus der Datenbank auszuwählen und anzuzeigen. Ich habe versucht, dies zu erreichen, indem ich: </p> <pre class="brush:php;toolbar:false;">$user = new User(); $list = $user->login(); foreach($list as $test) { echo $test["Benutzername"]; }</pre> <p>Hier liegt ein Problem vor. Wenn ich diesen Code ausführe, erhalte ich die folgende Fehlermeldung: </p> <blockquote> <p>Unabgefangener Fehler: Aufruf der undefinierten Methode Database::prepare()</p> </blockquote> <p>Ich bin mir nicht sicher, ob ich die Ursache dieses Fehlers wirklich verstehe.</p> <p><strong>Der Code funktioniert einwandfrei, wenn ich Folgendes ändere: </strong></p> <p> <code>$conn</code> in der Datenbank.php von privat auf öffentlich geändert (ich finde das schlecht...? Aber wenn es privat ist, kann ich es nur in der Datenbankklasse zum Ausführen von Abfragen verwenden intern, oder? Sollte ich also alle diese Abfragen in die Datenbankklasse stellen? Ich denke, das ist schlecht, weil es in einem großen Projekt sehr groß werden wird...)</p> <p>Die zweite Änderung ist: </p> <p>Ändern Sie <code>$this->conn->prepare</code> in <code>$this->conn->prepare< Code>. Ich habe wirklich keine Ahnung davon. </p> <p>Ich meine, im Konstruktor von <code>user.php</code> habe ich einen <code>$this->conn = new Database()</code>, Since new Database das Verbindungsobjekt aus der DB-Klasse zurückgibt, weiß ich wirklich nicht, warum es ein zweites <code>conn-></code></p> geben muss.
P粉293550575P粉293550575423 Tage vor454

Antworte allen(1)Ich werde antworten

  • P粉451614834

    P粉4516148342023-08-25 11:13:39

    • 不要创建像Database这样的类,因为它没有什么用。如果它能为PDO添加一些额外的功能,那么创建一个数据库封装类是有意义的。但是考虑到它当前的代码,最好使用原始的PDO。
    • 从原始的PDO或者你的数据库类中创建一个单一的 $db 实例。
    • 将它作为构造函数参数传递给每个需要数据库连接的类。

    database.php:

    <?php
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $charset = 'utf8';
    
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $pdo = new \PDO($dsn, $user, $pass, $opt);

    user.php

    <?php
    class User {
        /* Properties */
        private $conn;
    
        /* Get database access */
        public function __construct(\PDO $pdo) {
            $this->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";
    }

    output:

    username_foo
    username_bar
    username_baz

    查看我的(唯一正确的)PDO教程以获取更多PDO的详细信息。

    Antwort
    0
  • StornierenAntwort