דלגו לתוכן

תפעול מסד נתונים

XOOPS מספקת שכבת הפשטה של מסד נתונים התומכת הן בתבניות פרוצדורליות מדור קודם והן בגישות מודרניות מונחה עצמים. מדריך זה מכסה פעולות נפוצות של מסד נתונים לפיתוח מודול.

// Legacy approach
global $xoopsDB;
// Modern approach via helper
$db = \XoopsDatabaseFactory::getDatabaseConnection();
// Via XMF helper
$helper = \Xmf\Module\Helper::getHelper('mymodule');
$db = $GLOBALS['xoopsDB'];
// 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);
// 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();
$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();
$sql = sprintf(
"DELETE FROM %s WHERE id = %d",
$db->prefix('mymodule_items'),
intval($id)
);
$db->queryF($sql);

מערכת הקריטריונים מספקת דרך בטוחה לפי סוג לבניית שאילתות:

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);
מפעילתיאור
=שווה (ברירת מחדל)
!=לא שווה
<פחות מ
>גדול מ
<=פחות או שווה
>=גדול או שווה
LIKEהתאמת דפוסים
INבקבוצת ערכים
// 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 = 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);

שיטות מטפל מותאמות אישית

Section titled “שיטות מטפל מותאמות אישית”
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);
}
}
// 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;
}
// 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);
-- sql/mysql.sql
CREATE 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;
migrations/001_create_items.php
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);
}
};
  1. תמיד לצטט מחרוזות - השתמש ב-$db->quoteString() לקלט משתמש
  2. השתמש ב-Intval - מספרים שלמים Cast עם intval() או הצהרות סוג
  3. העדפת מטפלים - השתמש במטפלי אובייקטים על פני SQL גולמי כאשר אפשר
  4. השתמש בקריטריונים - צור שאילתות עם קריטריונים לבטיחות סוג
  5. טיפול בשגיאות - בדוק ערכי החזר וטפל בכשלים
  6. השתמש בעסקאות - עטוף פעולות הקשורות בעסקאות
  • ../04-API-Reference/Kernel/Criteria - בניין שאילתות עם קריטריונים
  • ../04-API-Reference/Core/XoopsObjectHandler - תבנית מטפל
  • ../02-Core-Concepts/Database/Database-Layer - הפשטת מסד נתונים
  • Database/Database-Schema - מדריך עיצוב סכימה