इसे छोड़कर कंटेंट पर जाएं

डेटाबेस परत

2.5.x ✅ 4.0.x ✅

XOOPS डेटाबेस एब्स्ट्रैक्शन, ऑब्जेक्ट दृढ़ता और क्वेरी बिल्डिंग को समझना।

:::टिप[अपने डेटा एक्सेस को भविष्य में सुरक्षित रखें] हैंडलर/Criteria पैटर्न दोनों संस्करणों में काम करता है। XOOPS 4.0 की तैयारी के लिए, बेहतर परीक्षण क्षमता के लिए हैंडलर को रिपॉजिटरी क्लासेस में लपेटने पर विचार करें। डेटा एक्सेस पैटर्न चुनना देखें। :::


XOOPS डेटाबेस परत MySQL/MariaDB पर एक मजबूत अमूर्तता प्रदान करती है, जिसमें शामिल हैं:

  • फ़ैक्टरी पैटर्न - केंद्रीकृत डेटाबेस कनेक्शन प्रबंधन
  • ऑब्जेक्ट-रिलेशनल मैपिंग - XoopsObject और हैंडलर
  • क्वेरी बिल्डिंग - जटिल प्रश्नों के लिए Criteria सिस्टम
  • कनेक्शन का पुन: उपयोग - सिंगलटन फैक्ट्री के माध्यम से एकल कनेक्शन (पूलिंग नहीं)

flowchart TB
subgraph App["📱 Application Code"]
AppCode["Your Module Code"]
end
subgraph Handler["🔧 XoopsPersistableObjectHandler"]
HandlerMethods["create() | get() | insert() | delete()<br/>getObjects() | getCount() | deleteAll()"]
end
subgraph Object["📦 XoopsObject"]
ObjectMethods["initVar() | getVar() | setVar() | toArray()"]
end
subgraph Criteria["🔍 Criteria System"]
CriteriaMethods["Criteria | CriteriaCompo | CriteriaElement"]
end
subgraph Database["🗄️ XoopsDatabase"]
DatabaseMethods["query() | queryF() | fetchArray() | insert()"]
end
subgraph Storage["💾 MySQL / MariaDB"]
DB[(Database)]
end
App --> Handler
Handler --> Object
Object --> Criteria
Criteria --> Database
Database --> Storage
style App fill:#e3f2fd,stroke:#1976d2
style Handler fill:#e8f5e9,stroke:#388e3c
style Object fill:#fff3e0,stroke:#f57c00
style Criteria fill:#f3e5f5,stroke:#7b1fa2
style Database fill:#fce4ec,stroke:#c2185b
style Storage fill:#eceff1,stroke:#546e7a

🔌 डेटाबेस कनेक्शन

Section titled “🔌 डेटाबेस कनेक्शन”

कनेक्शन प्राप्त करना

Section titled “कनेक्शन प्राप्त करना”
// Recommended: Use the global database instance
$db = \XoopsDatabaseFactory::getDatabaseConnection();
// Legacy: Global variable (still works)
global $xoopsDB;

फ़ैक्टरी पैटर्न सुनिश्चित करता है कि एकल डेटाबेस कनेक्शन का पुन: उपयोग किया जाए:

<?php
class XoopsDatabaseFactory
{
private static ?XoopsDatabase $instance = null;
public static function getDatabaseConnection(): XoopsDatabase
{
if (self::$instance === null) {
self::$instance = new XoopsMySQLDatabase();
}
return self::$instance;
}
}

XOOPS में सभी डेटा ऑब्जेक्ट के लिए बेस क्लास।

किसी वस्तु को परिभाषित करना

Section titled “किसी वस्तु को परिभाषित करना”
<?php
namespace XoopsModules\MyModule;
class Article extends \XoopsObject
{
public function __construct()
{
$this->initVar('article_id', \XOBJ_DTYPE_INT, null, false);
$this->initVar('category_id', \XOBJ_DTYPE_INT, 0, true);
$this->initVar('title', \XOBJ_DTYPE_TXTBOX, '', true, 255);
$this->initVar('content', \XOBJ_DTYPE_TXTAREA, '', false);
$this->initVar('author_id', \XOBJ_DTYPE_INT, 0, true);
$this->initVar('status', \XOBJ_DTYPE_TXTBOX, 'draft', true, 20);
$this->initVar('views', \XOBJ_DTYPE_INT, 0, false);
$this->initVar('created', \XOBJ_DTYPE_INT, time(), false);
$this->initVar('updated', \XOBJ_DTYPE_INT, 0, false);
}
}
लगातारप्रकारविवरण
XOBJ_DTYPE_INTपूर्णांकसंख्यात्मक मान
XOBJ_DTYPE_TXTBOXस्ट्रिंगलघु पाठ (<255 वर्ण)
XOBJ_DTYPE_TXTAREAपाठलंबी पाठ्य सामग्री
XOBJ_DTYPE_EMAILईमेलईमेल पते
XOBJ_DTYPE_URLURLवेब पते
XOBJ_DTYPE_FLOATतैरनादशमलव संख्या
XOBJ_DTYPE_ARRAYसारणीक्रमबद्ध सरणियाँ
XOBJ_DTYPE_OTHERमिश्रितकच्चा डेटा

वस्तुओं के साथ कार्य करना

Section titled “वस्तुओं के साथ कार्य करना”
// Create new object
$article = new Article();
// Set values
$article->setVar('title', 'My Article');
$article->setVar('content', 'Article content here...');
$article->setVar('category_id', 5);
$article->setVar('author_id', $xoopsUser->getVar('uid'));
// Get values
$title = $article->getVar('title'); // Raw value
$titleDisplay = $article->getVar('title', 'e'); // For editing (HTML entities)
$titleShow = $article->getVar('title', 's'); // For display (sanitized)
// Bulk assign from array
$article->assignVars([
'title' => 'New Title',
'status' => 'published'
]);
// Convert to array
$data = $article->toArray();

🔧 ऑब्जेक्ट हैंडलर

Section titled “🔧 ऑब्जेक्ट हैंडलर”

हैंडलर वर्ग XoopsObject उदाहरणों के लिए CRUD संचालन का प्रबंधन करता है।

<?php
namespace XoopsModules\MyModule;
class ArticleHandler extends \XoopsPersistableObjectHandler
{
public function __construct(\XoopsDatabase $db = null)
{
parent::__construct(
$db,
'mymodule_articles', // Table name
Article::class, // Object class
'article_id', // Primary key
'title' // Identifier field
);
}
}
// Get handler instance
$articleHandler = xoops_getModuleHandler('article', 'mymodule');
// Create new object
$article = $articleHandler->create();
// Get by ID
$article = $articleHandler->get(123);
// Insert (create or update)
$success = $articleHandler->insert($article);
// Delete
$success = $articleHandler->delete($article);
// Get multiple objects
$articles = $articleHandler->getObjects($criteria);
// Get count
$count = $articleHandler->getCount($criteria);
// Get as array (key => value)
$list = $articleHandler->getList($criteria);
// Delete multiple
$deleted = $articleHandler->deleteAll($criteria);

कस्टम हैंडलर तरीके

Section titled “कस्टम हैंडलर तरीके”
<?php
namespace XoopsModules\MyModule;
class ArticleHandler extends \XoopsPersistableObjectHandler
{
// ... constructor
/**
* Get published articles
*/
public function getPublished(int $limit = 10, int $start = 0): array
{
$criteria = new \CriteriaCompo();
$criteria->add(new \Criteria('status', 'published'));
$criteria->setSort('created');
$criteria->setOrder('DESC');
$criteria->setLimit($limit);
$criteria->setStart($start);
return $this->getObjects($criteria);
}
/**
* Get articles by category
*/
public function getByCategory(int $categoryId, int $limit = 10): array
{
$criteria = new \CriteriaCompo();
$criteria->add(new \Criteria('category_id', $categoryId));
$criteria->add(new \Criteria('status', 'published'));
$criteria->setSort('created');
$criteria->setOrder('DESC');
$criteria->setLimit($limit);
return $this->getObjects($criteria);
}
/**
* Get articles by author
*/
public function getByAuthor(int $authorId): array
{
$criteria = new \Criteria('author_id', $authorId);
return $this->getObjects($criteria);
}
/**
* Increment view count
*/
public function incrementViews(int $articleId): bool
{
$sql = sprintf(
'UPDATE %s SET views = views + 1 WHERE article_id = %d',
$this->table,
$articleId
);
return $this->db->queryF($sql) !== false;
}
/**
* Get popular articles
*/
public function getPopular(int $limit = 5): array
{
$criteria = new \CriteriaCompo();
$criteria->add(new \Criteria('status', 'published'));
$criteria->setSort('views');
$criteria->setOrder('DESC');
$criteria->setLimit($limit);
return $this->getObjects($criteria);
}
}

Criteria सिस्टम SQL WHERE क्लॉज़ बनाने के लिए एक शक्तिशाली, ऑब्जेक्ट-ओरिएंटेड तरीका प्रदान करता है।

// Simple equality
$criteria = new \Criteria('status', 'published');
// With operator
$criteria = new \Criteria('views', 100, '>=');
// Column comparison
$criteria = new \Criteria('updated', 'created', '>');

CriteriaCompo (संयोजन Criteria)

Section titled “CriteriaCompo (संयोजन Criteria)”
$criteria = new \CriteriaCompo();
// AND conditions (default)
$criteria->add(new \Criteria('status', 'published'));
$criteria->add(new \Criteria('category_id', 5));
// OR conditions
$criteria->add(new \Criteria('featured', 1), 'OR');
// Nested conditions
$subCriteria = new \CriteriaCompo();
$subCriteria->add(new \Criteria('author_id', 1));
$subCriteria->add(new \Criteria('author_id', 2), 'OR');
$criteria->add($subCriteria);

सॉर्टिंग और पेजिनेशन

Section titled “सॉर्टिंग और पेजिनेशन”
$criteria = new \CriteriaCompo();
$criteria->add(new \Criteria('status', 'published'));
// Sorting
$criteria->setSort('created');
$criteria->setOrder('DESC');
// Multiple sort fields
$criteria->setSort('category_id, created');
$criteria->setOrder('ASC, DESC');
// Pagination
$criteria->setLimit(10); // Items per page
$criteria->setStart(20); // Offset
// Group by
$criteria->setGroupby('category_id');
ऑपरेटरउदाहरणSQL आउटपुट
=new Criteria('status', 'published')status = 'published'
!=new Criteria('status', 'draft', '!=')status != 'draft'
>new Criteria('views', 100, '>')views > 100
>=new Criteria('views', 100, '>=')views >= 100
<new Criteria('views', 100, '<')views < 100
<=new Criteria('views', 100, '<=')views <= 100
LIKEnew Criteria('title', '%php%', 'LIKE')title LIKE '%php%'
NOT LIKEnew Criteria('title', '%test%', 'NOT LIKE')title NOT LIKE '%test%'
INnew Criteria('id', '(1,2,3)', 'IN')id IN (1,2,3)
NOT INnew Criteria('id', '(1,2,3)', 'NOT IN')id NOT IN (1,2,3)
// Find published articles in specific categories,
// with search term in title, sorted by views
$criteria = new \CriteriaCompo();
// Status must be published
$criteria->add(new \Criteria('status', 'published'));
// In categories 1, 2, or 3
$criteria->add(new \Criteria('category_id', '(1, 2, 3)', 'IN'));
// Title contains search term
$searchTerm = '%' . $db->escape($searchQuery) . '%';
$criteria->add(new \Criteria('title', $searchTerm, 'LIKE'));
// Created in last 30 days
$thirtyDaysAgo = time() - (30 * 24 * 60 * 60);
$criteria->add(new \Criteria('created', $thirtyDaysAgo, '>='));
// Sort by views descending
$criteria->setSort('views');
$criteria->setOrder('DESC');
// Paginate
$criteria->setLimit(10);
$criteria->setStart($page * 10);
$articles = $articleHandler->getObjects($criteria);
$totalCount = $articleHandler->getCount($criteria);

📝 प्रत्यक्ष प्रश्न

Section titled “📝 प्रत्यक्ष प्रश्न”

Criteria के साथ संभव नहीं होने वाले जटिल प्रश्नों के लिए, सीधे SQL का उपयोग करें।

सुरक्षित प्रश्न (पढ़ें)

Section titled “सुरक्षित प्रश्न (पढ़ें)”
$db = \XoopsDatabaseFactory::getDatabaseConnection();
$sql = sprintf(
'SELECT a.*, c.category_name
FROM %s a
LEFT JOIN %s c ON a.category_id = c.category_id
WHERE a.status = %s
ORDER BY a.created DESC
LIMIT %d',
$db->prefix('mymodule_articles'),
$db->prefix('mymodule_categories'),
$db->quoteString('published'),
10
);
$result = $db->query($sql);
while ($row = $db->fetchArray($result)) {
// Process row
echo $row['title'];
}
// Insert
$sql = sprintf(
"INSERT INTO %s (title, content, created) VALUES (%s, %s, %d)",
$db->prefix('mymodule_articles'),
$db->quoteString($title),
$db->quoteString($content),
time()
);
$db->queryF($sql);
$newId = $db->getInsertId();
// Update
$sql = sprintf(
"UPDATE %s SET views = views + 1 WHERE article_id = %d",
$db->prefix('mymodule_articles'),
$articleId
);
$db->queryF($sql);
$affectedRows = $db->getAffectedRows();
// Delete
$sql = sprintf(
"DELETE FROM %s WHERE article_id = %d",
$db->prefix('mymodule_articles'),
$articleId
);
$db->queryF($sql);
// String escaping
$safeString = $db->quoteString($userInput);
// or
$safeString = $db->escape($userInput);
// Integer (no escaping needed, just cast)
$safeInt = (int) $userInput;

⚠️ सुरक्षा सर्वोत्तम अभ्यास

Section titled “⚠️ सुरक्षा सर्वोत्तम अभ्यास”

उपयोगकर्ता इनपुट से हमेशा बचें

Section titled “उपयोगकर्ता इनपुट से हमेशा बचें”
// NEVER do this
$sql = "SELECT * FROM articles WHERE title = '$_GET[title]'"; // SQL Injection!
// DO this
$title = $db->escape($_GET['title']);
$sql = "SELECT * FROM articles WHERE title = '$title'";
// Or better, use Criteria
$criteria = new \Criteria('title', $db->escape($_GET['title']));

पैरामीटरयुक्त क्वेरीज़ (XMF) का उपयोग करें

Section titled “पैरामीटरयुक्त क्वेरीज़ (XMF) का उपयोग करें”
use Xmf\Database\TableLoad;
// Safe bulk insert
$tableLoad = new TableLoad('mymodule_articles');
$tableLoad->insert([
['title' => 'Article 1', 'content' => 'Content 1'],
['title' => 'Article 2', 'content' => 'Content 2'],
]);

इनपुट प्रकार मान्य करें

Section titled “इनपुट प्रकार मान्य करें”
use Xmf\Request;
$id = Request::getInt('id', 0, 'GET');
$title = Request::getString('title', '', 'POST');

📊 डेटाबेस स्कीमा उदाहरण

Section titled “📊 डेटाबेस स्कीमा उदाहरण”
-- sql/mysql.sql
CREATE TABLE `{PREFIX}_mymodule_articles` (
`article_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`category_id` INT(11) UNSIGNED NOT NULL DEFAULT 0,
`title` VARCHAR(255) NOT NULL DEFAULT '',
`content` TEXT,
`author_id` INT(11) UNSIGNED NOT NULL DEFAULT 0,
`status` VARCHAR(20) NOT NULL DEFAULT 'draft',
`views` INT(11) UNSIGNED NOT NULL DEFAULT 0,
`created` INT(11) UNSIGNED NOT NULL DEFAULT 0,
`updated` INT(11) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`article_id`),
KEY `category_id` (`category_id`),
KEY `author_id` (`author_id`),
KEY `status` (`status`),
KEY `created` (`created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

🔗संबंधित दस्तावेज

Section titled “🔗संबंधित दस्तावेज”

#xoops #डेटाबेस #orm #मानदंड #हैंडलर #mysql