OverCms Wiki

Un CMS simple et puissant

Wiki  »  Plugins  »  Base de données


Base de données

Votre plugin peut être amené à interagir avec la base de données, pour cela une classe spéciale à été faite pour fonctionner sur MySQL ou SQLite de la même façon.

Mais si vous êtes habitués à PDO et que vous ne voulez pas utiliser cette classe, vous pouvez faire des requêtes directement:

// Équivalent de PDO::prepare($sql) puis PDO::execute($args)
db()->query($sql, $args);
 
// N'oubliez pas d'inclure le préfixe (constante PREFIX)
$user = db()->query('SELECT * FROM ' . PREFIX . 'cms_user WHERE username = ?', array('John'))->fetch();
 
// Avec la classe, ça donne:
$user = db()->select()->from('cms_user')->where('username', 'John')->fetch();

Information

Pour administrer et voir les tables facilement de la base de données SQLite: plus d'infos ici.

Select

Select

// Retourne tous les lignes
db()->select()->from('cms_users')->fetchAll();
 
// Retourne la première ligne, avec une condition
db()->select()->from('cms_users')->where('name', 'John')->fetch();
 
// On peut préciser ce qu'on sélectionne
db()->select('id')->from('cms_users')->where('name', 'John')->fetch();
db()->select('COUNT(*) AS count')->from('cms_users')->where('name', 'John')->fetch();
db()->select(array('username', 'password'))->from('cms_users')->where('name', 'John')->fetch();

Where

// SELECT * FROM cms_users WHERE id > 10 OR name = "John" AND password = "12346" OR disabled = 1
db()->select()->from('cms_users')->where('id', '>', 10)
                                 ->orWhere('name', 'John')
                                 ->andWhere('password', '123456')
                                 ->orWhere('disabled', true)
                                 ->fetch();

Between / In

db()->select()->from('cms_users')->where('id', 'BETWEEN', array(1, 10))->fetch();
db()->select()->from('cms_users')->where('id', 'NOT BETWEEN', array(1, 10))->fetch();
db()->select()->from('cms_users')->where('id', 'IN', array(1, 2, 3))->fetch();
db()->select()->from('cms_users')->where('id', 'NOT IN', array(1, 2, 3))->fetch();

Where avancé

