Classe XoopsDatabase
A classe XoopsDatabase fornece uma camada de abstração de banco de dados para XOOPS, manipulando gerenciamento de conexão, execução de consultas, processamento de resultados e tratamento de erros. Suporta múltiplos drivers de banco de dados através de uma arquitetura de driver.
Visão Geral da Classe
Seção intitulada “Visão Geral da Classe”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;}Hierarquia de Classe
Seção intitulada “Hierarquia de Classe”XoopsDatabase (Classe Base Abstrata)├── XoopsMySQLDatabase (Extensão MySQL)│ └── XoopsMySQLDatabaseProxy (Proxy de Segurança)└── XoopsMySQLiDatabase (Extensão MySQLi) └── XoopsMySQLiDatabaseProxy (Proxy de Segurança)
XoopsDatabaseFactory└── Cria instâncias de driver apropriadasObtendo uma Instância de Banco de Dados
Seção intitulada “Obtendo uma Instância de Banco de Dados”Usando a Factory
Seção intitulada “Usando a Factory”// Recomendado: Use a factory$db = XoopsDatabaseFactory::getDatabaseConnection();Usando getInstance
Seção intitulada “Usando getInstance”// Alternativa: Acesso singleton direto$db = XoopsDatabase::getInstance();Variável Global
Seção intitulada “Variável Global”// Legado: Use variável globalglobal $xoopsDB;Métodos Principais
Seção intitulada “Métodos Principais”connect
Seção intitulada “connect”Estabelece uma conexão com banco de dados.
abstract public function connect(bool $selectdb = true): boolParâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
$selectdb | bool | Se deve selecionar o banco de dados |
Retorna: bool - Verdadeiro em conexão bem-sucedida
Exemplo:
$db = XoopsDatabaseFactory::getDatabaseConnection();if ($db->connect()) { echo "Conectado com sucesso";}Executa uma consulta SQL.
abstract public function query( string $sql, int $limit = 0, int $start = 0): mixedParâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
$sql | string | String de consulta SQL |
$limit | int | Máximo de linhas a retornar (0 = sem limite) |
$start | int | Offset de inicialização |
Retorna: resource|bool - Recurso de resultado ou falso em caso de falha
Exemplo:
$db = XoopsDatabaseFactory::getDatabaseConnection();
// Consulta simples$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid > 0";$result = $db->query($sql);
// Consulta com limite$sql = "SELECT * FROM " . $db->prefix('users');$result = $db->query($sql, 10, 0); // Primeiras 10 linhas
// Consulta com offset$result = $db->query($sql, 10, 20); // 10 linhas começando na linha 20Executa uma consulta forçando a operação (ignora verificações de segurança).
public function queryF(string $sql, int $limit = 0, int $start = 0): mixedCasos de Uso:
- Operações INSERT, UPDATE, DELETE
- Quando precisa contornar restrições de leitura apenas
Exemplo:
$sql = sprintf( "UPDATE %s SET views = views + 1 WHERE article_id = %d", $db->prefix('articles'), $articleId);$db->queryF($sql);Prepara o prefixo de tabela de banco de dados.
public function prefix(string $table = ''): stringParâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
$table | string | Nome da tabela sem prefixo |
Retorna: string - Nome da tabela com prefixo
Exemplo:
$db = XoopsDatabaseFactory::getDatabaseConnection();
echo $db->prefix('users'); // "xoops_users" (se prefixo é "xoops_")echo $db->prefix('modules'); // "xoops_modules"echo $db->prefix(); // "xoops_" (apenas o prefixo)fetchArray
Seção intitulada “fetchArray”Busca uma linha de resultado como um array associativo.
abstract public function fetchArray($result): ?arrayParâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
$result | resource | Recurso de resultado da consulta |
Retorna: array|null - Array associativo ou null se não há mais linhas
Exemplo:
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";$result = $db->query($sql);
while ($row = $db->fetchArray($result)) { echo "Usuário: " . $row['uname'] . "\n"; echo "Email: " . $row['email'] . "\n";}fetchObject
Seção intitulada “fetchObject”Busca uma linha de resultado como um objeto.
abstract public function fetchObject($result): ?objectParâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
$result | resource | Recurso de resultado da consulta |
Retorna: object|null - Objeto com propriedades para cada coluna
Exemplo:
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid = 1";$result = $db->query($sql);
if ($user = $db->fetchObject($result)) { echo "Nome de usuário: " . $user->uname; echo "Email: " . $user->email;}fetchRow
Seção intitulada “fetchRow”Busca uma linha de resultado como um array numérico.
abstract public function fetchRow($result): ?arrayExemplo:
$sql = "SELECT uname, email FROM " . $db->prefix('users');$result = $db->query($sql);
while ($row = $db->fetchRow($result)) { echo "Nome de usuário: " . $row[0] . ", Email: " . $row[1];}fetchBoth
Seção intitulada “fetchBoth”Busca uma linha de resultado como array associativo e numérico.
abstract public function fetchBoth($result): ?arrayExemplo:
$result = $db->query($sql);$row = $db->fetchBoth($result);echo $row['uname']; // Por nomeecho $row[0]; // Por índicegetRowsNum
Seção intitulada “getRowsNum”Obtém o número de linhas em um conjunto de resultados.
abstract public function getRowsNum($result): intParâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
$result | resource | Recurso de resultado da consulta |
Retorna: int - Número de linhas
Exemplo:
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";$result = $db->query($sql);$count = $db->getRowsNum($result);echo "Encontrados $count usuários ativos";getAffectedRows
Seção intitulada “getAffectedRows”Obtém o número de linhas afetadas pela última consulta.
abstract public function getAffectedRows(): intRetorna: int - Número de linhas afetadas
Exemplo:
$sql = "UPDATE " . $db->prefix('users') . " SET last_login = " . time() . " WHERE uid = 1";$db->queryF($sql);$affected = $db->getAffectedRows();echo "Atualizadas $affected linhas";getInsertId
Seção intitulada “getInsertId”Obtém o ID gerado automaticamente do último INSERT.
abstract public function getInsertId(): intRetorna: int - Último ID inserido
Exemplo:
$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 "Artigo criado com ID: $newId";Escapa uma string para uso seguro em consultas SQL.
abstract public function escape(string $string): stringParâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
$string | string | String a escapar |
Retorna: string - String escapada (sem aspas)
Exemplo:
$unsafeInput = "O'Reilly";$safe = $db->escape($unsafeInput); // "O\'Reilly"
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uname = '" . $safe . "'";quoteString
Seção intitulada “quoteString”Escapa e cita uma string para SQL.
public function quoteString(string $string): stringParâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
$string | string | String a citar |
Retorna: string - String escapada e citada
Exemplo:
$name = "John O'Connor";$quoted = $db->quoteString($name); // "'John O\'Connor'"
$sql = "INSERT INTO users (name) VALUES (" . $quoted . ")";freeRecordSet
Seção intitulada “freeRecordSet”Libera a memória associada a um resultado.
abstract public function freeRecordSet($result): voidExemplo:
$result = $db->query($sql);// Processar resultados...$db->freeRecordSet($result); // Liberar memóriaTratamento de Erros
Seção intitulada “Tratamento de Erros”Obtém a última mensagem de erro.
abstract public function error(): stringExemplo:
$result = $db->query($sql);if (!$result) { echo "Erro de banco de dados: " . $db->error();}Obtém o último número de erro.
abstract public function errno(): intExemplo:
$result = $db->query($sql);if (!$result) { echo "Erro #" . $db->errno() . ": " . $db->error();}Consultas Preparadas (MySQLi)
Seção intitulada “Consultas Preparadas (MySQLi)”O driver MySQLi suporta consultas preparadas para segurança aprimorada.
prepare
Seção intitulada “prepare”Cria uma consulta preparada.
public function prepare(string $sql): mysqli_stmt|falseExemplo:
$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();Consulta Preparada com Múltiplos Parâmetros
Seção intitulada “Consulta Preparada com Múltiplos Parâmetros”$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 "Artigo criado com ID: " . $stmt->insert_id;}
$stmt->close();Suporte de Transações
Seção intitulada “Suporte de Transações”beginTransaction
Seção intitulada “beginTransaction”Inicia uma transação.
public function beginTransaction(): boolConfirma a transação atual.
public function commit(): boolrollback
Seção intitulada “rollback”Reverte a transação atual.
public function rollback(): boolExemplo:
$db = XoopsDatabaseFactory::getDatabaseConnection();
try { $db->beginTransaction();
// Múltiplas operações $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);
// Verificar erros if ($db->errno()) { throw new Exception($db->error()); }
$db->commit(); echo "Transação concluída";
} catch (Exception $e) { $db->rollback(); echo "Transação falhou: " . $e->getMessage();}Exemplos Completos de Uso
Seção intitulada “Exemplos Completos de Uso”Operações CRUD Básicas
Seção intitulada “Operações CRUD Básicas”$db = XoopsDatabaseFactory::getDatabaseConnection();
// CREATE$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();
// READ$sql = "SELECT * FROM " . $db->prefix('articles') . " WHERE id = " . (int)$articleId;$result = $db->query($sql);$article = $db->fetchArray($result);
// UPDATE$sql = sprintf( "UPDATE %s SET title = %s, updated = %d WHERE id = %d", $db->prefix('articles'), $db->quoteString('Updated Title'), time(), $articleId);$db->queryF($sql);
// DELETE$sql = "DELETE FROM " . $db->prefix('articles') . " WHERE id = " . (int)$articleId;$db->queryF($sql);Consulta de Paginação
Seção intitulada “Consulta de Paginação”function getArticles(int $page = 1, int $perPage = 10): array{ $db = XoopsDatabaseFactory::getDatabaseConnection(); $start = ($page - 1) * $perPage;
// Obter contagem total $sql = "SELECT COUNT(*) as total FROM " . $db->prefix('articles') . " WHERE published = 1"; $result = $db->query($sql); $row = $db->fetchArray($result); $total = $row['total'];
// Obter página de resultados $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 ];}Consulta de Busca com LIKE
Seção intitulada “Consulta de Busca com 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); // Limite a 50 resultados
$articles = []; while ($row = $db->fetchArray($result)) { $articles[] = $row; }
return $articles;}Consulta de Join
Seção intitulada “Consulta de 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;}Classe SqlUtility
Seção intitulada “Classe SqlUtility”Classe auxiliar para operações de arquivo SQL.
splitMySqlFile
Seção intitulada “splitMySqlFile”Divide um arquivo SQL em consultas individuais.
public static function splitMySqlFile(string $content): arrayExemplo:
$sqlContent = file_get_contents('install.sql');$queries = SqlUtility::splitMySqlFile($sqlContent);
foreach ($queries as $query) { $db->queryF($query); if ($db->errno()) { echo "Erro ao executar: " . $query . "\n"; echo "Erro: " . $db->error() . "\n"; }}prefixQuery
Seção intitulada “prefixQuery”Substitui placeholders de tabela por nomes de tabela com prefixo.
public static function prefixQuery(string $sql, string $prefix): stringExemplo:
$sql = "CREATE TABLE {PREFIX}_articles (id INT PRIMARY KEY)";$prefixedSql = SqlUtility::prefixQuery($sql, $db->prefix());// "CREATE TABLE xoops_articles (id INT PRIMARY KEY)"Melhores Práticas
Seção intitulada “Melhores Práticas”Segurança
Seção intitulada “Segurança”- Sempre escape da entrada do usuário:
$safe = $db->escape($_POST['input']);- Use consultas preparadas quando disponível:
$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param('i', $id);- Use quoteString para valores:
$sql = "INSERT INTO table (name) VALUES (" . $db->quoteString($name) . ")";Desempenho
Seção intitulada “Desempenho”- Sempre use LIMIT para tabelas grandes:
$result = $db->query($sql, 100); // Limitar resultados- Libere conjuntos de resultados quando feito:
$db->freeRecordSet($result);-
Use índices apropriados em suas definições de tabela
-
Prefira handlers sobre SQL bruto quando possível
Tratamento de Erros
Seção intitulada “Tratamento de Erros”- Sempre verifique se há erros:
$result = $db->query($sql);if (!$result) { trigger_error($db->error(), E_USER_WARNING);}- Use transações para múltiplas operações relacionadas:
$db->beginTransaction();// ... operações ...$db->commit(); // ou $db->rollback();Documentação Relacionada
Seção intitulada “Documentação Relacionada”- Criteria - Sistema de criteria de consulta
- QueryBuilder - Construção de consulta fluente
- ../Core/XoopsObjectHandler - Persistência de objeto
Veja também: Código-Fonte do XOOPS