Il y a longtemps, alors que je commençais Ă peine Ă apprendre PHP et les subtilitĂ©s de la compilation de requĂȘtes MySQL (2011), j'ai eu l'idĂ©e d'Ă©crire un wrapper pour MySQLi comme Doctrine pour simplifier la syntaxe d'accĂšs Ă la base de donnĂ©es. C'est dĂ©jĂ 2019 dĂ©jĂ et j'ai dĂ©cidĂ© de partager mon vĂ©lo sur le thĂšme ORM.
Et donc, c'est DBX - le moteur de base de donnĂ©es MySQL pour PHP basĂ© sur la bibliothĂšque MySQLi basĂ© sur les requĂȘtes de la description structurelle des tables et des champs de la base de donnĂ©es sous la forme d'un tableau rĂ©gulier avec la fonction de mise en cache des requĂȘtes statiques et la mise Ă jour automatique du hachage statique.
Contrairement Ă l'amour gĂ©nĂ©ral du PDO, il a Ă©tĂ© choisi la fonctionnalitĂ© lĂ©gĂšre MySQLi, qui est plus douce et plus facile Ă programmer et s'intĂšgre de maniĂšre plus concise dans l'API DBX proposĂ©e. Je n'ai mĂȘme pas utilisĂ© Composer, car je n'ai pas un seul projet oĂč j'utilise des dĂ©pendances tierces autres que l'auto-Ă©criture.
En fait, considĂ©rons un exemple de dĂ©claration de la structure d'une base de donnĂ©es de test simple et de ses tables. Tout d'abord, nous allons connecter la bibliothĂšque elle-mĂȘme Ă la classe et envoyer les donnĂ©es d'autorisation Ă l'hĂŽte de la base de donnĂ©es:
require_once './DBX.php'; $dbx_data = ['localhost', 'root', 'root', 'dbx_test', '8889'];
Imaginez maintenant que nous devons décrire et créer une table dans la base de données en utilisant la syntaxe d'un tableau PHP standard:
<?php $table_1 = 'example';
La syntaxe est simple ici. Je n'ai pas utilisĂ© de frappe forte et j'ai simplement choisi les valeurs TEXT, NUMBER et TYMESTAMP. Bien sĂ»r, pour une structure plus «directrice» de la table, l'ID de champ clĂ© avec incrĂ©mentation automatique est utilisĂ© (je n'ai pas vu de cas dans des projets rĂ©els lorsque la dĂ©finition de l'incrĂ©mentation automatique et de la clĂ© interfĂšre avec la conception des requĂȘtes et des relations de table). Pour indiquer si le champ peut ĂȘtre vide, fill => true est spĂ©cifiĂ©.
Les types de requĂȘte DataBaseX sont trĂšs simples et contiennent des mĂ©thodes de base telles que sĂ©lectionner, insĂ©rer, supprimer, mettre Ă jour, supprimer, tronquer, etc.
Par exemple, une requĂȘte pour crĂ©er une table:
Ou une requĂȘte pour ajouter des donnĂ©es et une structure de colonnes pourrait ressembler Ă ceci:
La structure du tableau permet un jour de dĂ©crire la base de donnĂ©es et ensuite de manipuler uniquement les champs de valeur pour modifier les donnĂ©es qui sont utilisĂ©es pour former des requĂȘtes.
Voici un exemple de déclaration de mise à jour, que j'éliminerai dans l'exemple suivant:
Il m'a semblĂ© que l'utilisation des champs crit_field et crit_value compliquait le systĂšme, j'ai donc créé une requĂȘte qui ajoute automatiquement des donnĂ©es Ă la base de donnĂ©es si elle n'a pas encore Ă©tĂ© créée ou met Ă jour les donnĂ©es existantes. J'ai appelĂ© cette requĂȘte INJECT QUERY et elle est appelĂ©e par le prĂ©fixe "in":
Cela fonctionne Ă un niveau bas comme celui-ci:
INSERT INTO `revolver__comments` (`field_id`, `field_content`) VALUES ('5', 'TEST UPDATE') ON DUPLICATE KEY UPDATE `field_id`='5', `field_content`='TEST UPDATE';
Toutes les autres requĂȘtes sont les plus simples et cela n'a aucun sens de les dĂ©crire (voir les exemples dans le fichier de test index.php), mais je ne peux pas m'empĂȘcher de montrer comment fonctionne la requĂȘte SELECT:
<?php
Ici, en utilisant le prĂ©fixe "s", vous pouvez regrouper les paramĂštres de requĂȘte
s | field_id ( ordre ) | asc ( direction ) | 100 ( limite ) | 0 ( offset ) .
Entre autres choses, DBX possĂšde une caractĂ©ristique aussi distincte qu'un cache de fichiers intĂ©grĂ© basĂ© sur la statique JSON. Chaque demande de changement (INSERT, UPDATE, DELETE, TRUNCATE) provoque un calcul de hachage dans la table de hachage du cache et met automatiquement Ă jour le cache statique, ce qui vous permet de ne pas penser Ă la charge des requĂȘtes SELECT.
Ă l'avenir, je prĂ©vois de dĂ©velopper le moteur DBX et d'Ă©tendre les capacitĂ©s du concepteur de requĂȘtes SQL Ă l'aide du systĂšme de configuration UNION et JOIN, ainsi que d'ajouter un nouveau support de base de donnĂ©es Ă partir de MySQL 8 basĂ© sur le type de structure JSON.
Maintenant, DBX est utilisé dans mon systÚme de gestion de contenu
RevolveR et prĂ©sente de bonnes caractĂ©ristiques (l'ensemble du site, Ă condition qu'il y ait un cache mis Ă jour, est initialisĂ© avec une requĂȘte dans la base de donnĂ©es et consomme environ 0,7 Mo de RAM d'interprĂšte). Il est Ă©galement trĂšs pratique pour moi de voir toute la structure de la base de donnĂ©es dans un fichier distinct, ce qui accĂ©lĂšre parfois la crĂ©ation et la conception de nouveaux modules.
Référentiel de projet: DBX v1.1.1 sur GitHub .