Salta ai contenuti

Classe XoopsDatabase

La classe XoopsDatabase fornisce un livello di astrazione database per XOOPS, gestendo connessioni, esecuzione query, elaborazione risultati e gestione errori. Supporta driver database multipli tramite un’architettura driver.

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;
}
XoopsDatabase (Base Astratto)
├── XoopsMySQLDatabase (Estensione MySQL)
│ └── XoopsMySQLDatabaseProxy (Proxy Sicurezza)
└── XoopsMySQLiDatabase (Estensione MySQLi)
└── XoopsMySQLiDatabaseProxy (Proxy Sicurezza)
XoopsDatabaseFactory
└── Crea istanze driver appropriati
// Consigliato: Usa la factory
$db = XoopsDatabaseFactory::getDatabaseConnection();
// Alternativa: Accesso singleton diretto
$db = XoopsDatabase::getInstance();
// Legacy: Usa variabile globale
global $xoopsDB;

Stabilisce una connessione database.

abstract public function connect(bool $selectdb = true): bool

Parametri:

ParametroTipoDescrizione
$selectdbboolSe selezionare il database

Restituisce: bool - True se connessione riuscita

Esempio:

$db = XoopsDatabaseFactory::getDatabaseConnection();
if ($db->connect()) {
echo "Connesso con successo";
}

Esegue una query SQL.

abstract public function query(
string $sql,
int $limit = 0,
int $start = 0
): mixed

Parametri:

ParametroTipoDescrizione
$sqlstringStringa query SQL
$limitintRighe massime da restituire (0 = no limit)
$startintOffset iniziale

Restituisce: resource|bool - Risorsa risultato o false se fallisce

Esempio:

$db = XoopsDatabaseFactory::getDatabaseConnection();
// Query semplice
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid > 0";
$result = $db->query($sql);
// Query con limit
$sql = "SELECT * FROM " . $db->prefix('users');
$result = $db->query($sql, 10, 0); // Prime 10 righe
// Query con offset
$result = $db->query($sql, 10, 20); // 10 righe a partire dalla riga 20

Esegue una query forzando l’operazione (bypassa controlli sicurezza).

public function queryF(string $sql, int $limit = 0, int $start = 0): mixed

Casi di Uso

  • Operazioni INSERT, UPDATE, DELETE
  • Quando hai bisogno di bypassare restrizioni read-only

Esempio:

$sql = sprintf(
"UPDATE %s SET views = views + 1 WHERE article_id = %d",
$db->prefix('articles'),
$articleId
);
$db->queryF($sql);

Prepone il prefisso tabella database.

public function prefix(string $table = ''): string

Parametri:

ParametroTipoDescrizione
$tablestringNome tabella senza prefisso

Restituisce: string - Nome tabella con prefisso

Esempio:

$db = XoopsDatabaseFactory::getDatabaseConnection();
echo $db->prefix('users'); // "xoops_users" (se prefisso è "xoops_")
echo $db->prefix('modules'); // "xoops_modules"
echo $db->prefix(); // "xoops_" (solo il prefisso)

Legge una riga di risultato come array associativo.

abstract public function fetchArray($result): ?array

Parametri:

ParametroTipoDescrizione
$resultresourceRisorsa risultato query

Restituisce: array|null - Array associativo o null se nessun’altra riga

Esempio:

$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";
$result = $db->query($sql);
while ($row = $db->fetchArray($result)) {
echo "Utente: " . $row['uname'] . "\n";
echo "Email: " . $row['email'] . "\n";
}

Legge una riga di risultato come oggetto.

abstract public function fetchObject($result): ?object

Parametri:

ParametroTipoDescrizione
$resultresourceRisorsa risultato query

Restituisce: object|null - Oggetto con proprietà per ogni colonna

Esempio:

$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid = 1";
$result = $db->query($sql);
if ($user = $db->fetchObject($result)) {
echo "Nome Utente: " . $user->uname;
echo "Email: " . $user->email;
}

Legge una riga di risultato come array numerico.

abstract public function fetchRow($result): ?array

Esempio:

$sql = "SELECT uname, email FROM " . $db->prefix('users');
$result = $db->query($sql);
while ($row = $db->fetchRow($result)) {
echo "Nome Utente: " . $row[0] . ", Email: " . $row[1];
}

Legge una riga di risultato come array sia associativo che numerico.

abstract public function fetchBoth($result): ?array

Esempio:

$result = $db->query($sql);
$row = $db->fetchBoth($result);
echo $row['uname']; // Per nome
echo $row[0]; // Per indice

Ottiene il numero di righe in un set di risultati.

abstract public function getRowsNum($result): int

Parametri:

ParametroTipoDescrizione
$resultresourceRisorsa risultato query

Restituisce: int - Numero di righe

Esempio:

$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";
$result = $db->query($sql);
$count = $db->getRowsNum($result);
echo "Trovati $count utenti attivi";

Ottiene il numero di righe interessate dall’ultima query.

abstract public function getAffectedRows(): int

Restituisce: int - Numero di righe interessate

Esempio:

