Wiki » Plugins » 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
// 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();
// 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();
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();
// 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();
// 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();
db()->select()->from('cms_users')->orderBy('username', 'desc') ->groupBy('count') ->having('count', '>', 100) ->limit(10) ->offset(5) ->fetchAll();
db()->insert(array( 'username' => 'John', 'password' => '123456' ))->into('cms_users');
db()->update(array( 'username' => 'John' ))->where('id', 10)->in('cms_users');
// Insère et retourne la ligne correspondante db()->insert(array( 'username' => 'John', 'password' => '123456' ))->into('cms_users')->get();
Attention
// Modifie et retourne les lignes correspondantes db()->update(array( 'username' => 'John' ))->where('id', '>', 10)->in('cms_users')->get();
Attention
// 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();
// N'oubliez pas le save() à la fin ! db()->delete('users')->where('id', '>', 10)->save();
// 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');
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');
// Affiche la requête et les arguments db()->debug() ->select()->from('cms_users')->where('id', '>', 100)->get();
// Vous pouvez utiliser la classe à travers un while $query = db()->select()->from('users')->where('id', '>', 1); while($query->fetch() as $user) { // $user }
// 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');
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