Aller au contenu

Classe XoopsDatabase

La classe XoopsDatabase fournit une couche d’abstraction base de données pour XOOPS, gérant la connexion, l’exécution de requêtes, le traitement des résultats et la gestion des erreurs. Elle supporte plusieurs pilotes base de données par une architecture de pilotes.

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 abstraite)
├── XoopsMySQLDatabase (Extension MySQL)
│ └── XoopsMySQLDatabaseProxy (Proxy sécurité)
└── XoopsMySQLiDatabase (Extension MySQLi)
└── XoopsMySQLiDatabaseProxy (Proxy sécurité)
XoopsDatabaseFactory
└── Crée des instances de pilotes appropriés
// Recommandé : Utiliser la fabrique
$db = XoopsDatabaseFactory::getDatabaseConnection();
// Alternative : Accès singleton direct
$db = XoopsDatabase::getInstance();
// Héritage : Utiliser la variable globale
global $xoopsDB;

Établit une connexion base de données.

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

Paramètres :

ParamètreTypeDescription
$selectdbboolSi la base de données doit être sélectionnée

Retour : bool - True en cas de connexion réussie

Exemple :

$db = XoopsDatabaseFactory::getDatabaseConnection();
if ($db->connect()) {
echo "Connecté avec succès";
}

Exécute une requête SQL.

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

Paramètres :

ParamètreTypeDescription
$sqlstringChaîne de requête SQL
$limitintMaximum de lignes à retourner (0 = pas de limite)
$startintDécalage de départ

Retour : resource|bool - Ressource de résultat ou false en cas d’échec

Exemple :

$db = XoopsDatabaseFactory::getDatabaseConnection();
// Requête simple
$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE uid > 0";
$result = $db->query($sql);
// Requête avec limite
$sql = "SELECT * FROM " . $db->prefix('users');
$result = $db->query($sql, 10, 0); // Les 10 premières lignes
// Requête avec décalage
$result = $db->query($sql, 10, 20); // 10 lignes à partir de la ligne 20

Exécute une requête forçant l’opération (contourne les vérifications de sécurité).

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

Cas d’utilisation :

  • Opérations INSERT, UPDATE, DELETE
  • Quand vous avez besoin de contourner les restrictions de lecture seule

Exemple :

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

Ajoute le préfixe base de données au nom de la table.

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

Paramètres :

ParamètreTypeDescription
$tablestringNom de la table sans préfixe

Retour : string - Nom de la table avec préfixe

Exemple :

$db = XoopsDatabaseFactory::getDatabaseConnection();
echo $db->prefix('users'); // "xoops_users" (si préfixe est "xoops_")
echo $db->prefix('modules'); // "xoops_modules"
echo $db->prefix(); // "xoops_" (juste le préfixe)

Récupère une ligne de résultat sous forme de tableau associatif.

abstract public function fetchArray($result): ?array

Paramètres :

ParamètreTypeDescription
$resultresourceRessource de résultat de requête

Retour : array|null - Tableau associatif ou null s’il n’y a plus de lignes

Exemple :

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

Récupère une ligne de résultat sous forme d’objet.

abstract public function fetchObject($result): ?object

Paramètres :

ParamètreTypeDescription
$resultresourceRessource de résultat de requête

Retour : object|null - Objet avec propriétés pour chaque colonne

Exemple :

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

Récupère une ligne de résultat sous forme de tableau numérique.

abstract public function fetchRow($result): ?array

Exemple :

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

Récupère une ligne de résultat sous forme de tableau associatif et numérique.

abstract public function fetchBoth($result): ?array

Exemple :

$result = $db->query($sql);
$row = $db->fetchBoth($result);
echo $row['uname']; // Par nom
echo $row[0]; // Par index

Obtient le nombre de lignes dans un résultat.

abstract public function getRowsNum($result): int

Paramètres :

ParamètreTypeDescription
$resultresourceRessource de résultat de requête

Retour : int - Nombre de lignes

Exemple :

$sql = "SELECT * FROM " . $db->prefix('users') . " WHERE level > 0";
$result = $db->query($sql);
$count = $db->getRowsNum($result);
echo "Trouvé $count utilisateurs actifs";

Obtient le nombre de lignes affectées par la dernière requête.

abstract public function getAffectedRows(): int

Retour : int - Nombre de lignes affectées

Exemple :

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

Obtient l’ID auto-généré de la dernière insertion INSERT.

abstract public function getInsertId(): int

Retour : int - Dernier ID inséré

Exemple :

$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 "Article créé avec ID : $newId";

Échappe une chaîne pour une utilisation sécurisée dans les requêtes SQL.

abstract public function escape(string $string): string

Paramètres :

ParamètreTypeDescription
$stringstringChaîne à échapper

Retour : string - Chaîne échappée (sans guillemets)

Exemple :

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

Échappe et met entre guillemets une chaîne pour SQL.

public function quoteString(string $string): string

Paramètres :

ParamètreTypeDescription
$stringstringChaîne à mettre entre guillemets

Retour : string - Chaîne échappée et mise entre guillemets

Exemple :

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

Libère la mémoire associée à un résultat.

abstract public function freeRecordSet($result): void

Exemple :

$result = $db->query($sql);
// Traiter les résultats...
$db->freeRecordSet($result); // Libérer la mémoire

Obtient le dernier message d’erreur.

abstract public function error(): string

Exemple :

$result = $db->query($sql);
if (!$result) {
echo "Erreur base de données : " . $db->error();
}

Obtient le dernier numéro d’erreur.

abstract public function errno(): int

Exemple :

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

Le pilote MySQLi supporte les requêtes préparées pour une sécurité améliorée.

Crée une requête préparée.

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

Exemple :

$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();

Démarre une transaction.

public function beginTransaction(): bool

Valide la transaction actuelle.

public function commit(): bool

Annule la transaction actuelle.

public function rollback(): bool

Exemple :

$db = XoopsDatabaseFactory::getDatabaseConnection();
try {
$db->beginTransaction();
// Opérations multiples
$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);
// Vérifier les erreurs
if ($db->errno()) {
throw new Exception($db->error());
}
$db->commit();
echo "Transaction complétée";
} catch (Exception $e) {
$db->rollback();
echo "Échec de la transaction : " . $e->getMessage();
}

  1. Toujours échapper les entrées utilisateur :
$safe = $db->escape($_POST['input']);
  1. Utiliser les requêtes préparées quand disponibles :
$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param('i', $id);
  1. Utiliser quoteString pour les valeurs :
$sql = "INSERT INTO table (name) VALUES (" . $db->quoteString($name) . ")";
  1. Toujours utiliser LIMIT pour les grandes tables :
$result = $db->query($sql, 100); // Limiter les résultats
  1. Libérer les jeux de résultats quand c’est fait :
$db->freeRecordSet($result);
  1. Utiliser les index appropriés dans vos définitions de table

  2. Préférer les gestionnaires au SQL brut quand possible

  • Criteria - Système de critères de requête
  • QueryBuilder - Construction de requêtes fluide
  • ../Core/XoopsObjectHandler - Persistance d’objet

Voir aussi : Code source XOOPS