$sql = "UPDATE " . $db->prefix('users') . " SET last_login = " . time() . " WHERE uid = 1";
$db->queryF($sql);
$affected = $db->getAffectedRows();
echo "Aggiornate $affected righe";

Ottiene l’ID auto-generato dall’ultimo INSERT.

abstract public function getInsertId(): int

Restituisce: int - Ultimo ID insert

Esempio:

$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 "Articolo creato con ID: $newId";

Escapa una stringa per uso sicuro in query SQL.

abstract public function escape(string $string): string

Parametri:

ParametroTipoDescrizione
$stringstringStringa da escapare

Restituisce: string - Stringa escapata (senza virgolette)

Esempio:

$unsafeInput = "O'Reilly";
$safe = $db->escape($unsafeInput); // "O\'Reilly"
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uname = '" . $safe . "'";

Escapa e quota una stringa per SQL.

public function quoteString(string $string): string

Parametri:

ParametroTipoDescrizione
$stringstringStringa da quotare

Restituisce: string - Stringa escapata e quotata

Esempio:

$name = "John O'Connor";
$quoted = $db->quoteString($name); // "'John O\'Connor'"
$sql = "INSERT INTO users (name) VALUES (" . $quoted . ")";

Libera la memoria associata a un risultato.

abstract public function freeRecordSet($result): void

Esempio:

$result = $db->query($sql);
// Processa risultati...
$db->freeRecordSet($result); // Libera memoria

Ottiene l’ultimo messaggio di errore.

abstract public function error(): string

Esempio:

$result = $db->query($sql);
if (!$result) {
echo "Errore database: " . $db->error();
}

Ottiene l’ultimo numero di errore.

abstract public function errno(): int

Esempio:

$result = $db->query($sql);
if (!$result) {
echo "Errore #" . $db->errno() . ": " . $db->error();
}

Il driver MySQLi supporta istruzioni preparate per sicurezza migliorata.

Crea un’istruzione preparata.

public function prepare(string $sql): mysqli_stmt|false

Esempio:

$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();
$sql = "INSERT INTO " . $db->prefix('articles') . " (title, content, author_id) VALUES (?, ?, ?)";
$stmt = $db->prepare($sql);
$stmt->bind_param('ssi', $title, $content, $authorId);
$title = "Mio Articolo";
$content = "Contenuto articolo qui";
$authorId = 1;
if ($stmt->execute()) {
echo "Articolo creato con ID: " . $stmt->insert_id;
}
$stmt->close();

Avvia una transazione.

public function beginTransaction(): bool

Esegue il commit della transazione corrente.

public function commit(): bool

Fa il rollback della transazione corrente.

public function rollback(): bool

Esempio:

$db = XoopsDatabaseFactory::getDatabaseConnection();
try {
$db->beginTransaction();
// Operazioni multiple
$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);
// Verifica errori
if ($db->errno()) {
throw new Exception($db->error());
}
$db->commit();
echo "Transazione completata";
} catch (Exception $e) {
$db->rollback();
echo "Transazione fallita: " . $e->getMessage();
}

Classe helper per operazioni su file SQL.

Divide un file SQL in query individuali.

public static function splitMySqlFile(string $content): array

Esempio:

$sqlContent = file_get_contents('install.sql');
$queries = SqlUtility::splitMySqlFile($sqlContent);
foreach ($queries as $query) {
$db->queryF($query);
if ($db->errno()) {
echo "Errore esecuzione: " . $query . "\n";
echo "Errore: " . $db->error() . "\n";
}
}

Sostituisce i placeholder di tabella con nomi tabella con prefisso.

public static function prefixQuery(string $sql, string $prefix): string

Esempio:

$sql = "CREATE TABLE {PREFIX}_articles (id INT PRIMARY KEY)";
$prefixedSql = SqlUtility::prefixQuery($sql, $db->prefix());
// "CREATE TABLE xoops_articles (id INT PRIMARY KEY)"

  1. Sempre escapa input utente:
$safe = $db->escape($_POST['input']);
  1. Usa istruzioni preparate quando disponibili:
$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param('i', $id);
  1. Usa quoteString per valori:
$sql = "INSERT INTO table (name) VALUES (" . $db->quoteString($name) . ")";
  1. Usa sempre LIMIT per tabelle grandi:
$result = $db->query($sql, 100); // Limita risultati
  1. Libera set di risultati quando finito:
$db->freeRecordSet($result);
  1. Usa indici appropriati nelle definizioni di tabella

  2. Preferisci handler su SQL raw quando possibile

  1. Sempre verifica errori:
$result = $db->query($sql);
if (!$result) {
trigger_error($db->error(), E_USER_WARNING);
}
  1. Usa transazioni per operazioni correlate multiple:
$db->beginTransaction();
// ... operazioni ...
$db->commit(); // o $db->rollback();
  • Criteria - Sistema criteri di query
  • QueryBuilder - Costruzione query fluente
  • ../Core/XoopsObjectHandler - Persistenza oggetto

Vedi anche: Codice Sorgente XOOPS