作業が多すぎるため、このプロジェクトは解散しました。このアイデアは最初はばかげているように見えましたが、ページネーションを行う際に多くの問題が見つかるまでは実際に機能しました。パフォーマンスの観点からは、クラスタリングが最適だと思います。これは自己責任で使用してください。このプロジェクトを作るのは楽しかったです。
これは、PDO を使用して複数の MySQL データベースに接続できるようにする、無料で使いやすい、軽量かつ強力なPHP ライブラリです。これは MySQL 専用に構築しましたが、PostgreSQL、MariaDB、CouchDB などでも動作すると思います。これは SQL データベース用なので、MongoDB や Apache Cassandra などのデータベース管理システムでは動作しないことに注意してください。
✔ 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 つのテーブルがあり、構造も名前も同じであると想像してください。以下のこの README の各例では、これらの表を使用します。現実的には、 MultiDatabasePDOの使用を検討する必要がある前に (または、Web アプリのスケーリングの準備をしたい場合)、テーブルには数百万行ではないにしても、数千行が含まれることになります。
データベース 1 の「Users」テーブル。
ID (整数) | ユーザー名 (テキスト) | パスハッシュ (テキスト) | メール(テキスト) | 名 (テキスト) | 姓 (テキスト) |
---|---|---|---|---|---|
1 | WulfGamesYT | ThLfkbQFyvDx | [email protected] | リアム | アレン |
2 | インディアナジョーンズ55 | npxCn975RSaP | im@インディアナ.ジョーンズ | インディアナ州 | ジョーンズ |
3 | YaBoiTableFlipper69 | BT7V2U6VJv2d | [email protected] | スティーブ | ジョーンズ |
データベース 2 の「Users」テーブル。
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 ); }
たとえば、フォームがあり、その情報を PHP ファイルに POST でき、「Users」というデータベースからテーブルに 1 つの新しいレコードを挿入したい場合、必要なのは次のことだけです。これは、行数が最も少ないため、上記のテーブル例の 2 番目のテーブルに挿入されることに注意してください。手動 ID を入力してテーブルで int データ型を使用する代わりに、以下の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 " );
2 つのパラメーターを渡したexecute()
メソッドでは、これは新しい行を挿入するために必要であることに注意してください。これは、「Users」というテーブルに新しい行を (true を渡すことによって) 挿入することをクラスに指示するためです。 SQL インジェクションが発生する可能性があるため、信頼できないユーザー入力を 2 番目のパラメーターとして指定しないでください。
これは基本的に 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」の代わりに): sortBy()
メソッドの 2 番目のパラメーターに「ASC」または「DESC」を渡すことで、SQL クエリと同じように結果を順序付けできます。
数値列を順序付ける方法は次のとおりです。
$ 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 までご連絡ください。
Twitter: https://www.twitter.com/WulfGamesYT
このライブラリが気に入ったら、スターを付けて、PHP や MySQL が好きな他の開発者と共有することを検討してください。アップデートをお待ちください。バグを見つけたら必ず私に報告してください。読んでいただきありがとうございます!