我已經解散了這個項目,因為它的工作量太大,雖然這個想法一開始看起來確實很愚蠢,但實際上它確實有效,直到我發現分頁時存在很多問題,並且就性能而言,我認為集群是最好的。使用它需要您自擔風險,製作這個項目很有趣。
這是一個免費、易於使用、輕量級且功能強大的PHP 程式庫,可讓您使用 PDO 連接到多個 MySQL 資料庫。我專門為 MySQL 建立了這個,但我相信這將適用於 PostgreSQL、MariaDB、CouchDB 等。
✔ 使用 PDO 連接到多個 MySQL 資料庫。
✔ 從多個資料庫檢索行。
✔ 只需執行 1 個查詢即可有效率地執行插入查詢,而不是在每個資料庫的所有資料表中新增一行。
✔ 輕鬆排序、限制和管理結果/行。
✔ 只需新增更多資料庫即可輕鬆擴展(無需使用從資料庫、主資料庫或叢集)。
✔ 產生真正唯一的識別碼(稱為 MDGUID)。
➔ PHP 7+ 和 Apache/Nginx(使用 PHP 7 及更高版本的功能)。
➔ MySQL 5.7+(澄清 MySQL 5.7 工作正常,因此任何高於 MySQL 5.7 的版本都很好)。
➔ 與 PDO 相容的資料庫驅動程式(在此處閱讀有關此內容的更多資訊)。
您可以根據以下條款將MultiDatabasePDO用於個人、教育和商業用途:
➔ 您不得向其他使用者出售、贈送或託管此程式庫(原始或編輯的副本),您必須將他們連結到此儲存庫。
➔ 您不要更改文件中的註釋或將其刪除,這樣做會讓我認為您想將其聲明為您自己的。
1. 連接到您的資料庫!
在開始之前,請確保您了解 PDO 的基礎知識。只需下載最新版本並包含名為MultiDatabasePDO .php
的文件,該文件將自動為您包含所有額外的類別。您的設定代碼應如下所示:
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 " ]
]);
現在我們需要使用一個名為hasAnyErrors()
簡單函數來檢查是否有任何錯誤。您可以使用函數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. 閱讀 Wiki 並以正確的方式使用該庫!
接下來,我建議閱讀 wiki 上的文件以了解每個函數的作用。另外,重要的是要知道該庫與標準 PDO 庫之間存在一些差異,特別是:
execute()
方法傳遞佔位符/值數組,請使用bindValue()
或bindValues()
。ORDER BY
、 LIMIT
或OFFSET
,請參閱本指南。AUTO INCREMENT
,如果您有 ID 列,請使用此函數。 3. 設定您的資料庫和表格!
如果您打算使用MultiDatabasePDO ,則必須確保您連接到的每個資料庫中的所有資料表的結構都相同:
出於範例目的,假設我們有來自 2 個不同資料庫的以下 2 個表,它們的結構和名稱都相同。下面的自述文件中的每個範例都使用這些表格。實際上,在您需要考慮使用MultiDatabasePDO之前(或如果您想準備好擴展您的 Web 應用程式),您的表將有數千甚至數百萬行。
「Users」表,來自資料庫 1。
ID(整數) | 使用者名稱(文字) | 密碼哈希(文字) | 電子郵件(文字) | 名字(文字) | 姓氏(文字) |
---|---|---|---|---|---|
1 | WulfGamesYT | ThLfkbQFyvDx | [email protected] | 利亞姆 | 艾倫 |
2 | 印第安納瓊斯55 | npxCn975RSaP | 我@indiana.jones | 印第安納州 | 瓊斯 |
3 | YaBoiTableFlipper69 | BT7V2U6VJv2d | [email protected] | 史蒂夫 | 瓊斯 |
「Users」表,來自資料庫 2。
ID(整數) | 使用者名稱(文字) | 密碼哈希(文字) | 電子郵件(文字) | 名字(文字) | 姓氏(文字) |
---|---|---|---|---|---|
4 | 真的哥們 | 6XBmD4bzGP87 | [email protected] | 利亞姆 | 石匠 |
5 | 地獄耶博伊 | LeyTpTwvvMUM | [email protected] | 朱莉 | 克羅斯比 |
要從所有資料庫和所有表中選擇行,您可以簡單地執行以下操作,就像 PHP 中的普通 PDO 一樣:
$ 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 ); }
假設我們有一個表單,您可以將資訊 POST 到您的 PHP 文件,並且您想要從名為「Users」的資料庫中向表中插入 1 個新記錄,您所需要做的就是以下操作。請注意,這將插入到上面範例表中的第二個表中,因為它的行數最少。使用下面的generateMDGUID()
函數,而不是手動輸入ID 並在表中使用int 資料類型。
$ 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 " );
請注意,我們在execute()
方法中傳遞了2 個參數,這是插入新行所必需的,因為它告訴類別我們要在名為「Users」的表中插入(透過傳入:true)新行。不要將不受信任的使用者輸入作為第二個參數,因為可能會發生 SQL 注入。
這與執行 SELECT 查詢基本上相同,這將更新所有資料庫中與 WHERE 子句相符的所有表(如果指定),例如:
$ updateQuery = $ multiPDO -> prepare ( " UPDATE Users SET Username = :newusername WHERE Username = :oldusername " );
$ updateQuery -> bindValues ([ " :newusername " => " MyFancyUsername " , " :oldusername " => " WulfGamesYT " ]);
$ updateQuery -> execute ();
現在,如果我們對所有名為「Users」的表執行 SELECT 查詢,我們將看到更新的行。
再說一次,我們需要做的是:
$ deleteQuery = $ multiPDO -> prepare ( " DELETE FROM Users WHERE Username = :username " );
$ deleteQuery -> bindValue ( " :username " , " MyFancyUsername " );
$ deleteQuery -> execute ();
現在,如果我們對所有名為「Users」的表執行 SELECT 查詢,我們將看到更新的行。
需要注意的是,您無法在 SQL 查詢中使用ORDER BY
、 LIMIT
或OFFSET
來對每個資料庫中的所有行進行排序,只能對 1 個資料庫中目前表中的行進行排序。相反,您必須使用MultiDatabasePDO提供的以下函數,以便輕鬆組織最終結果/行。
對結果排序(而不是「ORDER BY」):您可以像在 SQL 查詢中一樣對結果進行排序,將「ASC」或「DESC」傳遞到sortBy()
方法的第二個參數中。
這是對數字列進行排序的方式:
$ 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 ); }
這是對字串/物件列進行排序的方式:
$ 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 ); }
如果需要,您可以訂購多列或多次。在下面的範例中,我們將按降序對名為「FirstName」的欄位進行排序,然後對名為「LastName」的欄位進行排序。這將按字母順序列出表中的用戶,如果他們具有相同的名字,那麼它也會按姓氏排序。將最不重要的順序列放在前面,然後將最重要的順序列放在最後,如程式碼所示:
$ 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 ); }
除了AUTO INCREMENT
之外,或者如果您需要一種跨多個資料庫產生真正唯一的 GUID 的方法,您可以使用我們的函數generateMDGUID()
。以下是有關它們如何運作以及如何保證 100% 唯一性的指南,以及如何在向表中插入新行時使用該函數的範例。
MDGUID 的工作原理和保證唯一性:
例子:
//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 " );
如果您需要提問,請在 Twitter 上與我聯絡。
推特:https://www.twitter.com/WulfGamesYT
如果您喜歡這個函式庫,請考慮為它加星標並與喜歡 PHP 和 MySQL 的開發人員分享!請繼續關注更新,並務必向我報告您發現的任何錯誤。感謝您的閱讀!