Operasi Pangkalan Data
Gambaran Keseluruhan
Section titled “Gambaran Keseluruhan”XOOPS menyediakan lapisan abstraksi pangkalan data yang menyokong kedua-dua corak prosedur warisan dan pendekatan berorientasikan objek moden. Panduan ini merangkumi operasi pangkalan data biasa untuk pembangunan modul.
Sambungan Pangkalan Data
Section titled “Sambungan Pangkalan Data”Mendapatkan Contoh Pangkalan Data
Section titled “Mendapatkan Contoh Pangkalan Data”// Legacy approachglobal $xoopsDB;
// Modern approach via helper$db = \XoopsDatabaseFactory::getDatabaseConnection();
// Via XMF helper$helper = \Xmf\Module\Helper::getHelper('mymodule');$db = $GLOBALS['xoopsDB'];Operasi Asas
Section titled “Operasi Asas”SELECT Pertanyaan
Section titled “SELECT Pertanyaan”// Simple query$sql = "SELECT * FROM " . $db->prefix('mymodule_items') . " WHERE status = 1";$result = $db->query($sql);
while ($row = $db->fetchArray($result)) { echo $row['title'];}
// With parameters (safe approach)$sql = sprintf( "SELECT * FROM %s WHERE id = %d", $db->prefix('mymodule_items'), intval($id));
// Single row$sql = "SELECT * FROM " . $db->prefix('mymodule_items') . " WHERE id = " . intval($id);$result = $db->query($sql);$row = $db->fetchArray($result);INSERT Operasi
Section titled “INSERT Operasi”// Basic insert$sql = sprintf( "INSERT INTO %s (title, content, created) VALUES (%s, %s, %d)", $db->prefix('mymodule_items'), $db->quoteString($title), $db->quoteString($content), time());$db->queryF($sql);
// Get last insert ID$newId = $db->getInsertId();UPDATE Operasi
Section titled “UPDATE Operasi”$sql = sprintf( "UPDATE %s SET title = %s, updated = %d WHERE id = %d", $db->prefix('mymodule_items'), $db->quoteString($title), time(), intval($id));$db->queryF($sql);
// Check affected rows$affectedRows = $db->getAffectedRows();DELETE Operasi
Section titled “DELETE Operasi”$sql = sprintf( "DELETE FROM %s WHERE id = %d", $db->prefix('mymodule_items'), intval($id));$db->queryF($sql);Menggunakan Kriteria
Section titled “Menggunakan Kriteria”Sistem Kriteria menyediakan cara selamat jenis untuk membina pertanyaan:
use Criteria;use CriteriaCompo;
// Simple criteria$criteria = new Criteria('status', 1);$items = $itemHandler->getObjects($criteria);
// Compound criteria$criteria = new CriteriaCompo();$criteria->add(new Criteria('status', 1));$criteria->add(new Criteria('category_id', $categoryId));$criteria->setSort('created');$criteria->setOrder('DESC');$criteria->setLimit(10);$criteria->setStart($offset);
$items = $itemHandler->getObjects($criteria);$count = $itemHandler->getCount($criteria);Pengendali Kriteria
Section titled “Pengendali Kriteria”| Operator | Penerangan |
|---|---|
= | Sama (lalai) |
!= | Tidak sama |
< | Kurang daripada |
> | Lebih besar daripada |
<= | Kurang daripada atau sama |
>= | Lebih besar daripada atau sama |
LIKE | Padanan corak |
IN | Dalam set nilai |
// LIKE criteria$criteria = new Criteria('title', '%search%', 'LIKE');
// IN criteria$criteria = new Criteria('id', '(1,2,3)', 'IN');
// Date range$criteria = new CriteriaCompo();$criteria->add(new Criteria('created', $startDate, '>='));$criteria->add(new Criteria('created', $endDate, '<='));Pengendali Objek
Section titled “Pengendali Objek”Kaedah Pengendali
Section titled “Kaedah Pengendali”$handler = xoops_getModuleHandler('item', 'mymodule');
// Create new object$item = $handler->create();
// Get by ID$item = $handler->get($id);
// Get multiple$items = $handler->getObjects($criteria);
// Get as array$items = $handler->getAll($criteria);
// Count$count = $handler->getCount($criteria);
// Save$success = $handler->insert($item);
// Delete$success = $handler->delete($item);Kaedah Pengendali Tersuai
Section titled “Kaedah Pengendali Tersuai”class ItemHandler extends \XoopsPersistableObjectHandler{ public function getPublished(int $limit = 10): array { $criteria = new CriteriaCompo(); $criteria->add(new Criteria('status', 'published')); $criteria->setSort('publish_date'); $criteria->setOrder('DESC'); $criteria->setLimit($limit);
return $this->getObjects($criteria); }
public function getByCategory(int $categoryId): array { $criteria = new Criteria('category_id', $categoryId); return $this->getObjects($criteria); }}Transaksi
Section titled “Transaksi”// Begin transaction$db->query('START TRANSACTION');
try { // Perform multiple operations $db->queryF($sql1); $db->queryF($sql2); $db->queryF($sql3);
// Commit if all succeed $db->query('COMMIT');} catch (\Exception $e) { // Rollback on error $db->query('ROLLBACK'); throw $e;}Penyata Disediakan (Moden)
Section titled “Penyata Disediakan (Moden)”// Using PDO through XOOPS database layer$sql = "SELECT * FROM " . $db->prefix('mymodule_items') . " WHERE id = :id";$stmt = $db->prepare($sql);$stmt->execute(['id' => $id]);$row = $stmt->fetch(PDO::FETCH_ASSOC);Pengurusan Skema
Section titled “Pengurusan Skema”Mencipta Jadual
Section titled “Mencipta Jadual”-- sql/mysql.sqlCREATE TABLE `{PREFIX}_mymodule_items` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) NOT NULL, `content` TEXT, `status` ENUM('draft', 'published', 'archived') DEFAULT 'draft', `author_id` INT(11) UNSIGNED NOT NULL, `created` INT(11) UNSIGNED NOT NULL, `updated` INT(11) UNSIGNED DEFAULT NULL, PRIMARY KEY (`id`), INDEX `idx_status` (`status`), INDEX `idx_author` (`author_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;Penghijrahan
Section titled “Penghijrahan”return new class { public function up(\XoopsDatabase $db): void { $sql = "CREATE TABLE IF NOT EXISTS " . $db->prefix('mymodule_items') . " ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, created INT UNSIGNED NOT NULL )"; $db->queryF($sql); }
public function down(\XoopsDatabase $db): void { $sql = "DROP TABLE IF EXISTS " . $db->prefix('mymodule_items'); $db->queryF($sql); }};Amalan Terbaik
Section titled “Amalan Terbaik”- Sentiasa Petikan Rentetan - Gunakan
$db->quoteString()untuk input pengguna - Gunakan Intval - Cast integer dengan
intval()atau taip pengisytiharan - Prefer Handler - Gunakan pengendali objek berbanding mentah SQL apabila boleh
- Kriteria Penggunaan - Bina pertanyaan dengan Kriteria untuk keselamatan jenis
- Kendalikan Ralat - Semak nilai pulangan dan kendalikan kegagalan
- Gunakan Transaksi - Balut operasi berkaitan dalam urus niaga
Dokumentasi Berkaitan
Section titled “Dokumentasi Berkaitan”- ../04-API-Reference/Kernel/Criteria - Bangunan pertanyaan dengan Kriteria
- ../04-API-Reference/Core/XoopsObjectHandler - Corak pengendali
- ../02-Core-Concepts/Database/Database-Layer - Abstraksi pangkalan data
- Database/Database-Schema - Panduan reka bentuk skema