Klasa XoopsDatabase
Klasa XoopsDatabase zapewnia warstwę abstrakcji bazy danych dla XOOPS, obsługując zarządzanie połączeniami, wykonywanie zapytań, przetwarzanie wyników i obsługę błędów. Obsługuje wiele sterowników baz danych poprzez architekturę sterownika.
Przegląd Klasy
Dział zatytułowany „Przegląd Klasy”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;}Hierarchia Klas
Dział zatytułowany „Hierarchia Klas”XoopsDatabase (Klasa Bazowa Abstrakcyjna)├── XoopsMySQLDatabase (Rozszerzenie MySQL)│ └── XoopsMySQLDatabaseProxy (Proxy Bezpieczeństwa)└── XoopsMySQLiDatabase (Rozszerzenie MySQLi) └── XoopsMySQLiDatabaseProxy (Proxy Bezpieczeństwa)
XoopsDatabaseFactory└── Tworzy odpowiednie instancje sterownikówPobieranie Instancji Bazy Danych
Dział zatytułowany „Pobieranie Instancji Bazy Danych”Używanie Fabryki
Dział zatytułowany „Używanie Fabryki”// Zalecane: Użyj fabryki$db = XoopsDatabaseFactory::getDatabaseConnection();Używanie getInstance
Dział zatytułowany „Używanie getInstance”// Alternatywa: Bezpośredni dostęp singleton$db = XoopsDatabase::getInstance();Zmienna Globalna
Dział zatytułowany „Zmienna Globalna”// Starsze: Użyj zmiennej globalnejglobal $xoopsDB;Metody Podstawowe
Dział zatytułowany „Metody Podstawowe”connect
Dział zatytułowany „connect”Nawiązuje połączenie z bazą danych.
abstract public function connect(bool $selectdb = true): boolParametry:
| Parametr | Typ | Opis |
|---|---|---|
$selectdb | bool | Czy wybrać bazę danych |
Zwraca: bool - True przy pomyślnym połączeniu
Przykład:
$db = XoopsDatabaseFactory::getDatabaseConnection();if ($db->connect()) { echo "Connected successfully";}Wykonuje zapytanie SQL.
abstract public function query( string $sql, int $limit = 0, int $start = 0): mixedParametry:
| Parametr | Typ | Opis |
|---|---|---|
$sql | string | Ciąg zapytania SQL |
$limit | int | Maksymalna liczba wierszy do zwrócenia (0 = brak limitu) |
$start | int | Przesunięcie początkowe |
Zwraca: resource|bool - Zasób wyniku lub false w przypadku niepowodzenia
Przykład:
$db = XoopsDatabaseFactory::getDatabaseConnection();
// Proste zapytanie$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid > 0";$result = $db->query($sql);
// Zapytanie z limitem$sql = "SELECT * FROM " . $db->prefix('users');$result = $db->query($sql, 10, 0); // Pierwsze 10 wierszy
// Zapytanie z przesunięciem$result = $db->query($sql, 10, 20); // 10 wierszy poczynając od wiersza 20Wykonuje zapytanie wymuszające operację (obchodzi kontrole bezpieczeństwa).
public function queryF(string $sql, int $limit = 0, int $start = 0): mixedPrzypadki Użycia:
- Operacje INSERT, UPDATE, DELETE
- Gdy musisz ominąć ograniczenia tylko do odczytu
Przykład:
$sql = sprintf( "UPDATE %s SET views = views + 1 WHERE article_id = %d", $db->prefix('articles'), $articleId);$db->queryF($sql);Poprzedza prefiks tabeli bazy danych.
public function prefix(string $table = ''): stringParametry:
| Parametr | Typ | Opis |
|---|---|---|
$table | string | Nazwa tabeli bez prefiksu |
Zwraca: string - Nazwa tabeli z prefiksem
Przykład:
$db = XoopsDatabaseFactory::getDatabaseConnection();
echo $db->prefix('users'); // "xoops_users" (jeśli prefiks to "xoops_")echo $db->prefix('modules'); // "xoops_modules"echo $db->prefix(); // "xoops_" (tylko prefiks)fetchArray
Dział zatytułowany „fetchArray”Pobiera wiersz wyniku jako tablicę asocjacyjną.
abstract public function fetchArray($result): ?arrayParametry:
| Parametr | Typ | Opis |
|---|---|---|
$result | resource | Zasób wyniku zapytania |
Zwraca: array|null - Tablica asocjacyjna lub null jeśli brak więcej wierszy
Przykład:
$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
Dział zatytułowany „fetchObject”Pobiera wiersz wyniku jako obiekt.
abstract public function fetchObject($result): ?objectParametry:
| Parametr | Typ | Opis |
|---|---|---|
$result | resource | Zasób wyniku zapytania |
Zwraca: object|null - Obiekt z właściwościami dla każdej kolumny
Przykład:
$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
Dział zatytułowany „fetchRow”Pobiera wiersz wyniku jako tablicę liczbową.
abstract public function fetchRow($result): ?arrayPrzykład:
$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
Dział zatytułowany „fetchBoth”Pobiera wiersz wyniku jako tablicę asocjacyjną i liczbową.
abstract public function fetchBoth($result): ?arrayPrzykład:
$result = $db->query($sql);$row = $db->fetchBoth($result);echo $row['uname']; // Po nazwieecho $row[0]; // Po indeksiegetRowsNum
Dział zatytułowany „getRowsNum”Pobiera liczbę wierszy w zestawie wyników.
abstract public function getRowsNum($result): intParametry:
| Parametr | Typ | Opis |
|---|---|---|
$result | resource | Zasób wyniku zapytania |
Zwraca: int - Liczba wierszy
Przykład:
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";$result = $db->query($sql);$count = $db->getRowsNum($result);echo "Found $count active users";getAffectedRows
Dział zatytułowany „getAffectedRows”Pobiera liczbę dotkniętych wierszy z ostatniego zapytania.
abstract public function getAffectedRows(): intZwraca: int - Liczba dotkniętych wierszy
Przykład:
$sql = "UPDATE " . $db->prefix('users') . " SET last_login = " . time() . " WHERE uid = 1";$db->queryF($sql);$affected = $db->getAffectedRows();echo "Updated $affected rows";getInsertId
Dział zatytułowany „getInsertId”Pobiera automatycznie wygenerowane ID z ostatniego INSERT.
abstract public function getInsertId(): intZwraca: int - ID ostatniego wstawienia
Przykład:
$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";Ucieka od ciągu na potrzeby bezpiecznego użycia w zapytaniach SQL.
abstract public function escape(string $string): stringParametry:
| Parametr | Typ | Opis |
|---|---|---|
$string | string | Ciąg do ucieczki |
Zwraca: string - Ciąg ucieczki (bez cudzysłowów)
Przykład:
$unsafeInput = "O'Reilly";$safe = $db->escape($unsafeInput); // "O\'Reilly"
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uname = '" . $safe . "'";quoteString
Dział zatytułowany „quoteString”Ucieka i cytuje ciąg dla SQL.
public function quoteString(string $string): stringParametry:
| Parametr | Typ | Opis |
|---|---|---|
$string | string | Ciąg do cytowania |
Zwraca: string - Ciąg z ucieczką i cytowany
Przykład:
$name = "John O'Connor";$quoted = $db->quoteString($name); // "'John O\'Connor'"
$sql = "INSERT INTO users (name) VALUES (" . $quoted . ")";freeRecordSet
Dział zatytułowany „freeRecordSet”Zwalnia pamięć powiązaną z wynikiem.
abstract public function freeRecordSet($result): voidPrzykład:
$result = $db->query($sql);// Przetwarzaj wyniki...$db->freeRecordSet($result); // Zwolnij pamięćObsługa Błędów
Dział zatytułowany „Obsługa Błędów”Pobiera ostatnią wiadomość błędu.
abstract public function error(): stringPrzykład:
$result = $db->query($sql);if (!$result) { echo "Database error: " . $db->error();}Pobiera ostatni numer błędu.
abstract public function errno(): intPrzykład:
$result = $db->query($sql);if (!$result) { echo "Error #" . $db->errno() . ": " . $db->error();}Przygotowane Instrukcje (MySQLi)
Dział zatytułowany „Przygotowane Instrukcje (MySQLi)”Sterownik MySQLi obsługuje przygotowane instrukcje w celu zwiększenia bezpieczeństwa.
prepare
Dział zatytułowany „prepare”Tworzy przygotowaną instrukcję.
public function prepare(string $sql): mysqli_stmt|falsePrzykład:
$db = XoopsDatabaseFactory::getDatabaseConnection();
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid = ?";$stmt = $db->prepare($sql);
$stmt->bind_param('i', $userId);$userId = 5;$stmt->execute();$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { echo $row['uname'];}$stmt->close();Przygotowana Instrukcja z Wieloma Parametrami
Dział zatytułowany „Przygotowana Instrukcja z Wieloma Parametrami”$sql = "INSERT INTO " . $db->prefix('articles') . " (title, content, author_id) VALUES (?, ?, ?)";$stmt = $db->prepare($sql);
$stmt->bind_param('ssi', $title, $content, $authorId);
$title = "My Article";$content = "Article content here";$authorId = 1;
if ($stmt->execute()) { echo "Article created with ID: " . $stmt->insert_id;}
$stmt->close();Obsługa Transakcji
Dział zatytułowany „Obsługa Transakcji”beginTransaction
Dział zatytułowany „beginTransaction”Rozpoczyna transakcję.
public function beginTransaction(): boolZatwierdza bieżącą transakcję.
public function commit(): boolrollback
Dział zatytułowany „rollback”Wycofuje bieżącą transakcję.
public function rollback(): boolPrzykład:
$db = XoopsDatabaseFactory::getDatabaseConnection();
try { $db->beginTransaction();
// Wiele operacji $sql1 = "UPDATE " . $db->prefix('accounts') . " SET balance = balance - 100 WHERE id = 1"; $db->queryF($sql1);
$sql2 = "UPDATE " . $db->prefix('accounts') . " SET balance = balance + 100 WHERE id = 2"; $db->queryF($sql2);
// Sprawdź błędy if ($db->errno()) { throw new Exception($db->error()); }
$db->commit(); echo "Transaction completed";
} catch (Exception $e) { $db->rollback(); echo "Transaction failed: " . $e->getMessage();}Kompletne Przykłady Użycia
Dział zatytułowany „Kompletne Przykłady Użycia”Podstawowe Operacje CRUD
Dział zatytułowany „Podstawowe Operacje CRUD”$db = XoopsDatabaseFactory::getDatabaseConnection();
// UTWÓRZ$sql = sprintf( "INSERT INTO %s (title, content, created) VALUES (%s, %s, %d)", $db->prefix('articles'), $db->quoteString('New Article'), $db->quoteString('Article content'), time());$db->queryF($sql);$articleId = $db->getInsertId();
// CZYTAJ$sql = "SELECT * FROM " . $db->prefix('articles') . " WHERE id = " . (int)$articleId;$result = $db->query($sql);$article = $db->fetchArray($result);
// AKTUALIZUJ$sql = sprintf( "UPDATE %s SET title = %s, updated = %d WHERE id = %d", $db->prefix('articles'), $db->quoteString('Updated Title'), time(), $articleId);$db->queryF($sql);
// USUŃ$sql = "DELETE FROM " . $db->prefix('articles') . " WHERE id = " . (int)$articleId;$db->queryF($sql);Zapytanie o Paginację
Dział zatytułowany „Zapytanie o Paginację”function getArticles(int $page = 1, int $perPage = 10): array{ $db = XoopsDatabaseFactory::getDatabaseConnection(); $start = ($page - 1) * $perPage;
// Pobierz całkowitą liczbę $sql = "SELECT COUNT(*) as total FROM " . $db->prefix('articles') . " WHERE published = 1"; $result = $db->query($sql); $row = $db->fetchArray($result); $total = $row['total'];
// Pobierz stronę wyników $sql = "SELECT * FROM " . $db->prefix('articles') . " WHERE published = 1 ORDER BY created DESC"; $result = $db->query($sql, $perPage, $start);
$articles = []; while ($row = $db->fetchArray($result)) { $articles[] = $row; }
return [ 'articles' => $articles, 'total' => $total, 'pages' => ceil($total / $perPage), 'current' => $page ];}Zapytanie Wyszukiwania z LIKE
Dział zatytułowany „Zapytanie Wyszukiwania z LIKE”function searchArticles(string $keyword): array{ $db = XoopsDatabaseFactory::getDatabaseConnection();
$keyword = $db->escape($keyword); $sql = "SELECT * FROM " . $db->prefix('articles') . " WHERE title LIKE '%" . $keyword . "%'" . " OR content LIKE '%" . $keyword . "%'" . " ORDER BY created DESC";
$result = $db->query($sql, 50); // Ogranicz do 50 wyników
$articles = []; while ($row = $db->fetchArray($result)) { $articles[] = $row; }
return $articles;}Zapytanie Join
Dział zatytułowany „Zapytanie Join”function getArticlesWithAuthors(): array{ $db = XoopsDatabaseFactory::getDatabaseConnection();
$sql = "SELECT a.*, u.uname as author_name, u.email as author_email FROM " . $db->prefix('articles') . " a LEFT JOIN " . $db->prefix('users') . " u ON a.author_id = u.uid WHERE a.published = 1 ORDER BY a.created DESC";
$result = $db->query($sql, 20);
$articles = []; while ($row = $db->fetchArray($result)) { $articles[] = $row; }
return $articles;}Klasa SqlUtility
Dział zatytułowany „Klasa SqlUtility”Klasa pomocnicza do operacji na plikach SQL.
splitMySqlFile
Dział zatytułowany „splitMySqlFile”Dzieli plik SQL na pojedyncze zapytania.
public static function splitMySqlFile(string $content): arrayPrzykład:
$sqlContent = file_get_contents('install.sql');$queries = SqlUtility::splitMySqlFile($sqlContent);
foreach ($queries as $query) { $db->queryF($query); if ($db->errno()) { echo "Error executing: " . $query . "\n"; echo "Error: " . $db->error() . "\n"; }}prefixQuery
Dział zatytułowany „prefixQuery”Zastępuje symbole zastępcze tabeli prefabrykowanymi nazwami tabel.
public static function prefixQuery(string $sql, string $prefix): stringPrzykład:
$sql = "CREATE TABLE {PREFIX}_articles (id INT PRIMARY KEY)";$prefixedSql = SqlUtility::prefixQuery($sql, $db->prefix());// "CREATE TABLE xoops_articles (id INT PRIMARY KEY)"Najlepsze Praktyki
Dział zatytułowany „Najlepsze Praktyki”Bezpieczeństwo
Dział zatytułowany „Bezpieczeństwo”- Zawsze uciekaj od danych wejścia użytkownika:
$safe = $db->escape($_POST['input']);- Używaj przygotowanych instrukcji gdy jest dostępne:
$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param('i', $id);- Używaj quoteString dla wartości:
$sql = "INSERT INTO table (name) VALUES (" . $db->quoteString($name) . ")";Wydajność
Dział zatytułowany „Wydajność”- Zawsze używaj LIMIT dla dużych tabel:
$result = $db->query($sql, 100); // Ogranicz wyniki- Zwolnij zestawy wyników gdy gotowe:
$db->freeRecordSet($result);-
Używaj odpowiednich indeksów w definicjach tabeli
-
Wolności handlery nad surowym SQL gdy to możliwe
Obsługa Błędów
Dział zatytułowany „Obsługa Błędów”- Zawsze sprawdzaj błędy:
$result = $db->query($sql);if (!$result) { trigger_error($db->error(), E_USER_WARNING);}- Używaj transakcji dla wielu powiązanych operacji:
$db->beginTransaction();// ... operacje ...$db->commit(); // lub $db->rollback();Powiązana Dokumentacja
Dział zatytułowany „Powiązana Dokumentacja”- Criteria - System kryteriów zapytań
- QueryBuilder - Fluent budowanie zapytań
- ../Core/XoopsObjectHandler - Trwałość obiektu
Patrz też: Kod Źródłowy XOOPS