Kelas XoopsDatabase
Kelas XoopsDatabase menyediakan lapisan abstraksi pangkalan data untuk XOOPS, pengendalian pengurusan sambungan, pelaksanaan pertanyaan, pemprosesan hasil dan pengendalian ralat. Ia menyokong berbilang pemacu pangkalan data melalui seni bina pemacu.## Gambaran Keseluruhan Kelas
phpnamespace XOOPS\Database;
abstract class XoopsDatabase{ protected $conn; protected $prefix; protected $logger;
abstract public function connect(bool $selectdb = true): bool; abstract public function query(string $sql, int $limit = 0, int $start = 0); abstract public function fetchArray($result): ?array; abstract public function fetchObject($result): ?object; abstract public function getRowsNum($result): int; abstract public function getAffectedRows(): int; abstract public function getInsertId(): int; abstract public function escape(string $string): string;}Hierarki Kelas
Section titled “Hierarki Kelas”XoopsDatabase (Abstract Base)├── XoopsMySQLDatabase (MySQL Extension)│ └── XoopsMySQLDatabaseProxy (Security Proxy)└── XoopsMySQLiDatabase (MySQLi Extension) └── XoopsMySQLiDatabaseProxy (Security Proxy)
XoopsDatabaseFactory└── Creates appropriate driver instancesMendapatkan Contoh Pangkalan Data### Menggunakan Kilang
Section titled “Mendapatkan Contoh Pangkalan Data### Menggunakan Kilang”php// Recommended: Use the factory$db = XoopsDatabaseFactory::getDatabaseConnection();Menggunakan getInstance
Section titled “Menggunakan getInstance”php// Alternative: Direct singleton access$db = XoopsDatabase::getInstance();Pembolehubah Global
Section titled “Pembolehubah Global”php// Legacy: Use global variableglobal $xoopsDB;Kaedah Teras### sambungMewujudkan sambungan pangkalan data.
Section titled “Kaedah Teras### sambungMewujudkan sambungan pangkalan data.”phpabstract public function connect(bool $selectdb = true): boolParameter:| Parameter | Taip | Penerangan |
|-----------|------|-------------|
| $selectdb | bool | Sama ada hendak memilih pangkalan data |Pemulangan: bool - Benar pada sambungan yang berjayaContoh:
php$db = XoopsDatabaseFactory::getDatabaseConnection();if ($db->connect()) { echo "Connected successfully";}pertanyaanMelaksanakan pertanyaan SQL.
Section titled “pertanyaanMelaksanakan pertanyaan SQL.”phpabstract public function query( string $sql, int $limit = 0, int $start = 0): mixedParameter:| Parameter | Taip | Penerangan |
|-----------|------|-------------|
| $sql | rentetan | Rentetan pertanyaan SQL |
| $limit | int | Baris maksimum untuk dikembalikan (0 = tiada had) |
| $start | int | Memulakan offset |Pemulangan: resource|bool - Sumber hasil atau palsu apabila gagalContoh:
php$db = XoopsDatabaseFactory::getDatabaseConnection();
// Simple query$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid > 0";$result = $db->query($sql);
// Query with limit$sql = "SELECT * FROM " . $db->prefix('users');$result = $db->query($sql, 10, 0); // First 10 rows
// Query with offset$result = $db->query($sql, 10, 20); // 10 rows starting at row 20pertanyaanFMelaksanakan pertanyaan memaksa operasi (memintas pemeriksaan keselamatan).
Section titled “pertanyaanFMelaksanakan pertanyaan memaksa operasi (memintas pemeriksaan keselamatan).”phppublic function queryF(string $sql, int $limit = 0, int $start = 0): mixedKes Penggunaan:
- Operasi INSERT, UPDATE, DELETE
- Apabila anda perlu memintas sekatan baca sahajaContoh:
php$sql = sprintf( "UPDATE %s SET views = views + 1 WHERE article_id = %d", $db->prefix('articles'), $articleId);$db->queryF($sql);awalanMenandakan awalan jadual pangkalan data.
Section titled “awalanMenandakan awalan jadual pangkalan data.”phppublic function prefix(string $table = ''): stringParameter:| Parameter | Taip | Penerangan |
|-----------|------|-------------|
| $table | rentetan | Nama jadual tanpa awalan |Pemulangan: string - Nama jadual dengan awalanContoh:
php$db = XoopsDatabaseFactory::getDatabaseConnection();
echo $db->prefix('users'); // "xoops_users" (if prefix is "xoops_")echo $db->prefix('modules'); // "xoops_modules"echo $db->prefix(); // "xoops_" (just the prefix)fetchArrayMengambil baris hasil sebagai tatasusunan bersekutu.
Section titled “fetchArrayMengambil baris hasil sebagai tatasusunan bersekutu.”phpabstract public function fetchArray($result): ?arrayParameter:| Parameter | Taip | Penerangan |
|-----------|------|-------------|
| $result | sumber | Sumber hasil pertanyaan |Pemulangan: array|null - Tatasusunan bersekutu atau null jika tiada lagi barisContoh:
php$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";$result = $db->query($sql);
while ($row = $db->fetchArray($result)) { echo "User: " . $row['uname'] . "\n"; echo "Email: " . $row['email'] . "\n";}fetchObjectMengambil baris hasil sebagai objek.
Section titled “fetchObjectMengambil baris hasil sebagai objek.”phpabstract public function fetchObject($result): ?objectParameter:| Parameter | Taip | Penerangan |
|-----------|------|-------------|
| $result | sumber | Sumber hasil pertanyaan |Pemulangan: object|null - Objek dengan sifat untuk setiap lajurContoh:
php$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid = 1";$result = $db->query($sql);
if ($user = $db->fetchObject($result)) { echo "Username: " . $user->uname; echo "Email: " . $user->email;}fetchRowMengambil baris hasil sebagai tatasusunan angka.
Section titled “fetchRowMengambil baris hasil sebagai tatasusunan angka.”phpabstract public function fetchRow($result): ?arrayContoh:
php$sql = "SELECT uname, email FROM " . $db->prefix('users');$result = $db->query($sql);
while ($row = $db->fetchRow($result)) { echo "Username: " . $row[0] . ", Email: " . $row[1];}ambil KeduanyaMengambil baris hasil sebagai tatasusunan bersekutu dan berangka.
Section titled “ambil KeduanyaMengambil baris hasil sebagai tatasusunan bersekutu dan berangka.”phpabstract public function fetchBoth($result): ?arrayContoh:
php$result = $db->query($sql);$row = $db->fetchBoth($result);echo $row['uname']; // By nameecho $row[0]; // By indexgetRowsNumMendapat bilangan baris dalam set hasil.
Section titled “getRowsNumMendapat bilangan baris dalam set hasil.”phpabstract public function getRowsNum($result): intParameter:| Parameter | Taip | Penerangan |
|-----------|------|-------------|
| $result | sumber | Sumber hasil pertanyaan |Pemulangan: int - Bilangan barisContoh:
php$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";$result = $db->query($sql);$count = $db->getRowsNum($result);echo "Found $count active users";getAffectedRowsMendapat bilangan baris yang terjejas daripada pertanyaan terakhir.
Section titled “getAffectedRowsMendapat bilangan baris yang terjejas daripada pertanyaan terakhir.”phpabstract public function getAffectedRows(): intPemulangan: int - Bilangan baris yang terjejasContoh:
php$sql = "UPDATE " . $db->prefix('users') . " SET last_login = " . time() . " WHERE uid = 1";$db->queryF($sql);$affected = $db->getAffectedRows();echo "Updated $affected rows";getInsertIdMendapat ID yang dijana secara automatik daripada INSERT yang terakhir.
Section titled “getInsertIdMendapat ID yang dijana secara automatik daripada INSERT yang terakhir.”phpabstract public function getInsertId(): intPemulangan: int - ID sisipan terakhirContoh:
php$sql = sprintf( "INSERT INTO %s (title, content) VALUES (%s, %s)", $db->prefix('articles'), $db->quoteString($title), $db->quoteString($content));$db->queryF($sql);$newId = $db->getInsertId();echo "Created article with ID: $newId";melarikan diriMelarikan diri daripada rentetan untuk kegunaan selamat dalam pertanyaan SQL.
Section titled “melarikan diriMelarikan diri daripada rentetan untuk kegunaan selamat dalam pertanyaan SQL.”phpabstract public function escape(string $string): stringParameter:| Parameter | Taip | Penerangan |
|-----------|------|-------------|
| $string | rentetan | Rentetan untuk melarikan diri |Pemulangan: string - Rentetan terlepas (tanpa petikan)Contoh:
php$unsafeInput = "O'Reilly";$safe = $db->escape($unsafeInput); // "O\'Reilly"
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uname = '" . $safe . "'";quoteStringMelarikan diri dan memetik rentetan untuk SQL.
Section titled “quoteStringMelarikan diri dan memetik rentetan untuk SQL.”phppublic function quoteString(string $string): stringParameter:| Parameter | Taip | Penerangan |
|-----------|------|-------------|
| $string | rentetan | Rentetan untuk dipetik |Pemulangan: string - Rentetan yang dilepaskan dan dipetikContoh:
php$name = "John O'Connor";$quoted = $db->quoteString($name); // "'John O\'Connor'"
$sql = "INSERT INTO users (name) VALUES (" . $quoted . ")";SetRekod percumaMembebaskan ingatan yang dikaitkan dengan hasil.
Section titled “SetRekod percumaMembebaskan ingatan yang dikaitkan dengan hasil.”phpabstract public function freeRecordSet($result): voidContoh:
php$result = $db->query($sql);// Process results...$db->freeRecordSet($result); // Free memoryPengendalian Ralat### ralatMendapat mesej ralat terakhir.
Section titled “Pengendalian Ralat### ralatMendapat mesej ralat terakhir.”phpabstract public function error(): stringContoh:
php$result = $db->query($sql);if (!$result) { echo "Database error: " . $db->error();}errnoMendapat nombor ralat terakhir.
Section titled “errnoMendapat nombor ralat terakhir.”phpabstract public function errno(): intContoh:
php$result = $db->query($sql);if (!$result) { echo "Error #" . $db->errno() . ": " . $db->error();}Penyata Disediakan (MySQLi)Pemacu MySQLi menyokong pernyataan yang disediakan untuk keselamatan yang dipertingkatkan.### sediakanMencipta pernyataan yang disediakan.
Section titled “Penyata Disediakan (MySQLi)Pemacu MySQLi menyokong pernyataan yang disediakan untuk keselamatan yang dipertingkatkan.### sediakanMencipta pernyataan yang disediakan.”phppublic function prepare(string $sql): mysqli_stmt|falseContoh:
php$db = XoopsDatabaseFactory::getDatabaseConnection();
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid = ?";$stmt = $db->prepare($sql);
$stmt->bind_param('i', $userId);$userId = 5;$stmt->execute();$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { echo $row['uname'];}$stmt->close();Penyata Disediakan dengan Pelbagai Parameter
Section titled “Penyata Disediakan dengan Pelbagai Parameter”php$sql = "INSERT INTO " . $db->prefix('articles') . " (title, content, author_id) VALUES (?, ?, ?)";$stmt = $db->prepare($sql);
$stmt->bind_param('ssi', $title, $content, $authorId);
$title = "My Article";$content = "Article content here";$authorId = 1;
if ($stmt->execute()) { echo "Article created with ID: " . $stmt->insert_id;}
$stmt->close();Sokongan Transaksi### mulakan TransaksiMemulakan transaksi.
Section titled “Sokongan Transaksi### mulakan TransaksiMemulakan transaksi.”phppublic function beginTransaction(): boolkomitedMelakukan transaksi semasa.
Section titled “komitedMelakukan transaksi semasa.”phppublic function commit(): boolgulung balikMenggulung semula urus niaga semasa.
Section titled “gulung balikMenggulung semula urus niaga semasa.”phppublic function rollback(): boolContoh:
php$db = XoopsDatabaseFactory::getDatabaseConnection();
try { $db->beginTransaction();
// Multiple operations $sql1 = "UPDATE " . $db->prefix('accounts') . " SET balance = balance - 100 WHERE id = 1"; $db->queryF($sql1);
$sql2 = "UPDATE " . $db->prefix('accounts') . " SET balance = balance + 100 WHERE id = 2"; $db->queryF($sql2);
// Check for errors if ($db->errno()) { throw new Exception($db->error()); }
$db->commit(); echo "Transaction completed";
} catch (Exception $e) { $db->rollback(); echo "Transaction failed: " . $e->getMessage();}Contoh Penggunaan Lengkap### Operasi Asas CRUD
Section titled “Contoh Penggunaan Lengkap### Operasi Asas CRUD”php$db = XoopsDatabaseFactory::getDatabaseConnection();
// CREATE$sql = sprintf( "INSERT INTO %s (title, content, created) VALUES (%s, %s, %d)", $db->prefix('articles'), $db->quoteString('New Article'), $db->quoteString('Article content'), time());$db->queryF($sql);$articleId = $db->getInsertId();
// READ$sql = "SELECT * FROM " . $db->prefix('articles') . " WHERE id = " . (int)$articleId;$result = $db->query($sql);$article = $db->fetchArray($result);
// UPDATE$sql = sprintf( "UPDATE %s SET title = %s, updated = %d WHERE id = %d", $db->prefix('articles'), $db->quoteString('Updated Title'), time(), $articleId);$db->queryF($sql);
// DELETE$sql = "DELETE FROM " . $db->prefix('articles') . " WHERE id = " . (int)$articleId;$db->queryF($sql);Pertanyaan Penomboran
Section titled “Pertanyaan Penomboran”phpfunction getArticles(int $page = 1, int $perPage = 10): array{ $db = XoopsDatabaseFactory::getDatabaseConnection(); $start = ($page - 1) * $perPage;
// Get total count $sql = "SELECT COUNT(*) as total FROM " . $db->prefix('articles') . " WHERE published = 1"; $result = $db->query($sql); $row = $db->fetchArray($result); $total = $row['total'];
// Get page of results $sql = "SELECT * FROM " . $db->prefix('articles') . " WHERE published = 1 ORDER BY created DESC"; $result = $db->query($sql, $perPage, $start);
$articles = []; while ($row = $db->fetchArray($result)) { $articles[] = $row; }
return [ 'articles' => $articles, 'total' => $total, 'pages' => ceil($total / $perPage), 'current' => $page ];}Pertanyaan Carian dengan LIKE
Section titled “Pertanyaan Carian dengan LIKE”phpfunction searchArticles(string $keyword): array{ $db = XoopsDatabaseFactory::getDatabaseConnection();
$keyword = $db->escape($keyword); $sql = "SELECT * FROM " . $db->prefix('articles') . " WHERE title LIKE '%" . $keyword . "%'" . " OR content LIKE '%" . $keyword . "%'" . " ORDER BY created DESC";
$result = $db->query($sql, 50); // Limit to 50 results
$articles = []; while ($row = $db->fetchArray($result)) { $articles[] = $row; }
return $articles;}Sertai Pertanyaan
Section titled “Sertai Pertanyaan”phpfunction getArticlesWithAuthors(): array{ $db = XoopsDatabaseFactory::getDatabaseConnection();
$sql = "SELECT a.*, u.uname as author_name, u.email as author_email FROM " . $db->prefix('articles') . " a LEFT JOIN " . $db->prefix('users') . " u ON a.author_id = u.uid WHERE a.published = 1 ORDER BY a.created DESC";
$result = $db->query($sql, 20);
$articles = []; while ($row = $db->fetchArray($result)) { $articles[] = $row; }
return $articles;}Kelas SqlUtilityKelas pembantu untuk operasi fail SQL.### splitMySqlFileMembahagikan fail SQL kepada pertanyaan individu.
Section titled “Kelas SqlUtilityKelas pembantu untuk operasi fail SQL.### splitMySqlFileMembahagikan fail SQL kepada pertanyaan individu.”phppublic static function splitMySqlFile(string $content): arrayContoh:
php$sqlContent = file_get_contents('install.sql');$queries = SqlUtility::splitMySqlFile($sqlContent);
foreach ($queries as $query) { $db->queryF($query); if ($db->errno()) { echo "Error executing: " . $query . "\n"; echo "Error: " . $db->error() . "\n"; }}prefixQueryMenggantikan ruang letak jadual dengan nama jadual awalan.
Section titled “prefixQueryMenggantikan ruang letak jadual dengan nama jadual awalan.”phppublic static function prefixQuery(string $sql, string $prefix): stringContoh:
php$sql = "CREATE TABLE {PREFIX}_articles (id INT PRIMARY KEY)";$prefixedSql = SqlUtility::prefixQuery($sql, $db->prefix());// "CREATE TABLE xoops_articles (id INT PRIMARY KEY)"Amalan Terbaik### Keselamatan1. Sentiasa melarikan diri dari input pengguna:
Section titled “Amalan Terbaik### Keselamatan1. Sentiasa melarikan diri dari input pengguna:”php$safe = $db->escape($_POST['input']);- Gunakan pernyataan yang disediakan apabila tersedia:
php$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param('i', $id);- Gunakan quoteString untuk nilai:
php$sql = "INSERT INTO table (name) VALUES (" . $db->quoteString($name) . ")";Prestasi1. Sentiasa gunakan LIMIT untuk meja besar:
Section titled “Prestasi1. Sentiasa gunakan LIMIT untuk meja besar:”php$result = $db->query($sql, 100); // Limit results- Set keputusan percuma apabila selesai:
php$db->freeRecordSet($result);- Gunakan indeks yang sesuai dalam takrif jadual anda4. Meutamakan pengendali daripada SQL mentah apabila boleh### Pengendalian Ralat1. Sentiasa semak ralat:
php$result = $db->query($sql);if (!$result) { trigger_error($db->error(), E_USER_WARNING);}- Gunakan transaksi untuk berbilang operasi berkaitan:
php$db->beginTransaction();// ... operations ...$db->commit(); // or $db->rollback();Dokumentasi Berkaitan- Kriteria - Sistem kriteria pertanyaan
Section titled “Dokumentasi Berkaitan- Kriteria - Sistem kriteria pertanyaan”- QueryBuilder - Pembinaan pertanyaan yang lancar
- ../Core/XoopsObjectHandler - Kegigihan objek---
Lihat juga: XOOPS Kod Sumber