Bagaimana untuk menggunakan sambungan PDO dalam kelas lain?
P粉548512637
P粉548512637 2023-10-23 09:37:51
0
1
702

Saya rasa saya menghadapi masalah memahami cara OOP berfungsi. Saya telah menukar kod supaya ia berfungsi, tetapi ia bukan cara yang betul saya fikir. Senario berikut (tidak, saya tidak mencipta log masuk pengguna sendiri, ini hanya untuk pembangun tempatan memahami OOP dengan lebih baik):

Saya mempunyai fail pangkalan data.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;
    }
}

Jadi dalam kelas ini saya mencipta sambungan pangkalan data dan mengembalikan sambungan itu(objek?)

Kemudian saya mempunyai kelas kedua, kelas Pengguna yang terkenal (sebenarnya saya tidak menggunakan autoloading, tetapi saya tahu mengenainya):

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;
        }
    }
}

Ini adalah dua kursus saya. Seperti yang anda lihat, bukan masalah besar. Sekarang, jangan keliru dengan nama fungsi login - sebenarnya saya hanya cuba memilih beberapa nama pengguna dan mel pengguna daripada pangkalan data dan memaparkannya. Saya cuba mencapai ini dengan:

$user = new User();
$list = $user->login();

foreach($list as $test) {
    echo $test["username"];
}

Inilah masalahnya. Apabila saya melaksanakan kod ini saya mendapat mesej ralat berikut:

Ralat Tidak Ditangkap: Panggilan ke kaedah yang tidak ditentukan Pangkalan Data::prepare()

Dan saya tidak pasti saya benar-benar faham apa yang menyebabkan ralat ini.

Kod berfungsi dengan baik apabila saya menukar perkara berikut:

Tukar $conn dalam pangkalan data.php kepada awam dan bukannya persendirian (saya rasa ini buruk...? Tetapi apabila peribadi saya hanya boleh melakukan pertanyaan di dalam kelas pangkalan data, betulkah saya? Jadi saya harus meletakkan semua pertanyaan ini dalam pangkalan data kelas? Saya rasa ini teruk kerana dalam projek besar ia akan menjadi sangat besar..)

Perubahan kedua yang saya ingin lakukan ialah: Tukar $this->conn->prepare修改为$this->conn->conn->prepare dalam fail user.php. Di sini saya benar-benar tidak tahu mengapa.

Maksud saya, dalam user.php 的构造函数中,我有一个 $this->conn = new Database() ,并且由于 new Database 将从 DB 类返回我的连接对象,我真的不知道为什么必须有第二个 conn->

P粉548512637
P粉548512637

membalas semua(1)
P粉268284930
  • Jangan buat kelas seperti Database kelas kerana ia tidak berguna. Adalah masuk akal untuk mencipta pembungkus pangkalan data jika ia menambahkan beberapa fungsi tambahan kepada PDO. Tetapi memandangkan kod semasanya, lebih baik menggunakan PDO biasa.
  • Cipta tunggal $db contoh daripada PDO atau kelas pangkalan data biasa.
  • Lepaskannya sebagai parameter pembina kepada setiap kelas yang memerlukan sambungan pangkalan data

pangkalan data.php:

 \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new \PDO($dsn, $user, $pass, $opt);

pengguna.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";
}

Keluaran:

username_foo
username_bar
username_baz

Lihat saya (satu-satunya yang betul) tutorial PDO untuk maklumat lanjut PDO.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan