XoopsDatabase Klasse
Die XoopsDatabase Klasse bietet eine Datenbankabstraktionsschicht für XOOPS, die Verbindungsverwaltung, Abfrageausführung, Ergebnisverarbeitung und Fehlerbehandlung handhabt. Sie unterstützt mehrere Datenbanktreiber durch eine Treiberarchitektur.
Klassenübersicht
Abschnitt betitelt „Klassenübersicht“namespace Xoops\Database;
abstract class XoopsDatabase{ protected $conn; protected $prefix; protected $logger;
abstract public function connect(bool $selectdb = true): bool; abstract public function query(string $sql, int $limit = 0, int $start = 0); abstract public function fetchArray($result): ?array; abstract public function fetchObject($result): ?object; abstract public function getRowsNum($result): int; abstract public function getAffectedRows(): int; abstract public function getInsertId(): int; abstract public function escape(string $string): string;}Klassenhierarchie
Abschnitt betitelt „Klassenhierarchie“XoopsDatabase (Abstrakte Basis)├── XoopsMySQLDatabase (MySQL-Erweiterung)│ └── XoopsMySQLDatabaseProxy (Sicherheits-Proxy)└── XoopsMySQLiDatabase (MySQLi-Erweiterung) └── XoopsMySQLiDatabaseProxy (Sicherheits-Proxy)
XoopsDatabaseFactory└── Erstellt geeignete TreiberinstanzenDatenbankinstanz abrufen
Abschnitt betitelt „Datenbankinstanz abrufen“Factory verwenden
Abschnitt betitelt „Factory verwenden“// Empfohlen: Factory verwenden$db = XoopsDatabaseFactory::getDatabaseConnection();getInstance verwenden
Abschnitt betitelt „getInstance verwenden“// Alternative: Direkter Singleton-Zugriff$db = XoopsDatabase::getInstance();Globale Variable
Abschnitt betitelt „Globale Variable“// Legacy: Globale Variable verwendenglobal $xoopsDB;Kern-Methoden
Abschnitt betitelt „Kern-Methoden“connect
Abschnitt betitelt „connect“Erstellt eine Datenbankverbindung.
abstract public function connect(bool $selectdb = true): boolParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$selectdb | bool | Ob Datenbank ausgewählt werden soll |
Rückgabewert: bool - True bei erfolgreichem Verbindungsaufbau
Beispiel:
$db = XoopsDatabaseFactory::getDatabaseConnection();if ($db->connect()) { echo "Connected successfully";}Führt eine SQL-Abfrage aus.
abstract public function query( string $sql, int $limit = 0, int $start = 0): mixedParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$sql | string | SQL-Abfragestring |
$limit | int | Maximale Zeilen zum Zurückgeben (0 = keine Begrenzung) |
$start | int | Start-Offset |
Rückgabewert: resource|bool - Ergebnis-Ressource oder false bei Fehler
Beispiel:
$db = XoopsDatabaseFactory::getDatabaseConnection();
// Einfache Abfrage$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid > 0";$result = $db->query($sql);
// Abfrage mit Begrenzung$sql = "SELECT * FROM " . $db->prefix('users');$result = $db->query($sql, 10, 0); // Erste 10 Zeilen
// Abfrage mit Offset$result = $db->query($sql, 10, 20); // 10 Zeilen ab Zeile 20Führt eine Abfrage aus und erzwingt die Operation (umgeht Sicherheitsprüfungen).
public function queryF(string $sql, int $limit = 0, int $start = 0): mixedAnwendungsfälle:
- INSERT, UPDATE, DELETE Operationen
- Wenn Sie Read-Only-Einschränkungen umgehen müssen
Beispiel:
$sql = sprintf( "UPDATE %s SET views = views + 1 WHERE article_id = %d", $db->prefix('articles'), $articleId);$db->queryF($sql);Stellt dem Tabellennam das Datenbankpräfix voran.
public function prefix(string $table = ''): stringParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$table | string | Tabellenname ohne Präfix |
Rückgabewert: string - Tabellenname mit Präfix
Beispiel:
$db = XoopsDatabaseFactory::getDatabaseConnection();
echo $db->prefix('users'); // "xoops_users" (wenn Präfix "xoops_")echo $db->prefix('modules'); // "xoops_modules"echo $db->prefix(); // "xoops_" (nur das Präfix)fetchArray
Abschnitt betitelt „fetchArray“Holt eine Ergebniszeile als assoziatives Array.
abstract public function fetchArray($result): ?arrayParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$result | resource | Abfrageergebnis-Ressource |
Rückgabewert: array|null - Assoziatives Array oder null wenn keine weiteren Zeilen
Beispiel:
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";$result = $db->query($sql);
while ($row = $db->fetchArray($result)) { echo "User: " . $row['uname'] . "\n"; echo "Email: " . $row['email'] . "\n";}fetchObject
Abschnitt betitelt „fetchObject“Holt eine Ergebniszeile als Objekt.
abstract public function fetchObject($result): ?objectParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$result | resource | Abfrageergebnis-Ressource |
Rückgabewert: object|null - Objekt mit Eigenschaften für jede Spalte
Beispiel:
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid = 1";$result = $db->query($sql);
if ($user = $db->fetchObject($result)) { echo "Username: " . $user->uname; echo "Email: " . $user->email;}fetchRow
Abschnitt betitelt „fetchRow“Holt eine Ergebniszeile als numerisches Array.
abstract public function fetchRow($result): ?arrayBeispiel:
$sql = "SELECT uname, email FROM " . $db->prefix('users');$result = $db->query($sql);
while ($row = $db->fetchRow($result)) { echo "Username: " . $row[0] . ", Email: " . $row[1];}fetchBoth
Abschnitt betitelt „fetchBoth“Holt eine Ergebniszeile als assoziatives und numerisches Array.
abstract public function fetchBoth($result): ?arrayBeispiel:
$result = $db->query($sql);$row = $db->fetchBoth($result);echo $row['uname']; // Nach Nameecho $row[0]; // Nach IndexgetRowsNum
Abschnitt betitelt „getRowsNum“Holt die Anzahl der Zeilen in einem Ergebniset.
abstract public function getRowsNum($result): intParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$result | resource | Abfrageergebnis-Ressource |
Rückgabewert: int - Anzahl der Zeilen
Beispiel:
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";$result = $db->query($sql);$count = $db->getRowsNum($result);echo "Found $count active users";getAffectedRows
Abschnitt betitelt „getAffectedRows“Holt die Anzahl der von der letzten Abfrage betroffenen Zeilen.
abstract public function getAffectedRows(): intRückgabewert: int - Anzahl der betroffenen Zeilen
Beispiel:
$sql = "UPDATE " . $db->prefix('users') . " SET last_login = " . time() . " WHERE uid = 1";$db->queryF($sql);$affected = $db->getAffectedRows();echo "Updated $affected rows";getInsertId
Abschnitt betitelt „getInsertId“Holt die Auto-generierte ID vom letzten INSERT.
abstract public function getInsertId(): intRückgabewert: int - Letzte Insert-ID
Beispiel:
$sql = sprintf( "INSERT INTO %s (title, content) VALUES (%s, %s)", $db->prefix('articles'), $db->quoteString($title), $db->quoteString($content));$db->queryF($sql);$newId = $db->getInsertId();echo "Created article with ID: $newId";Escaped einen String für sichere Verwendung in SQL-Abfragen.
abstract public function escape(string $string): stringParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$string | string | Zu escapender String |
Rückgabewert: string - Escapedter String (ohne Anführungszeichen)
Beispiel:
$unsafeInput = "O'Reilly";$safe = $db->escape($unsafeInput); // "O\'Reilly"
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uname = '" . $safe . "'";quoteString
Abschnitt betitelt „quoteString“Escaped und quoted einen String für SQL.
public function quoteString(string $string): stringParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$string | string | Zu quotender String |
Rückgabewert: string - Escapedter und quotierter String
Beispiel:
$name = "John O'Connor";$quoted = $db->quoteString($name); // "'John O\'Connor'"
$sql = "INSERT INTO users (name) VALUES (" . $quoted . ")";freeRecordSet
Abschnitt betitelt „freeRecordSet“Gibt dem Ergebnis zugeordneten Speicher frei.
abstract public function freeRecordSet($result): voidBeispiel:
$result = $db->query($sql);// Ergebnisse verarbeiten...$db->freeRecordSet($result); // Speicher freigebenFehlerbehandlung
Abschnitt betitelt „Fehlerbehandlung“Holt die letzte Fehlermeldung.
abstract public function error(): stringBeispiel:
$result = $db->query($sql);if (!$result) { echo "Database error: " . $db->error();}Holt die letzte Fehlernummer.
abstract public function errno(): intBeispiel:
$result = $db->query($sql);if (!$result) { echo "Error #" . $db->errno() . ": " . $db->error();}Best Practices
Abschnitt betitelt „Best Practices“Sicherheit
Abschnitt betitelt „Sicherheit“- Benutzereingabe immer escapen:
$safe = $db->escape($_POST['input']);- Prepared Statements verwenden wenn verfügbar:
$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param('i', $id);- quoteString für Werte verwenden:
$sql = "INSERT INTO table (name) VALUES (" . $db->quoteString($name) . ")";Leistung
Abschnitt betitelt „Leistung“- Immer LIMIT für große Tabellen verwenden:
$result = $db->query($sql, 100); // Ergebnisse begrenzen- Ergebnis-Sets freigeben wenn fertig:
$db->freeRecordSet($result);-
Geeignete Indizes verwenden in Ihre Tabledefinitionen
-
Handler statt Roh-SQL bevorzugen wenn möglich
Fehlerbehandlung
Abschnitt betitelt „Fehlerbehandlung“- Immer auf Fehler überprüfen:
$result = $db->query($sql);if (!$result) { trigger_error($db->error(), E_USER_WARNING);}- Transaktionen für mehrere verwandte Operationen verwenden:
$db->beginTransaction();// ... Operationen ...$db->commit(); // oder $db->rollback();Zugehörige Dokumentation
Abschnitt betitelt „Zugehörige Dokumentation“- Criteria - Abfragekriterien-System
- QueryBuilder - Fließender Abfragebau
- ../Core/XoopsObjectHandler - Objektpersistenz
Siehe auch: XOOPS Source Code