Databaseoperationer
Oversigt
Sektion kaldt “Oversigt”XOOPS giver et databaseabstraktionslag, der understøtter både ældre proceduremønstre og moderne objektorienterede tilgange. Denne vejledning dækker almindelige databaseoperationer til moduludvikling.
Databaseforbindelse
Sektion kaldt “Databaseforbindelse”Henter databaseforekomsten
Sektion kaldt “Henter databaseforekomsten”// Legacy approachglobal $xoopsDB;
// Modern approach via helper$db = \XoopsDatabaseFactory::getDatabaseConnection();
// Via XMF helper$helper = \Xmf\Module\Helper::getHelper('mymodule');$db = $GLOBALS['xoopsDB'];Grundlæggende handlinger
Sektion kaldt “Grundlæggende handlinger”SELECT Forespørgsler
Sektion kaldt “SELECT Forespørgsler”// 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 Operationer
Sektion kaldt “INSERT Operationer”// 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 Operationer
Sektion kaldt “UPDATE Operationer”$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 Operationer
Sektion kaldt “DELETE Operationer”$sql = sprintf( "DELETE FROM %s WHERE id = %d", $db->prefix('mymodule_items'), intval($id));$db->queryF($sql);Brug af kriterier
Sektion kaldt “Brug af kriterier”Kriteriesystemet giver en typesikker måde at bygge forespørgsler på:
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);Kriterier Operatører
Sektion kaldt “Kriterier Operatører”| Operatør | Beskrivelse |
|---|---|
= | Lige (standard) |
!= | Ikke lige |
< | Mindre end |
> | Større end |
<= | Mindre end eller lig med |
>= | Større end eller lig med |
LIKE | Mønstertilpasning |
IN | I værdisæt |
// 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, '<='));Objektbehandlere
Sektion kaldt “Objektbehandlere”Håndteringsmetoder
Sektion kaldt “Håndteringsmetoder”$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);Brugerdefinerede håndteringsmetoder
Sektion kaldt “Brugerdefinerede håndteringsmetoder”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); }}Transaktioner
Sektion kaldt “Transaktioner”// 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;}Forberedte erklæringer (moderne)
Sektion kaldt “Forberedte erklæringer (moderne)”// 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);Skemastyring
Sektion kaldt “Skemastyring”Oprettelse af tabeller
Sektion kaldt “Oprettelse af tabeller”-- 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;Migrationer
Sektion kaldt “Migrationer”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); }};Bedste praksis
Sektion kaldt “Bedste praksis”- Always Quote Strings - Brug
$db->quoteString()til brugerinput - Brug intervall - Cast heltal med
intval()eller typeerklæringer - Foretrukne behandlere - Brug objektbehandlere frem for rå SQL, når det er muligt
- Brug kriterier - Byg forespørgsler med kriterier for typesikkerhed
- Håndteringsfejl - Tjek returværdier og håndter fejl
- Brug transaktioner - Indpak relaterede operationer i transaktioner
Relateret dokumentation
Sektion kaldt “Relateret dokumentation”- ../04-API-Reference/Kernel/Criteria - Forespørgselsbygning med kriterier
- ../04-API-Reference/Core/XoopsObjectHandler - Håndtermønster
- ../02-Core-Concepts/Database/Database-Layer - Databaseabstraktion
- Database/Database-Schema - Skema design guide