J'ai dissous ce projet parce que c'était trop de travail, même si l'idée semblait idiote au début, elle a en fait fonctionné jusqu'à ce que je trouve beaucoup de problèmes lors de la pagination et en termes de performances, je pense que le clustering serait le meilleur. Utilisez-le à vos propres risques, c'était amusant de réaliser ce projet.
Il s'agit d'une bibliothèque PHP gratuite , facile à utiliser , légère et puissante qui vous permet de vous connecter à plusieurs bases de données MySQL avec PDO. J'ai construit ceci spécifiquement pour MySQL mais je pense que cela fonctionnera avec PostgreSQL, MariaDB, CouchDB, etc. N'oubliez pas que ceci est destiné aux bases de données SQL, donc cela ne fonctionnera pas avec les systèmes de gestion de bases de données comme MongoDB et Apache Cassandra.
✔ Connectez-vous à plusieurs bases de données MySQL à l'aide de PDO.
✔ Récupérez des lignes de plusieurs bases de données.
✔ Effectuez efficacement des requêtes d'insertion en effectuant une seule requête au lieu d'ajouter de nouvelles lignes dans toutes les tables de chaque base de données.
✔ Triez, limitez et gérez facilement les résultats/lignes.
✔ Évoluez facilement, simplement en ajoutant davantage de bases de données (pas besoin d'utiliser des esclaves, des maîtres ou des clusters).
✔ Générez des identifiants véritablement uniques (appelés MDGUID).
➔ PHP 7+ & Apache/Nginx (utilise les fonctionnalités de PHP 7 et supérieur).
➔ MySQL 5.7+ (pour clarifier, MySQL 5.7 fonctionne bien, donc toute version supérieure à MySQL 5.7 serait géniale).
➔ Un pilote de base de données compatible PDO (en savoir plus à ce sujet ici).
Vous pouvez utiliser MultiDatabasePDO à des fins personnelles, éducatives et commerciales dans les conditions suivantes :
➔ Vous ne vendez pas, ne donnez pas ou n'hébergez pas (copies originales ou éditées) de cette bibliothèque à d'autres utilisateurs, vous devez les lier à ce référentiel.
➔ Vous ne modifiez pas le commentaire dans le fichier et ne le supprimez pas, cela me ferait penser que vous souhaitez le revendiquer comme le vôtre.
1. CONNEXION À VOS BASES DE DONNÉES !
Avant de commencer, assurez-vous de bien comprendre les bases du PDO. Téléchargez simplement la dernière version et incluez le fichier nommé MultiDatabasePDO .php
qui inclura automatiquement toutes les classes supplémentaires pour vous. Votre code de configuration devrait ressembler à :
require " ./ MultiDatabasePDO / MultiDatabasePDO .php " ;
$ multiPDO = new WulfGamesYT MultiDatabasePDO MultiDatabasePDO ([
[ " mysql " , " 1.1.1.1 " , " database_1 " , " username " , " password " ],
[ " mysql " , " 2.2.2.2 " , " database_2 " , " username " , " password " ]
]);
Nous devons maintenant vérifier les erreurs à l’aide d’une fonction simple appelée hasAnyErrors()
. Vous pouvez lister les connexions qui échouent avec la fonction getFailedConnections()
.
if ( $ multiPDO -> hasAnyErrors ()) {
error_log ( " Error connecting to database(s): " . $ multiPDO -> getFailedConnections ());
exit ( " Error connecting to our main databases! Please try again later. " );
}
2. LISEZ LE WIKI ET UTILISEZ CETTE BIBLIOTHÈQUE DE LA BONNE MANIÈRE !
Ensuite, je recommanderais de lire la documentation sur le wiki pour comprendre ce que fait chaque fonction. Aussi, il est important de savoir qu'il existe quelques différences entre cette librairie et la librairie PDO standard, notamment :
execute()
, utilisez bindValue()
ou bindValues()
.ORDER BY
, LIMIT
ou OFFSET
dans vos requêtes SQL, veuillez plutôt consulter ce guide.AUTO INCREMENT
pour les colonnes, mais si vous avez une colonne ID, utilisez cette fonction. 3. CONFIGURATION DE VOS BASES DE DONNÉES ET TABLES !
Si vous envisagez d'utiliser MultiDatabasePDO , vous devez vous assurer que toutes vos tables de chaque base de données à laquelle vous vous connectez sont structurées de la même manière :
À titre d'exemple, imaginez que nous ayons les 2 tables suivantes provenant de 2 bases de données différentes, toutes deux structurées et nommées de la même manière. Chaque exemple de ce README ci-dessous utilise ces tableaux. En réalité, vos tables auraient des milliers, voire des millions de lignes avant que vous deviez envisager d'utiliser MultiDatabasePDO (ou si vous souhaitez un jour vous préparer à la mise à l'échelle de votre application Web).
Table "Utilisateurs", de la base de données 1.
ID (int) | Nom d'utilisateur (texte) | PassHash (texte) | Courriel (texte) | Prénom (texte) | Nom (texte) |
---|---|---|---|---|---|
1 | WulfGamesYT | ThLfkbQFyvDx | [email protected] | Liam | Allen |
2 | IndianaJones55 | npxCn975RSaP | [email protected] | Indiana | Jones |
3 | YaBoiTableFlipper69 | BT7V2U6VJv2d | [email protected] | Steve | Jones |
Table "Utilisateurs", de la base de données 2.
ID (int) | Nom d'utilisateur (texte) | PassHash (texte) | Courriel (texte) | Prénom (texte) | Nom (texte) |
---|---|---|---|---|---|
4 | Vraiment mec | 6XBmD4bzGP87 | [email protected] | Liam | Maçon |
5 | EnferOuaisBoi | LeyTpTwvvMUM | [email protected] | Julie | Crosby |
Pour sélectionner des lignes dans TOUTES les bases de données et TOUTES les tables, vous pouvez simplement faire, comme un PDO normal en PHP :
$ selectQuery = $ multiPDO -> prepare ( " SELECT ID, Username, Email FROM Users WHERE Username = :username " );
$ selectQuery -> bindValue ( " :username " , " WulfGamesYT " );
$ selectQuery -> execute ();
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
Supposons que nous ayons un formulaire et que vous puissiez POSTER les informations dans votre fichier PHP et que vous souhaitiez insérer 1 nouvel enregistrement dans une table d'une base de données appelée "Utilisateurs", tout ce que vous avez à faire est ce qui suit. Notez que cela sera inséré dans le deuxième tableau des exemples de tableaux ci-dessus car il a le nombre de lignes le plus bas. Au lieu de saisir un identifiant manuel et d'utiliser le type de données int dans vos tables, utilisez la fonction generateMDGUID()
ci-dessous.
$ longSQL = " INSERT INTO Users VALUES (6, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
Notez qu'avec la méthode execute()
que nous avons passée dans 2 paramètres, cela est nécessaire pour insérer de nouvelles lignes, car cela indique à la classe que nous insérons (en passant : true) une nouvelle ligne dans une table appelée "Utilisateurs". Ne placez pas les entrées utilisateur non fiables comme deuxième paramètre, car une injection SQL peut se produire.
C'est fondamentalement la même chose qu'une requête SELECT, cela mettra à jour TOUTES les tables de TOUTES les bases de données qui correspondent à la clause WHERE si elle est spécifiée, par exemple :
$ updateQuery = $ multiPDO -> prepare ( " UPDATE Users SET Username = :newusername WHERE Username = :oldusername " );
$ updateQuery -> bindValues ([ " :newusername " => " MyFancyUsername " , " :oldusername " => " WulfGamesYT " ]);
$ updateQuery -> execute ();
Maintenant, si nous exécutons une requête SELECT sur TOUTES les tables nommées "Utilisateurs", nous verrons la ligne mise à jour.
Encore une fois, tout ce que nous devons faire est :
$ deleteQuery = $ multiPDO -> prepare ( " DELETE FROM Users WHERE Username = :username " );
$ deleteQuery -> bindValue ( " :username " , " MyFancyUsername " );
$ deleteQuery -> execute ();
Maintenant, si nous exécutons une requête SELECT sur TOUTES les tables nommées "Utilisateurs", nous verrons la ligne mise à jour.
Il est important de noter que vous ne pouvez pas utiliser ORDER BY
, LIMIT
ou OFFSET
dans vos requêtes SQL pour trier toutes les lignes de chaque base de données, uniquement les lignes de cette table actuelle dans 1 base de données. Au lieu de cela, vous devez utiliser les fonctions suivantes disponibles avec MultiDatabasePDO qui facilitent l'organisation de vos résultats/lignes finaux.
Trier les résultats (au lieu de « ORDER BY ») : vous pouvez trier vos résultats comme vous le feriez dans les requêtes SQL avec « ASC » ou « DESC » passé dans le deuxième paramètre de la méthode sortBy()
.
Voici comment trier les colonnes numériques :
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "ID" column in descending order.
$ selectQuery -> sortBy ( " ID " , " DESC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
Voici comment trier les colonnes de chaîne/objet :
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "Username" column in ascending order.
$ selectQuery -> sortBy ( " Username " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
Vous pouvez commander plusieurs colonnes, ou plusieurs fois si vous le souhaitez. Dans l'exemple ci-dessous, nous trierons une colonne appelée « Prénom » par ordre décroissant, puis une colonne appelée « LastName ». Cela listera les utilisateurs dans le tableau par ordre alphabétique. S'ils ont le même prénom, le système les triera également par nom de famille. Mettez la colonne d'ordre la moins importante en premier, puis la plus importante à la fin comme vous pouvez le voir dans le code :
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort both the columns.
$ selectQuery -> sortBy ( " LastName " , " ASC " );
$ selectQuery -> sortBy ( " FirstName " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
Au lieu de AUTO INCREMENT
, ou si vous avez besoin d'un moyen de générer des GUID véritablement uniques sur plusieurs bases de données, vous pouvez utiliser notre fonction appelée generateMDGUID()
. Vous trouverez ci-dessous un guide sur leur fonctionnement et la manière dont ils garantissent une unicité à 100 %, ainsi qu'un exemple d'utilisation de la fonction lors de l'insertion de nouvelles lignes dans vos tableaux.
Comment fonctionne MDGUID et garantit son unicité :
Exemple:
//Here we generate the MDGUID.
$ mdguid = $ multiPDO -> generateMDGUID ();
$ longSQL = " INSERT INTO Users VALUES (:mdguid, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :mdguid " => $ mdguid ,
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
Si vous avez besoin de poser une question, contactez-moi sur Twitter.
Twitter : https://www.twitter.com/WulfGamesYT
Si vous aimez cette bibliothèque, pensez à la mettre en vedette et à la partager avec d'autres développeurs qui aiment PHP et MySQL ! Restez à l'écoute des mises à jour et assurez-vous de me signaler tout bug que vous trouvez. Merci d'avoir lu!