Cara menggunakan sambungan PDO dalam kelas lain
P粉293550575
P粉293550575 2023-08-24 15:10:58
0
1
489
<p>Saya rasa seperti saya menghadapi masalah memahami cara pengaturcaraan berorientasikan objek (OOP) berfungsi. Saya telah menukar kod supaya ia berfungsi, tetapi saya tidak fikir ia adalah cara yang betul. Berikut ialah senario (tidak, saya tidak mencipta log masuk pengguna sendiri, ini hanya untuk memahami OOP dengan lebih baik): </p> <p>Saya mempunyai fail pangkalan data.php:</p> <pre class="brush:php;toolbar:false;">class Pangkalan Data { /* Atribut */ persendirian $conn; persendirian $dsn = 'mysql:dbname=test;host=127.0.0.1'; peribadi $user = 'root'; $kata laluan peribadi = ''; /* Buat sambungan pangkalan data */ fungsi awam __construct() { cuba { $this->conn = new PDO($this->dsn, $this->user, $this->password); } tangkapan (PDOException $e) { cetak "Ralat!: " $e->getMessage() . mati(); } pulangkan $this->conn; } }</pre> <p>Jadi dalam kelas ini, saya mencipta sambungan pangkalan data dan mengembalikan sambungan (objek?)</p> <p>Kemudian saya mempunyai kelas kedua, kelas Pengguna yang terkenal (sebenarnya saya tidak menggunakan autoloading, tetapi saya tahu mengenainya): </p> <pre class="brush:php;toolbar:false;">include "database.php"; Pengguna kelas { /* Atribut */ persendirian $conn; /* Dapatkan akses pangkalan data */ fungsi awam __construct() { $this->conn = Pangkalan Data baharu(); } /* Pengguna log masuk */ log masuk fungsi awam () { $stmt = $this->conn->prepare("PILIH nama pengguna, mel pengguna DARI pengguna"); if($stmt->execute()) { while($rows = $stmt->fetch()) { $fetch[] = $rows; } pulangkan $fetch; } lain { kembali palsu; } } }</pre> <p>Ini adalah dua kelas saya. Seperti yang anda lihat, bukan masalah besar. Sekarang, jangan keliru dengan nama fungsi <kod>log masuk</kod> - sebenarnya, saya hanya cuba memilih beberapa nama pengguna dan mel pengguna daripada pangkalan data dan memaparkannya. Saya cuba mencapainya dengan: </p> <pre class="brush:php;toolbar:false;">$user = new User(); $list = $user->log masuk(); foreach($list as $test) { echo $test["nama pengguna"]; }</pre> <p>Ada masalah di sini. Apabila saya melaksanakan kod ini saya mendapat mesej ralat berikut: </p> <blockquote> <p>Ralat Tidak Ditangkap: Panggilan ke kaedah tidak ditentukan Pangkalan Data::prepare()</p> </blockquote> <p>Saya tidak pasti saya benar-benar memahami punca ralat ini.</p> <p><strong>Kod berfungsi dengan baik apabila saya menukar yang berikut: </strong></p> <p>Menukar <kod>$conn</code> dalam pangkalan data.php daripada persendirian kepada awam (saya rasa ini buruk...? Tetapi apabila ia peribadi, saya hanya boleh menggunakannya dalam kelas Pangkalan data melaksanakan pertanyaan secara dalaman, kan? Jadi patutkah saya meletakkan semua pertanyaan ini dalam kelas Pangkalan Data saya rasa ini tidak baik kerana dalam projek besar ia akan menjadi sangat besar...)</p> ; <p>Perubahan kedua ialah: </p> <p>Tukar <kod>$this->conn->sediakan</code> dalam fail user.php kepada <code>$this->conn->conn->sediakan< kod>. Saya benar-benar tidak tahu tentang ini. </p> <p>Maksud saya, dalam pembina <code>user.php</code>, saya mempunyai <code>$this->conn = new Database()</code>, Sejak Pangkalan Data baharu akan mengembalikan objek sambungan dari kelas DB, saya benar-benar tidak tahu mengapa mesti ada <code>conn-></code></p>
P粉293550575
P粉293550575

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

pangkalan data.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);

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

keluaran:

username_foo
username_bar
username_baz

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

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