PHP-DbHandler 是一個 PHP 函式庫,旨在簡化與 MySQL 資料庫的互動。它提供了一套全面的工具,用於建立和執行查詢、管理事務以及透過 PDO 連接處理資料庫模式。
Where
和Having
子句or
與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 資料類型執行綁定。透過處理這些關鍵方面,它可以確保您的查詢不僅乾淨、可維護,而且安全。
您不再需要擔心手動清理資料庫查詢的輸入。該程式庫負責以防止 SQL 注入的方式準備語句,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
運算符 $ 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
andand
運算子:
$ 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 中的分頁功能很好地滿足了這些需求。它簡化了將資料劃分為可管理的區塊或「頁面」的過程,從而更輕鬆地處理大型資料集,而不會壓垮系統或使用者。
設定分頁
有兩種方法可以為查詢設定分頁:
使用 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(生存時間)。 $ 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 許可證獲得許可。有關更多詳細信息,請參閱許可證文件。
如需支持,請造訪 GitHub 儲存庫上的問題頁面:GitHub 問題