// Dans ce cas, écrivez la condition suivi directement de bind() pour les paramètres
db()->select()->from('cms_users')->where('id > ? OR (username = ? AND password = ?)')
                                 ->bind(array(10, 'John', '123456')
                                 ->fetch();

Where NULL

// Vous ne pouvez pas utiliser ->where('id', null), utilisez les méthodes suivantes:
// SELECT * FROM cms_users WHERE id IS NULL AND username IS NULL OR password IS NOT NULL
db()->select()->from('cms_users')->whereNull('id')
                                 ->andWhereNull('username')
                                 ->orWhereNotNull('password')
                                 ->fetch();

Order By, Group By, Having, Limit ..

db()->select()->from('cms_users')->orderBy('username', 'desc')
                                 ->groupBy('count')
                                 ->having('count', '>', 100)
                                 ->limit(10)
                                 ->offset(5)
                                 ->fetchAll();

Insert, Update et Delete

Insert

db()->insert(array(
    'username' => 'John',
    'password' => '123456'
))->into('cms_users');

Update

db()->update(array(
    'username' => 'John'
))->where('id', 10)->in('cms_users');

Obtenir la ligne insérée/modifiée

// Insère et retourne la ligne correspondante
db()->insert(array(
    'username' => 'John',
    'password' => '123456'
))->into('cms_users')->get();

Attention

Vous devez avoir un champ AUTO_INCREMENT pour que cela fonctionne. Sur MySQL, ce champ doit s'appeler 'id' ou être précisé dans la méthode get(), par exemple: …→get('user_id')
// Modifie et retourne les lignes correspondantes
db()->update(array(
    'username' => 'John'
))->where('id', '>', 10)->in('cms_users')->get();

Attention

Dans le cas d'un update, la méthode réutilise les mêmes champs where(), donc si vous modifiez une valeur utilisée dans un des where(), cela ne fonctionnera pas.
// Fonctionne
db()->update(array('password' => '123456'))->where('username', 'John')->in('cms_users')->get();
 
// Ne fonctionnera pas
db()->update(array('password' => '123456'))->where('password', 'abcdef')->in('cms_users')->get();

Delete

// N'oubliez pas le save() à la fin !
db()->delete('users')->where('id', '>', 10)->save();

A savoir

Colonnes

// Retourne true si la table existe
db()->hasTable('cms_users');
 
// Retourne un tableau contenant la liste des colonnes et leur informations (nom, type, ..)
db()->getTable('cms_users');
 
// Similaire a getTable, sauf que le tableau est associatif et contient le nom des colonnes comme clé
db()->getColumns('cms_users');
 
// Retourne true si la colonne existe
db()->hasColumn('cms_users', 'id');
 
// Retourne un tableau contenant les informations de la colonne
db()->getColumn('cms_users', 'id');

Create, Drop, Alter

db()->create('cms_users', array(
    // Regardez plus bas pour la création de tables
));
db()->drop('cms_users');
db()->alter('cms_users', 'ADD column INT');

Count

db()->count('cms_users');
db()->select()->from('cms_users')->where('id', '>', 100)->count();

Debug

// Affiche la requête et les arguments
db()->debug()
    ->select()->from('cms_users')->where('id', '>', 100)->get();

While et Fetch

// Vous pouvez utiliser la classe à travers un while
$query = db()->select()->from('users')->where('id', '>', 1);
while($query->fetch() as $user) {
    // $user
}

Conditions

// Si vous utilisez db()->query() ou si vous modifiez des tables,
// vous devrez prévoir le cas ou l'utilisateur utilise MySQL ou SQLite
if (db()->isMySQL())
    db()->alter('users', 'ADD password VARCHAR(64)');
else
    db()->alter('users', 'ADD password TEXT');

Créer une table

La classe Table permet de gérer les types automatiquement en fonction de la base de données. Par exemple, nous allons créer la table cms_users avec cette structure:

Pour ce faire, rien de plus simple:

db()->create('cms_users', array(
 
    // Créé un id auto increment
    Table::id(),
 
    // Chaine de 255 caractères max
    Table::string('username'),
    Table::string('password'),
    Table::string('email'),
 
    // Entier
    Table::int('date_creation'),
    Table::int('permission'),
 
    // Texte (aucune limite de caractères)
    Table::text('profile'),
 
    // Chaine de 255 caractères max
    Table::string('token'),
 
));

Pas besoin de préciser de taille, ni de type spécial (smallint, bigint, int, ..), il faut rester simple et ça fonctionnera sans problème.

A savoir:
- Après le nom de la colonne, vous pouvez définir des options
- Les champs textes (incluant varchar et string) sont par défaut insensible à la casse

Le tutoriel est fini, cependant il y a beaucoup de types différents, qui sont tous plus bas sur cette page.


Page suivante: Évenements


db()->create('test', array(
 
    Table::id(), // colonne nommée "id" + auto increment + primary key
 
    // colonne nommée "special", avec le type défini explicitement sous mysql et sqlite
    Table::raw('special', array(
        'mysql'  => 'BIGINT(16)',
        'sqlite' => 'INTEGER'
    )),
 
    // colonne "nombre" avec un entier
    // int et integer sont des alias
    Table::int('nombre'),
    Table::integer('nombre', array(
        'size' => 10,
        'default' => 12
    )),
 
    // colonne "nombre_reel" avec un nombre à virgule
    // float, double, decimal et real sont des alias
    Table::float('nombre_reel'),
    Table::double('nombre_reel', array(
        'size' => 5,
        'precision' => 3,
        'rawDefault' => '0.00' // empêche PHP de convertir "0.00" à "0"
    )),
    Table::decimal('nombre_reel'),
    Table::real('nombre_reel'),
 
    // colonne "texte" avec une chaîne de caractères, limité à 255 caractères
    // varchar et string sont des alias
    Table::varchar('texte'),
    Table::string('texte', array(
        'case' => false // inutile, car par défaut un champ texte est insensible à la casse
    )),
 
    // texte, sans limite de caractères
    Table::text('texte', array(
        'case' => true // sensible à la casse
    )),
 
    // colonne "donnees_binaire" avec des données binaire
    Table::binary('donnees_binaire'),
    Table::blob('donnees_binaire'),
 
    // colonne "booleen" avec un booléen
    // Les booléens des entiers correspondants à 0 et 1
    // true et false sont automatiquement convertis en 1 et 0
    Table::boolean('booleen', array(
        'default' => false
    )),
    Table::bool('booleen'),
 
));

Page suivante: Évenements