Operazioni sul Database
Panoramica
Sezione intitolata “Panoramica”XOOPS fornisce un livello di astrazione del database che supporta sia i modelli procedurali legacy che gli approcci orientati agli oggetti moderni. Questa guida copre le operazioni comuni del database per lo sviluppo di moduli.
Connessione al Database
Sezione intitolata “Connessione al Database”Ottenere l’Istanza del Database
Sezione intitolata “Ottenere l’Istanza del Database”// Legacy approachglobal $xoopsDB;
// Modern approach via helper$db = \XoopsDatabaseFactory::getDatabaseConnection();
// Via XMF helper$helper = \Xmf\Module\Helper::getHelper('mymodule');$db = $GLOBALS['xoopsDB'];Operazioni di Base
Sezione intitolata “Operazioni di Base”Query SELECT
Sezione intitolata “Query SELECT”// 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);Operazioni INSERT
Sezione intitolata “Operazioni INSERT”// 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();Operazioni UPDATE
Sezione intitolata “Operazioni UPDATE”$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();Operazioni DELETE
Sezione intitolata “Operazioni DELETE”$sql = sprintf( "DELETE FROM %s WHERE id = %d", $db->prefix('mymodule_items'), intval($id));$db->queryF($sql);Usando Criteria
Sezione intitolata “Usando Criteria”Il sistema Criteria fornisce un modo type-safe per costruire query:
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);Operatori Criteria
Sezione intitolata “Operatori Criteria”| Operatore | Descrizione |
|---|---|
= | Uguale (predefinito) |
!= | Non uguale |
< | Minore di |
> | Maggiore di |
<= | Minore o uguale a |
>= | Maggiore o uguale a |
LIKE | Pattern matching |
IN | In set di valori |
// 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, '<='));Handler di Oggetti
Sezione intitolata “Handler di Oggetti”Metodi Handler
Sezione intitolata “Metodi Handler”$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);Metodi Handler Personalizzati
Sezione intitolata “Metodi Handler Personalizzati”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); }}Transazioni
Sezione intitolata “Transazioni”// 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;}Prepared Statements (Moderno)
Sezione intitolata “Prepared Statements (Moderno)”// 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);Gestione dello Schema
Sezione intitolata “Gestione dello Schema”Creazione di Tabelle
Sezione intitolata “Creazione di Tabelle”-- 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;Migrazioni
Sezione intitolata “Migrazioni”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); }};Migliori Pratiche
Sezione intitolata “Migliori Pratiche”- Sempre Quotare le Stringhe - Usa
$db->quoteString()per l’input dell’utente - Usa Intval - Esegui il cast degli interi con
intval()o type declarations - Preferisci gli Handler - Usa handler di oggetti rispetto a SQL grezzo quando possibile
- Usa Criteria - Costruisci query con Criteria per type safety
- Gestisci gli Errori - Controlla i valori di ritorno e gestisci i fallimenti
- Usa Transazioni - Incapsula le operazioni correlate in transazioni
Documentazione Correlata
Sezione intitolata “Documentazione Correlata”- ../04-API-Reference/Kernel/Criteria - Query building con Criteria
- ../04-API-Reference/Core/XoopsObjectHandler - Pattern handler
- ../02-Core-Concepts/Database/Database-Layer - Astrazione del database
- Database/Database-Schema - Guida alla progettazione dello schema