Rumah > Soal Jawab > teks badan
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粉2682849302023-10-24 09:06:16
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. 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.