PHPackages                             wlib/db - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. wlib/db

ActiveLibrary[Database &amp; ORM](/categories/database)

wlib/db
=======

Simple implementation on top of PDO to handle your database queries.

v1.3.2(2mo ago)0361CECILL-2.1PHPPHP &gt;=7.1.0

Since Oct 19Pushed 2mo ago1 watchersCompare

[ Source](https://github.com/SamRay1024/wlib-db)[ Packagist](https://packagist.org/packages/wlib/db)[ RSS](/packages/wlib-db/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (2)Versions (14)Used By (1)

wlib/db
=======

[](#wlibdb)

Ensemble de classes PHP pour interagir avec vos bases de données MySQL, SQLite ou PostgreSQL.

Installation
------------

[](#installation)

```
composer require wlib/db
```

Documentation
-------------

[](#documentation)

La bibliothèque **wlib/db** offre une interface complète pour interagir avec les bases de données **MySQL**, **SQLite** et **PostgreSQL** (support incomplet pour PostgreSQL). Elle fournit des classes puissantes pour construire des requêtes **SQL** de manière sécurisée et expressive.

Note

Le code est documenté, n'hésitez pas à le consulter en complément de cette documentation.

### Connexion à la base de données

[](#connexion-à-la-base-de-données)

```
// Connexion SQLite
$db = new Db(Db::DRV_SQLTE, '/chemin/vers/base.sqlite');

// Connexion MySQL
$db = new Db(Db::DRV_MYSQL, 'nom_base', 'utilisateur', 'motdepasse', 'localhost', 3306);

// Connexion PostgreSQL
$db = new Db(Db::DRV_PGSQL, 'nom_base', 'utilisateur', 'motdepasse', 'localhost', 5432);

$db->connect();
```

Note

La connexion est automatiquement établie lors de la première requête si vous n'appelez pas explicitement `connect()`.

### Construction de requêtes avec Query

[](#construction-de-requêtes-avec-query)

#### Requêtes SELECT

[](#requêtes-select)

```
// Sélection simple
$result = $db->query()
    ->select('id, title, views')
    ->from('post')
    ->where('id = :id')
    ->setParameter('id', 1, PDO::PARAM_INT)
    ->run();

// Récupération des résultats
$row = $result->fetch(); // Un seul résultat
$rows = $result->fetchAll(); // Tous les résultats
$count = $result->fetchColumn(); // Première colonne
```

#### Jointures

[](#jointures)

```
// Jointure interne
$result = $db->query()
    ->select('p.title, c.content')
    ->from('post AS p')
    ->innerJoin('comment AS c', 'c.post_id = p.id')
    ->where('p.id = :id')
    ->setParameter('id', 1, PDO::PARAM_INT)
    ->run();
```

#### Requêtes INSERT

[](#requêtes-insert)

```
// Insertion avec paramètres explicites
$id = $db->query()
    ->insert('post')
    ->set('title', ':title')
    ->set('created_at', ':created_at')
    ->setParameter(':title', 'Mon premier article')
    ->setParameter(':created_at', (new DateTime())->format('Y-m-d H:i:s'))
    ->run();

// Insertion avec valeurs directes
$id = $db->query()
    ->insert('post')
    ->values(
        ['title', 'Second article', PDO::PARAM_STR],
        ['created_at', 'NOW()'],
        ['updated_at', 'NOW()']
    )
    ->run();
```

#### Requêtes UPDATE

[](#requêtes-update)

```
// Mise à jour simple
$count = $db->query()
    ->update('post')
    ->values(
        ['views', 1, PDO::PARAM_INT],
        ['updated_at', 'NOW()']
    )
    ->where('id = :id')
    ->setParameter('id', 1, PDO::PARAM_INT)
    ->run();

// Mise à jour avec expression SQL
$db->query()
    ->update('post')
    ->values(
        ['views', Db::literal('views + 1')],
        ['updated_at', 'NOW()']
    )
    ->run();
```

#### Requêtes DELETE et TRUNCATE

[](#requêtes-delete-et-truncate)

```
// Suppression conditionnelle
$deleted = $db->query()
    ->delete('comment')
    ->where('author = :author')
    ->setParameter('author', 'Auteur1')
    ->run();

// Vider une table
$db->query()->truncate('comment')->run();
```

### Gestion des tables avec Table

[](#gestion-des-tables-avec-table)

La classe `Table` fournit une interface orientée objet pour manipuler les données :

```
// Création d'une classe de table
class PostTable extends Table
{
    const TABLE_NAME = 'post';
    const COL_ID_NAME = 'id';
    // ... autres constantes
}

// Utilisation
$postTable = $db->table('post');

// Création d'un enregistrement
$newId = $postTable->add(['title' => 'Nouvel article']);

// Mise à jour
$postTable->update(1, ['title' => 'Titre mis à jour']);

// Suppression
$postTable->delete(1);

// Recherche
$post = $postTable->findRow('*', 1); // Retourne un objet
$posts = $postTable->findRows('id, title', 'views > 10', 'id DESC');

// Comptage
$count = $postTable->count('views < 50');

// Vérification d'existence
$exists = $postTable->exists('title', 'Mon article');
```

### Fonctionnalités avancées

[](#fonctionnalités-avancées)

#### Littéraux SQL

[](#littéraux-sql)

```
// Utilisation de littéraux pour les expressions SQL
$db->query()
    ->update('post')
    ->values(
        ['views', Db::literal('views + 1')],
        ['updated_at', 'NOW()']
    )
    ->run();
```

#### Transactions

[](#transactions)

```
try
{
    $db->beginTransaction();

    // Exécuter plusieurs requêtes
    $db->query()->insert('post')->values(...)->run();
    $db->query()->update('user')->values(...)->run();

    $db->commit();
}
catch (Exception $e)
{
    $db->rollBack();
    // Gestion de l'erreur
}
```

#### Événements

[](#événements)

```
// Événements avant/après exécution
$db->onBeforeExecute(function($sql, $params) {
    // Log ou modification avant exécution
});

$db->onAfterExecute(function($sql, $params, $time) {
    // Log ou traitement après exécution
});
```

#### Sécurité

[](#sécurité)

```
// Protection contre les injections SQL
$unsafeInput = $_GET['user_input'];
$safeQuery = $db->query()
    ->select('*')
    ->from('users')
    ->where('username = :username')
    ->setParameter('username', $unsafeInput)
    ->run();
```

#### Gestion des erreurs

[](#gestion-des-erreurs)

```
try
{
    $result = $db->query()
        ->select('*')
        ->from('inexistante')
        ->run();
}
catch (UnexpectedValueException $e)
{
    // Gestion de l'erreur de table inexistante
}
catch (PDOException $e)
{
    // Gestion des erreurs PDO
}
```

### Exemples complets

[](#exemples-complets)

#### Création de tables

[](#création-de-tables)

```
$db->execute("
    CREATE TABLE post (
        id INTEGER PRIMARY KEY AUTO_INCREMENT,
        title VARCHAR(255) NOT NULL,
        views INTEGER NOT NULL DEFAULT 0,
        created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
        updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    )
");
```

#### Requêtes complexes

[](#requêtes-complexes)

```
// Requête avec jointure, regroupement et tri
$result = $db->query()
    ->select('u.name, COUNT(p.id) as post_count')
    ->from('users AS u')
    ->leftJoin('post AS p', 'p.user_id = u.id')
    ->groupBy('u.id')
    ->orderBy('post_count DESC')
    ->limit(10)
    ->run();
```

Pour plus d'exemples, consultez le fichier de tests unitaires `/tests/Unit/DbTest.php` qui contient de nombreux cas d'utilisation concrets.

Tests unitaires
---------------

[](#tests-unitaires)

Le fichier `/tests/Unit/DbTest.php` contient de nombreux exemples de mise en oeuvre.

Les tests unitaires font usage de la libraire [Pest](https://pestphp.com/).

###  Health Score

38

—

LowBetter than 85% of packages

Maintenance86

Actively maintained with recent releases

Popularity7

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~72 days

Recently: every ~91 days

Total

13

Last Release

68d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/e6e3b6cbcc3109815e57326009b00cbf41ed1c31b95b74eb58330c535092383d?d=identicon)[SamRay1024](/maintainers/SamRay1024)

---

Top Contributors

[![SamRay1024](https://avatars.githubusercontent.com/u/4489805?v=4)](https://github.com/SamRay1024 "SamRay1024 (19 commits)")

---

Tags

databasesqlpdodaodalwlib

###  Code Quality

TestsPest

### Embed Badge

![Health badge](/badges/wlib-db/health.svg)

```
[![Health](https://phpackages.com/badges/wlib-db/health.svg)](https://phpackages.com/packages/wlib-db)
```

###  Alternatives

[doctrine/dbal

Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.

9.7k578.4M5.6k](/packages/doctrine-dbal)[ifsnop/mysqldump-php

PHP version of mysqldump cli that comes with MySQL

1.3k5.5M69](/packages/ifsnop-mysqldump-php)[aura/sqlquery

Object-oriented query builders for MySQL, Postgres, SQLite, and SQLServer; can be used with any database connection library.

4572.9M34](/packages/aura-sqlquery)[paragonie/easydb

Easy-to-use database abstraction

744273.4k23](/packages/paragonie-easydb)[clouddueling/mysqldump-php

PHP version of mysqldump cli that comes with MySQL

1.3k22.9k](/packages/clouddueling-mysqldump-php)[ezsql/ezsql

Advance database access library. Make interacting with a database ridiculously easy. An universal interchangeable CRUD system.

86946.7k](/packages/ezsql-ezsql)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
