Ich habe dieses Projekt aufgelöst, weil es zu viel Arbeit macht. Obwohl die Idee zunächst albern schien, funktionierte sie tatsächlich, bis ich viele Probleme bei der Paginierung feststellte und im Hinblick auf die Leistung denke ich, dass Clustering am besten wäre. Die Nutzung erfolgt auf eigene Gefahr, es hat Spaß gemacht, dieses Projekt zu machen.
Dies ist eine kostenlose , benutzerfreundliche , leichte und leistungsstarke PHP-Bibliothek, die Ihnen die Verbindung zu mehreren MySQL-Datenbanken mit PDO ermöglicht. Ich habe dies speziell für MySQL erstellt, aber ich glaube, dass es mit PostgreSQL, MariaDB, CouchDB usw. funktioniert. Denken Sie daran, dass dies für SQL-Datenbanken ist und daher nicht mit Datenbankverwaltungssystemen wie MongoDB und Apache Cassandra funktioniert.
✔ Stellen Sie über PDO eine Verbindung zu mehreren MySQL-Datenbanken her.
✔ Zeilen aus mehreren Datenbanken abrufen.
✔ Führen Sie Einfügungsabfragen effizient durch, indem Sie nur eine Abfrage durchführen, anstatt neue Zeilen in allen Tabellen in jeder Datenbank hinzuzufügen.
✔ Ergebnisse/Zeilen einfach sortieren, begrenzen und verwalten.
✔ Einfache Skalierung durch einfaches Hinzufügen weiterer Datenbanken (keine Notwendigkeit, Slaves, Master oder Cluster zu verwenden).
✔ Generieren Sie wirklich eindeutige Kennungen (sogenannte MDGUIDs).
➔ PHP 7+ und Apache/Nginx (verwendet Funktionen für PHP 7 und höher).
➔ MySQL 5.7+ (zur Verdeutlichung: MySQL 5.7 funktioniert einwandfrei, daher wäre jede höhere Version als MySQL 5.7 großartig).
➔ Ein PDO-kompatibler Datenbanktreiber (mehr dazu hier).
Sie dürfen MultiDatabasePDO für persönliche, pädagogische und kommerzielle Zwecke unter den folgenden Bedingungen nutzen:
➔ Sie verkaufen, geben oder hosten diese Bibliothek nicht (im Original oder in bearbeiteten Kopien) an andere Benutzer, Sie müssen sie mit diesem Repository verknüpfen.
➔ Sie ändern den Kommentar in der Datei nicht und entfernen ihn auch nicht, da ich sonst den Eindruck erwecke, dass Sie ihn als Ihren eigenen beanspruchen möchten.
1. VERBINDUNG MIT IHREN DATENBANKEN!
Bevor Sie beginnen, stellen Sie bitte sicher, dass Sie die Grundlagen von PDO verstanden haben. Laden Sie einfach die neueste Version herunter und fügen Sie die Datei mit dem Namen MultiDatabasePDO .php
hinzu, die automatisch alle zusätzlichen Klassen für Sie enthält. Ihr Setup-Code sollte wie folgt aussehen:
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 " ]
]);
Jetzt müssen wir mithilfe einer einfachen Funktion namens hasAnyErrors()
nach Fehlern suchen. Mit der Funktion getFailedConnections()
können Sie fehlgeschlagene Verbindungen auflisten.
if ( $ multiPDO -> hasAnyErrors ()) {
error_log ( " Error connecting to database(s): " . $ multiPDO -> getFailedConnections ());
exit ( " Error connecting to our main databases! Please try again later. " );
}
2. LESEN SIE DAS WIKI UND NUTZEN SIE DIESE BIBLIOTHEK RICHTIG!
Als nächstes würde ich empfehlen, die Dokumentation im Wiki zu lesen, um zu verstehen, was die einzelnen Funktionen bewirken. Außerdem ist es wichtig zu wissen, dass es einige Unterschiede zwischen dieser Bibliothek und der Standard-PDO-Bibliothek gibt, insbesondere:
execute()
kein Array von Platzhaltern/Werten übergeben, sondern bindValue()
oder bindValues()
verwenden.ORDER BY
, LIMIT
oder OFFSET
verwenden. Bitte lesen Sie stattdessen diese Anleitung.AUTO INCREMENT
für Spalten. Nutzen Sie stattdessen diese Funktion, wenn Sie eine ID-Spalte haben. 3. EINRICHTEN IHRER DATENBANKEN UND TABELLEN!
Wenn Sie MultiDatabasePDO verwenden möchten, müssen Sie sicherstellen, dass alle Ihre Tabellen aus jeder Datenbank, mit der Sie eine Verbindung herstellen, auf die gleiche Weise strukturiert sind:
Stellen Sie sich zum Beispiel vor, wir hätten die folgenden zwei Tabellen aus zwei verschiedenen Datenbanken, beide gleich strukturiert und benannt. Jedes Beispiel in dieser README-Datei unten verwendet diese Tabellen. Realistisch gesehen würden Ihre Tabellen Tausende, wenn nicht Millionen von Zeilen haben, bevor Sie die Verwendung von MultiDatabasePDO in Betracht ziehen müssten (oder wenn Sie sich jemals auf die Skalierung Ihrer Web-App vorbereiten möchten).
Tabelle „Benutzer“, aus Datenbank 1.
ID (int) | Benutzername (Text) | PassHash (Text) | E-Mail (Text) | Vorname (Text) | Nachname (Text) |
---|---|---|---|---|---|
1 | WulfGamesYT | ThLfkbQFyvDx | [email protected] | Liam | Allen |
2 | IndianaJones55 | npxCn975RSaP | [email protected] | Indiana | Jones |
3 | YaBoiTableFlipper69 | BT7V2U6VJv2d | [email protected] | Steve | Jones |
Tabelle „Benutzer“, aus Datenbank 2.
ID (int) | Benutzername (Text) | PassHash (Text) | E-Mail (Text) | Vorname (Text) | Nachname (Text) |
---|---|---|---|---|---|
4 | Wirklich Alter | 6XBmD4bzGP87 | [email protected] | Liam | Mason |
5 | HellYeaBoi | LeyTpTwvvMUM | [email protected] | Julie | Crosby |
Um Zeilen aus ALLEN Datenbanken und ALLEN Tabellen auszuwählen, können Sie einfach wie bei einem normalen PDO in PHP Folgendes tun:
$ 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 ); }
Angenommen, wir hätten ein Formular und Sie könnten die Informationen in Ihre PHP-Datei POSTEN, und Sie möchten einen neuen Datensatz aus einer Datenbank namens „Benutzer“ in eine Tabelle einfügen. Alles, was Sie tun müssen, ist Folgendes. Beachten Sie, dass diese in die zweite Tabelle der obigen Beispieltabellen eingefügt wird, da sie die niedrigste Zeilenanzahl aufweist. Anstatt eine manuelle ID einzugeben und den Datentyp int in Ihren Tabellen zu verwenden, verwenden Sie die unten stehende Funktion generateMDGUID()
.
$ 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 " );
Beachten Sie, dass bei der execute()
, die wir zwei Parameter eingefügt haben, dies zum Einfügen neuer Zeilen erforderlich ist, da es der Klasse mitteilt, dass wir (durch Übergabe von: true) eine neue Zeile in eine Tabelle namens „Benutzer“ einfügen. Geben Sie keine nicht vertrauenswürdigen Benutzereingaben als zweiten Parameter ein, da es sonst zu einer SQL-Injection kommen kann.
Dies ist im Grunde dasselbe wie eine SELECT-Abfrage. Dadurch werden ALLE Tabellen in ALLEN Datenbanken aktualisiert, die der WHERE-Klausel entsprechen, sofern angegeben, zum Beispiel:
$ updateQuery = $ multiPDO -> prepare ( " UPDATE Users SET Username = :newusername WHERE Username = :oldusername " );
$ updateQuery -> bindValues ([ " :newusername " => " MyFancyUsername " , " :oldusername " => " WulfGamesYT " ]);
$ updateQuery -> execute ();
Wenn wir nun eine SELECT-Abfrage für ALLE Tabellen mit dem Namen „Benutzer“ ausführen, sehen wir die aktualisierte Zeile.
Auch hier müssen wir nur Folgendes tun:
$ deleteQuery = $ multiPDO -> prepare ( " DELETE FROM Users WHERE Username = :username " );
$ deleteQuery -> bindValue ( " :username " , " MyFancyUsername " );
$ deleteQuery -> execute ();
Wenn wir nun eine SELECT-Abfrage für ALLE Tabellen mit dem Namen „Benutzer“ ausführen, sehen wir die aktualisierte Zeile.
Es ist wichtig zu beachten, dass Sie in Ihren SQL-Abfragen nicht ORDER BY
, LIMIT
oder OFFSET
verwenden können, um alle Zeilen aus jeder Datenbank zu ordnen, sondern nur die Zeilen in der aktuellen Tabelle in einer Datenbank. Stattdessen müssen Sie die folgenden Funktionen verwenden, die mit MultiDatabasePDO verfügbar sind und die die Organisation Ihrer Endergebnisse/Zeilen erleichtern.
Sortieren von Ergebnissen (anstelle von „ORDER BY“): Sie können Ihre Ergebnisse genau wie in SQL-Abfragen ordnen, indem Sie „ASC“ oder „DESC“ an den zweiten Parameter der Methode sortBy()
übergeben.
So bestellen Sie Zahlenspalten:
$ 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 ); }
So ordnen Sie String-/Objektspalten an:
$ 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 ); }
Sie können mehrere Spalten bestellen, oder auch mehrere, wenn Sie möchten. Im folgenden Beispiel ordnen wir eine Spalte mit dem Namen „Vorname“ in absteigender Reihenfolge an, dann eine Spalte mit dem Namen „Nachname“. Dadurch werden die Benutzer in der Tabelle in alphabetischer Reihenfolge aufgelistet. Wenn sie denselben Vornamen haben, wird auch nach dem Nachnamen sortiert. Platzieren Sie die am wenigsten wichtige Reihenfolgenspalte zuerst und dann die wichtigste am Ende, wie Sie im Code sehen können:
$ 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 ); }
Anstelle von AUTO INCREMENT
oder wenn Sie eine Möglichkeit benötigen, wirklich eindeutige GUIDs über mehrere Datenbanken hinweg zu generieren, können Sie unsere Funktion namens generateMDGUID()
verwenden. Nachfolgend finden Sie eine Anleitung, wie sie funktionieren und 100 % Eindeutigkeit garantieren, sowie ein Beispiel für die Verwendung der Funktion beim Einfügen neuer Zeilen in Ihre Tabellen.
Wie MDGUID funktioniert und Einzigartigkeit garantiert:
Beispiel:
//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 " );
Wenn Sie eine Frage stellen müssen, kontaktieren Sie mich auf Twitter.
Twitter: https://www.twitter.com/WulfGamesYT
Wenn Ihnen diese Bibliothek gefällt, denken Sie bitte darüber nach, sie zu markieren und sie mit anderen Entwicklern zu teilen, die PHP und MySQL mögen! Bleiben Sie auf dem Laufenden, um Updates zu erhalten, und melden Sie mir unbedingt alle Fehler, die Sie finden. Vielen Dank fürs Lesen!