PHP-DbHandler は、MySQL データベースとの対話を簡素化するために設計された PHP ライブラリです。クエリの構築と実行、トランザクションの管理、PDO 接続を介したデータベース スキーマの処理のための包括的なツール セットを提供します。
Where
とHaving
句の作成or
and and
演算子Composer 経由でパッケージをインストールします。
composer require tribal2/db-handler
まず、 Db
インスタンスを作成します。
use Tribal2 DbHandler Core PDOWrapper ;
use Tribal2 DbHandler Db ;
use Tribal2 DbHandler DbConfig ;
$ config = DbConfig:: create ( ' my_database ' )
-> withUser ( ' username ' )
-> withPassword ( ' password ' )
-> withHost ( ' localhost ' ) // Optional. Default: 'localhost'
-> withPort ( 3306 ) // Optional. Default: 3306
-> withCharset ( ' utf8mb4 ' ); // Optional. Default: 'utf8mb4'
$ pdoWrapper = new PDOWrapper (
$ config ,
// Optional PsrLogLoggerInterface instance.
// $logger, // Default: PsrLogNullLogger
);
$ db = new Db (
$ pdoWrapper ,
// Optional PsrSimpleCacheCacheInterface instance.
// $cache, // Default: NULL
);
Where
とHaving
句の作成Where クラスは、クエリ条件を構築する柔軟かつ直感的な方法を提供します。さまざまな比較演算子や論理演算子をサポートしているため、データベースからデータを選択またはフィルタリングするための基準を正確に定義できます。
これらのメソッドは、条件をカプセル化する Where オブジェクトと、安全で効率的なクエリのためのパラメータ化された値を返します。
Where 句は、クエリ構文の構築を簡素化するだけでなく、SQL インジェクションに関連するリスクを内部で管理することでセキュリティを強化します。このライブラリは、値を PDO 名前付きパラメータに自動的に置き換え、適切な PDO データ型を使用してバインドを実行します。これらの重要な側面を処理することで、クエリがクリーンで保守しやすいだけでなく、安全であることも保証されます。
データベース クエリの入力を手動でサニタイズすることを心配する必要はもうありません。このライブラリは、データベース駆動型アプリケーションで最も一般的なセキュリティ脆弱性の 1 つである SQL インジェクションを防ぐ方法でステートメントを準備します。このアプローチにより、データベースの対話が安全かつ効率的に処理されることを信頼して、アプリケーションのビジネス ロジックに集中できます。
$ where = Where:: equals ( ' status ' , ' active ' );
// Output: `status` = :status___1
$ where = Where:: notEquals ( ' category ' , ' archived ' );
// Output: `category` <> :category___1
$ where = Where:: greaterThan ( ' price ' , 100 );
// Output: `price` > :price___1
$ where = Where:: greaterThanOrEquals ( ' price ' , 100 );
// Output: `price` >= :price___1
$ where = Where:: lessThan ( ' price ' , 50 );
// Output: `price` < :price___1
$ where = Where:: lessThanOrEquals ( ' price ' , 50 );
// Output: `price` <= :price___1
$ where = Where:: isNull ( ' description ' );
// Output: `description` IS NULL
$ whereNotNull = Where:: isNotNull ( ' description ' );
// Output: Output: `description` IS NOT NULL
$ where = Where:: like ( ' name ' , ' %Apple% ' );
// Output: `name` LIKE :name___1
$ where = Where:: notLike ( ' name ' , ' %Apple% ' );
// Output: `name` NOT LIKE :name___1
$ where = Where:: between ( ' date ' , ' 2021-01-01 ' , ' 2021-12-31 ' );
// Output: `date` BETWEEN :date___1 AND :date___2
$ where = Where:: notBetween ( ' date ' , ' 2021-01-01 ' , ' 2021-12-31 ' );
// Output: `date` NOT BETWEEN :date___1 AND :date___2
$ where = Where:: in ( ' status ' , [ ' active ' , ' pending ' , ' on-hold ' ]);
// Output: `status` IN (:status___1, :status___2, :status___3)
$ where = Where:: notIn ( ' status ' , [ ' active ' , ' pending ' , ' on-hold ' ]);
// Output: `status` NOT IN (:status___1, :status___2, :status___3)
or
and and
演算子 $ where1 = Where:: equals ( ' status ' , ' active ' );
$ where2 = Where:: greaterThan ( ' price ' , 100 );
$ orWhere = Where:: or ( $ where1 , $ where2 );
// Output: (`status` = :status___1 OR `price` > :price___1)
$ andWhere = Where:: and ( $ where1 , $ where2 );
// Output: (`status` = :status___1 AND `price` > :price___1)
or
およびand
演算子をネストすることもできます。
$ where3 = Where:: equals ( ' category ' , ' archived ' );
$ combinedWhere = Where:: and ( $ where3 , $ orWhere );
// Output: (`category` = :category___1 AND (`status` = :status___1 OR `price` > :price___1))
次のサブセクションでは、このライブラリを使用してクエリを作成および実行する方法を説明します。簡単にするために、 $db
変数がDb
クラスのインスタンスであると仮定します。
以下のすべての例では、クエリの構築と実行を分離しました。このアプローチでは、クエリ オブジェクトを再利用し、異なるパラメーターを使用して複数回実行できますが、次のようにメソッドを連鎖させて、単一のステートメントでクエリを作成および実行することもできます。
$ results = $ db
-> select ()
-> columns ([ ' column1 ' , ' column2 ' ])
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column2 ' , 1 ))
-> fethAll ();
$ select = $ db -> select ()
-> columns ([ ' column1 ' , ' column2 ' ])
-> column ( ' column3 ' )
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column2 ' , 1 )) // See "Where Clauses" section above
-> groupBy ( ' column1 ' )
-> having (Where:: equals ( ' sum(column2) ' , 5 ))
-> orderBy ( ' column3 ' , ' ASC ' )
-> limit ( 10 )
-> offset ( 5 );
$ sql = $ select -> getSql ();
// $sql:
// SELECT
// `column1`,
// `column2`,
// `column3`
// FROM
// `table_name`
// WHERE
// `column2` = :column2___1
// GROUP BY
// `column1`
// HAVING
// `sum(column2)` = :sum_column2____1
// ORDER BY
// `column3` ASC
// LIMIT
// 10
// OFFSET
// 5;
結果の取得:
デフォルトでは、 fetchAll()
メソッドはオブジェクトの配列を返します (デフォルトではPDO::FETCH_OBJ
を使用)。各オブジェクトはデータ行を表します。クエリを実行する前に、 PDO::FETCH_ASSOC
定数を引数としてfetchMethod()
ビルダー メソッドに渡すことで、結果を連想配列の配列としてフェッチすることもできます。
$ allResults = $ select -> fetchAll ();
$ firstResult = $ select -> fetchFirst ();
$ column1Values = $ select -> fetchColumn ( ' column1 ' );
$ column3DistinctValues = $ select -> fetchDistincts ( ' column3 ' );
// Output: object(FetchResult) {
// data => array(n) {
// [0]...
// [1]...
// [n-1]...
// },
// count => int(n)
// }
次のコマンドを使用して結果の数を取得することもできます。
$ countResults = $ select -> fetchCount ();
// Output: 5
ページネーション:
大規模なデータセットを効率的に処理し、データ ナビゲーションのためのユーザー フレンドリーなインターフェイスを提供することは、堅牢なアプリケーションにとって不可欠です。 PHP-DbHandler のページネーション機能は、これらのニーズにエレガントに対応します。これにより、データを管理可能なチャンク (「ページ」) に分割するプロセスが簡素化され、システムやユーザーに負担をかけずに大規模なデータセットを簡単に操作できるようになります。
ページネーションの設定
クエリのページネーションを設定するには 2 つの方法があります。
paginate メソッドの使用: このメソッドを使用すると、ページごとの項目数を簡潔な方法で定義できます。これは、ページネーション用にクエリを準備する効率的な方法です。
$ select = $ db -> select ()
-> from ( ' table_name ' )
// ...
-> paginate (itemsPerPage: 10 );
制限とオフセットを手動で設定する: より詳細に制御するために、クエリの制限 (ページあたりのアイテム数) とオフセット (データセット内の開始点) を手動で指定できます。
$ select = $ db -> select ()
-> from ( ' table_name ' )
// ...
-> limit ( 10 )
-> offset ( 0 );
ページネーションによる結果の取得
ページネーションを設定したら、さまざまな方法で結果を取得し、データセット内を簡単に移動できます。
fetchPage(?int $page)
: 現在のページまたは特定のページを取得します。fetchNextPage()
: 次のページの結果を取得します。fetchPreviousPage()
: 前のページの結果を取得します。fetchFirstPage()
: 最初のページの結果を取得します。fetchLastPage()
: 最後のページの結果を取得します。これらの各メソッドは、次のプロパティを含むFetchPaginatedResult
オブジェクトを返します。
data
: 現在のページのレコードの配列。count
: データセット内のレコードの総数。page
: 現在のページ番号。perPage
: ページごとのレコード数。totalPages
: 総ページ数。 // Example output structure of FetchPaginatedResult
object (FetchPaginatedResult) {
data => array (n) {
[ 0 ]. . .
[ 1 ]. . .
[n- 1 ]. . .
},
count => int(n),
page => int( 10 ),
perPage => int( 10 ),
totalPages => int( 23 )
}
PHP-DbHandler のこのページネーション システムにより、大規模なデータセットを効果的に管理および移動できるようになり、アプリケーションの全体的なパフォーマンスとユーザー エクスペリエンスが向上します。
キャッシング:
今日のデータ駆動型アプリケーションでは、効率とパフォーマンスが鍵となります。データベース対話におけるこれらの側面を強化するために、ライブラリにはSelect
クエリ内にキャッシュ機能が含まれています。この機能はクエリ結果をキャッシュすることでパフォーマンスを向上させ、データベースの負荷を軽減し、頻繁に実行されるクエリの応答時間を短縮します。重要なのは、PSR-16 (シンプル キャッシュ) 標準に完全に準拠するように設計されており、幅広い互換性と柔軟性を確保していることです。
PSR-16 準拠のキャッシュ
Select クエリ内のキャッシュ機能は、PsrSimpleCacheCacheInterface を実装する任意のキャッシュ インスタンスを受け入れます。 PSR-16 標準への準拠は、このインターフェイスに準拠する幅広いキャッシュ ライブラリをシームレスに統合できることを意味し、アプリケーションのニーズに最適なキャッシュ ソリューションを柔軟に選択できるようになります。
Db
クラスの初期化時にPsrSimpleCacheCacheInterface
のインスタンスが提供された場合は、この手順をスキップできます。そうでない場合は、 setCache
メソッドを使用できます。 $ select = $ db -> select ()-> setCache ( $ simpleCacheInstance );
注:
Db
クラスの初期化時にキャッシュ インスタンスを指定しなかった場合は、キャッシュするSelect
クエリごとにキャッシュ インスタンスを設定する必要があります。- このメソッドは、
Select
クエリに特定のキャッシュ インスタンスを設定する場合にも使用できます。これにより、アプリケーションのニーズに応じて、さまざまなクエリに対してさまざまなキャッシュ ソリューションを使用できるようになります。
withCache
メソッドを使用して、クエリのキャッシュを有効にして構成します。欠落しているキャッシュ エントリに対するデフォルトの戻り値と、キャッシュされたデータの TTL (Time To Live) を指定できます。 $ select -> withCache (defaultValue, ttl);
注:
defaultValue
引数はオプションです。指定しない場合、ライブラリは欠落しているキャッシュ エントリに対してNULL
を返します。ttl
引数はオプションです。指定しない場合、ライブラリは PsrSimpleCache インスタンスによって設定された TTL 値を使用します。
$ allResults = $ select -> fetchAll ();
$ firstResult = $ select -> fetchFirst ();
$ column1Values = $ select -> fetchColumn ( ' column1 ' );
$ column3DistinctValues = $ select -> fetchDistincts ( ' column3 ' );
主な利点
PHP-DbHandler ライブラリのInsert
クラスは、データベース内で挿入クエリを作成および実行するプロセスを合理化します。このクラスは、複数の特性とインターフェイスを備えており、さまざまな高度な機能を使用して挿入操作を処理するための洗練されたアプローチを提供します。
クエリの生成
Insert
クラスを使用すると、挿入する列に値を動的に割り当てることができます。単一の値または複数の値を一度に追加できます。 $ insert = $ db -> insert ()
-> into ( ' table_name ' )
-> value ( ' column1 ' , ' value1 ' )
-> values ([ ' column2 ' => ' value2 ' , ' column3 ' => ' value3 ' ]);
このクラスは、値を追加する前にテーブルに列が存在するかどうかを確認し、必要な PDO バインディングも処理します。
$ rows = [
[ ' column1 ' => ' value1 ' , ' column2 ' => ' value2 ' ],
[ ' column1 ' => ' value3 ' , ' column2 ' => ' value4 ' ],
// ...
];
$ insert -> rows ( $ rows );
実行
$ success = $ insert -> execute ();
小切手
挿入操作を実行する前に、クラスは以下を自動的にチェックします。
- データベースが読み取り専用モードの場合、意図しない書き込み操作が防止されます。
- 非自動インクリメント主キーに衝突がある場合、データの整合性が確保されます。
Insert
クラスは、データベースでの挿入操作を処理するための包括的なソリューションであり、複雑な挿入タスクを効率的に管理するための使いやすさと高度な機能の両方を提供します。
PHP-DbHandler ライブラリのUpdate
クラスは、データベース内で更新クエリを構築および実行するための洗練された柔軟な方法を提供します。既存のデータベース構造とシームレスに統合するように設計されており、更新操作を効果的に管理する堅牢な機能を提供します。
クエリの生成
$ update = $ db -> update ()
-> table ( ' table_name ' )
-> set ( ' column1 ' , ' newValue1 ' )
-> set ( ' column2 ' , ' newValue2 ' );
```
2. **Conditional Updates**: Incorporate conditions into your update queries using the `where` method. This allows for precise targeting of records to be updated.
``` php
$ update -> where (Where:: equals ( ' column3 ' , ' conditionValue ' ));
実行
$ success = $ update -> execute ();
読み取り専用モード チェック: 実行前に、クラスはデータベースが読み取り専用モードであるかどうかをチェックし、意図しない書き込み操作を防ぎます。
Update
クラスは、データベース内で更新操作を構築および実行するための包括的なソリューションを表します。柔軟性、堅牢性、使いやすさの組み合わせにより、PHP アプリケーションでデータベースの更新を管理するのに理想的な選択肢となります。
PHP-DbHandler ライブラリのDelete
クラスは、データベースで削除クエリを構築および実行するための高度なアプローチを提供します。このクラスは、削除操作が正確かつ安全に実行されることを保証し、最適なクエリ処理のための重要なチェックと機能を統合します。
クエリの生成
このクラスを使用すると、条件式を使用して削除するレコードを正確にターゲット指定できます。これはwhere
メソッドによって実現され、指定された基準に基づいて特定の行を削除対象として選択できるようになります。
$ delete = $ db -> delete ()
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column ' , ' value ' ));
必須の Where 句: テーブル内のすべてのレコードが誤って削除されるのを避けるために、クラスでは
WHERE
句を指定する必要があります。これは、意図しない一括削除に対する保護として機能します。
実行
$ success = $ delete -> execute ();
このクラスは、テーブルの存在の確認やデータベースが読み取り専用モードでないことの確認など、削除操作を実行する前に重要なチェックを実行します。
Delete
クラスは、高度な制御と安全性を備えた削除操作を処理するように設計されています。これにより、データベースの構造と制約を考慮して、削除が正確に実行されることが保証されます。単純な削除タスクを実行する場合でも、複雑な削除タスクを実行する場合でも、このクラスは、それらのタスクを確実かつ安全に実行するために必要なツールを提供します。
PHP-DbHandler ライブラリのStoredProcedure
クラスは、データベースでストアド プロシージャを実行するための合理化された効率的なアプローチを提供します。このクラスは、ストアド プロシージャと対話するための堅牢な方法を提供し、パラメータ管理、実行、結果のフェッチを簡単に処理します。
クエリの生成
ストアド プロシージャ呼び出しのセットアップ: 動的パラメータ管理を使用してストアド プロシージャへの呼び出しを簡単にセットアップします。プロシージャ名とプロシージャに必要なパラメータを指定します。
$ procedure = $ db -> storedProcedure ()
-> call ( ' procedure_name ' )
-> with ( ' paramName ' , $ value )
// ...
-> with ( ' paramName2 ' , $ value );
実行
$ results = $ procedure -> execute ();
読み取り専用モードのチェック: 実行前に、クラスはデータベースが読み取り専用モードであるかどうかを検証し、書き込み操作が意図せずに実行されないようにします。
StoredProcedure
クラスは、PHP アプリケーション内でストアド プロシージャ呼び出しを処理するために不可欠なツールです。これにより、ストアド プロシージャとの対話が簡素化され、特に複雑なデータベース操作に大きく依存するアプリケーションにおいて、プロセスがより直観的になり、エラーが発生しにくくなります。
データベース トランザクションの管理は、特に複雑なデータ操作を扱うアプリケーションにおいて、データの整合性を確保する上で重要な側面です。 PHP-DbHandler はこのプロセスを簡素化し、トランザクションを処理する直感的で簡単な方法を提供します。
提供されているトランザクション管理機能を使用すると、トランザクションを簡単に開始、コミット、ロールバックでき、データベース操作を完全に制御できます。これにより、一連のデータベース操作を単一のアトミック単位として扱うことができ、完全に完了するかまったく完了しないかにかかわらず、データの一貫性と信頼性が維持されます。
$ db -> transaction -> begin ();
$ db -> transaction -> commit ();
$ db -> transaction -> rollback ();
この機能は、複数の関連するデータベース操作を一緒に実行する必要があるシナリオで特に役立ちます。トランザクション内のいずれかの操作が失敗した場合、ロールバック メソッドを使用してトランザクションの開始時から行われたすべての変更を元に戻すことができるため、データの不整合を引き起こす可能性のある部分的な更新を防ぐことができます。逆に、すべての操作が成功した場合、commit メソッドはすべての変更をデータベースに保存します。
PHP-DbHandler は、これらのトランザクション制御を利用して、アプリケーションのデータ管理が堅牢で一貫性があり、エラーに強いことを保証します。複雑なデータ入力、更新、またはバッチ プロセスを扱う場合でも、これらのトランザクション機能は、データベース操作を効果的に管理するために必要なツールを提供します。
Transaction
クラスには、複雑なトランザクション シナリオを管理するための強力な機能も導入されています。この機能を使用すると、トランザクションのコミットをグローバルに制御できます。これは、単一の包括的なトランザクション コンテキストでトランザクションを使用する複数のメソッドを包含する場合に特に便利です。
トランザクションをグローバルに処理する
自動コミットを無効にすることで、複数のトランザクション操作をより大きなトランザクションの一部として管理できます。これは、それぞれがトランザクションを個別に処理できる複数の操作を、単一のアトミック トランザクションの一部として実行する必要があるシナリオで特に役立ちます。
// Begin a transaction
$ db -> transaction -> begin ();
// Disable automatic commits
$ db -> transaction -> setCommitsModeOff ();
// Execute other methods that use transactions
// $db->transaction->begin();
// ...
// $db->transaction->commit();
// Re-enable automatic commits
$ db -> transaction -> setCommitsModeOn ();
// Commit the transaction
$ db -> transaction -> commit ();
この機能により、トランザクション操作の制御が強化され、より複雑で信頼性の高いデータ操作シナリオが可能になります。これにより、グローバル トランザクションの範囲内で行われたすべての変更がまとめてコミットされるかロールバックされ、データの整合性と一貫性が維持されます。
私たちはこのプロジェクトへの貢献を高く評価し、歓迎します。貢献に興味がある場合は、開始方法、貢献を送信するためのガイドライン、プロセスをできるだけ簡単かつ効果的にするためのヒントに関する詳細情報について、CONTRIBUTING.md ファイルをお読みください。
バグの修正、機能の追加、ドキュメントの改善など、あなたの貢献は大いに評価され、プロジェクトに大きな影響を与えます。
質問がある場合、またはコーディング前にアイデアについて話し合いたい場合は、お気軽に GitHub の問題ページで問題を開いて議論してください。
奮って投稿をお願いいたします。
このライブラリは、MIT ライセンスに基づいてライセンスされています。詳細については、LICENSE ファイルを参照してください。
サポートが必要な場合は、GitHub リポジトリの問題ページにアクセスしてください: GitHub の問題