PHP-DbHandler adalah perpustakaan PHP yang dirancang untuk menyederhanakan interaksi dengan database MySQL. Ia menawarkan seperangkat alat komprehensif untuk membangun dan mengeksekusi kueri, mengelola transaksi, dan menangani skema database melalui koneksi PDO.
Where
dan Having
or
dan and
operatorInstal paket melalui Komposer:
composer require tribal2/db-handler
Mulailah dengan membuat instance 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
dan Having
Kelas Where menyediakan cara yang fleksibel dan intuitif untuk menyusun kondisi kueri. Ini mendukung berbagai perbandingan dan operator logika, memungkinkan Anda menentukan secara tepat kriteria untuk memilih atau memfilter data dari database Anda.
Metode ini mengembalikan objek Where yang merangkum kondisi, bersama dengan nilai parameter untuk kueri yang aman dan efisien.
Klausa Where tidak hanya menyederhanakan konstruksi sintaksis kueri tetapi juga meningkatkan keamanan dengan mengelola risiko yang terkait dengan injeksi SQL secara internal. Pustaka ini secara otomatis mengganti nilai dengan parameter bernama PDO dan melakukan pengikatan menggunakan tipe data PDO yang sesuai. Dengan menangani aspek-aspek penting ini, ini memastikan bahwa pertanyaan Anda tidak hanya bersih dan terpelihara tetapi juga aman.
Anda tidak perlu lagi khawatir tentang membersihkan input Anda secara manual untuk kueri database. Perpustakaan menangani persiapan pernyataan sedemikian rupa sehingga melindungi dari injeksi SQL, salah satu kerentanan keamanan paling umum dalam aplikasi berbasis database. Pendekatan ini memungkinkan Anda untuk fokus pada logika bisnis aplikasi Anda, percaya bahwa interaksi database ditangani dengan aman dan efisien.
$ 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
dan and
operator $ 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)
Anda juga dapat membuat sarang
or
danand
operator:
$ where3 = Where:: equals ( ' category ' , ' archived ' );
$ combinedWhere = Where:: and ( $ where3 , $ orWhere );
// Output: (`category` = :category___1 AND (`status` = :status___1 OR `price` > :price___1))
Di subbagian berikut, kita akan mempelajari cara membuat dan menjalankan kueri menggunakan perpustakaan ini. Demi kesederhanaan, kita akan berasumsi bahwa variabel $db
adalah turunan dari kelas Db
.
Dalam semua contoh di bawah, kami memisahkan konstruksi kueri dari eksekusi. Pendekatan ini memungkinkan Anda untuk menggunakan kembali objek kueri dan mengeksekusinya beberapa kali dengan parameter berbeda, namun Anda juga dapat merangkai metode untuk membuat dan mengeksekusi kueri dalam satu pernyataan seperti ini:
$ 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;
Mengambil hasil:
Secara default, metode fetchAll()
mengembalikan array objek (menggunakan PDO::FETCH_OBJ
secara default), dimana setiap objek mewakili baris data. Anda juga dapat mengambil hasilnya sebagai array array asosiatif dengan meneruskan konstanta PDO::FETCH_ASSOC
sebagai argumen ke metode pembuat fetchMethod()
sebelum mengeksekusi kueri.
$ 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)
// }
Anda juga dapat menghitung hasil dengan:
$ countResults = $ select -> fetchCount ();
// Output: 5
Paginasi:
Menangani kumpulan data besar secara efisien dan menyediakan antarmuka yang ramah pengguna untuk navigasi data sangat penting untuk aplikasi tangguh apa pun. Fitur penomoran halaman di PHP-DbHandler menjawab kebutuhan ini dengan elegan. Ini menyederhanakan proses membagi data Anda menjadi bagian-bagian yang dapat dikelola, atau "halaman", sehingga lebih mudah untuk bekerja dengan kumpulan data besar tanpa membebani sistem atau pengguna.
Menyiapkan Paginasi
Ada dua cara untuk menyiapkan penomoran halaman untuk kueri Anda:
Menggunakan Metode paginasi: Metode ini memungkinkan Anda menentukan jumlah item per halaman secara ringkas. Ini adalah cara yang efisien untuk mempersiapkan kueri Anda untuk penomoran halaman.
$ select = $ db -> select ()
-> from ( ' table_name ' )
// ...
-> paginate (itemsPerPage: 10 );
Menetapkan batas dan offset secara manual: Untuk kontrol lebih lanjut, Anda dapat menentukan secara manual batas (jumlah item per halaman) dan offset (titik awal dalam kumpulan data) untuk kueri Anda.
$ select = $ db -> select ()
-> from ( ' table_name ' )
// ...
-> limit ( 10 )
-> offset ( 0 );
Mengambil Hasil dengan Pagination
Setelah penomoran halaman disiapkan, Anda dapat mengambil hasil dengan berbagai cara, menavigasi kumpulan data Anda dengan mudah:
fetchPage(?int $page)
: Ambil halaman saat ini atau halaman tertentu.fetchNextPage()
: Ambil hasil untuk halaman berikutnya.fetchPreviousPage()
: Ambil hasil untuk halaman sebelumnya.fetchFirstPage()
: Ambil hasil untuk halaman pertama.fetchLastPage()
: Ambil hasil untuk halaman terakhir. Masing-masing metode ini mengembalikan objek FetchPaginatedResult
, yang berisi properti berikut:
data
: Array catatan pada halaman saat ini.count
: Jumlah total catatan dalam kumpulan data.page
: Nomor halaman saat ini.perPage
: Jumlah catatan per halaman.totalPages
: Jumlah total halaman. // 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 )
}
Sistem penomoran halaman di PHP-DbHandler memastikan bahwa Anda dapat mengelola dan menavigasi kumpulan data besar secara efektif, sehingga meningkatkan kinerja keseluruhan dan pengalaman pengguna aplikasi Anda.
Penyimpanan dalam cache:
Dalam aplikasi berbasis data saat ini, efisiensi dan kinerja adalah kuncinya. Untuk meningkatkan aspek-aspek ini dalam interaksi database, perpustakaan menyertakan fitur caching dalam kueri Select
. Fitur ini meningkatkan kinerja dengan menyimpan hasil kueri dalam cache, sehingga mengurangi beban database dan meningkatkan waktu respons untuk kueri yang sering dijalankan. Yang penting, ini dirancang agar sepenuhnya sesuai dengan standar PSR-16 (Simple Cache), memastikan kompatibilitas dan fleksibilitas yang luas.
Caching yang Sesuai dengan PSR-16
Fungsionalitas cache dalam kueri Select menerima instance cache apa pun yang mengimplementasikan PsrSimpleCacheCacheInterface. Kepatuhan terhadap standar PSR-16 ini berarti Anda dapat dengan mudah mengintegrasikan berbagai pustaka caching yang mematuhi antarmuka ini, menawarkan Anda fleksibilitas untuk memilih solusi caching yang paling sesuai dengan kebutuhan aplikasi Anda.
PsrSimpleCacheCacheInterface
saat menginisialisasi kelas Db
, Anda dapat melewati langkah ini. Jika Anda tidak melakukannya, Anda dapat menggunakan metode setCache
: $ select = $ db -> select ()-> setCache ( $ simpleCacheInstance );
Catatan:
- Jika Anda tidak menyediakan instance cache saat menginisialisasi kelas
Db
, Anda harus mengaturnya untuk setiap kueriSelect
yang ingin Anda cache.- Anda juga dapat menggunakan metode ini jika Anda ingin mengatur contoh cache tertentu untuk kueri
Select
. Hal ini memungkinkan Anda menggunakan solusi caching yang berbeda untuk kueri yang berbeda, bergantung pada kebutuhan aplikasi Anda.
withCache
. Anda dapat menentukan nilai pengembalian default untuk entri cache yang hilang dan TTL (Time To Live) untuk data cache. $ select -> withCache (defaultValue, ttl);
Catatan:
- Argumen
defaultValue
bersifat opsional. Jika tidak disediakan, perpustakaan akan mengembalikanNULL
untuk entri cache yang hilang.- Argumen
ttl
bersifat opsional. Jika tidak disediakan, perpustakaan akan menggunakan nilai TTL yang ditetapkan oleh instance PsrSimpleCache.
$ allResults = $ select -> fetchAll ();
$ firstResult = $ select -> fetchFirst ();
$ column1Values = $ select -> fetchColumn ( ' column1 ' );
$ column3DistinctValues = $ select -> fetchDistincts ( ' column3 ' );
Manfaat Utama
Kelas Insert
di perpustakaan PHP-DbHandler menyederhanakan proses pembuatan dan pelaksanaan kueri penyisipan dalam database. Kelas ini, dilengkapi dengan berbagai ciri dan antarmuka, menawarkan pendekatan canggih untuk menangani operasi penyisipan dengan berbagai fitur canggih.
Pembuatan kueri
Insert
memungkinkan Anda menetapkan nilai secara dinamis ke kolom untuk disisipkan. Anda dapat menambahkan satu nilai atau beberapa nilai sekaligus: $ insert = $ db -> insert ()
-> into ( ' table_name ' )
-> value ( ' column1 ' , ' value1 ' )
-> values ([ ' column2 ' => ' value2 ' , ' column3 ' => ' value3 ' ]);
Kelas akan memeriksa apakah kolom tersebut ada di tabel sebelum menambahkan nilainya, dan juga akan menangani pengikatan PDO yang diperlukan.
$ rows = [
[ ' column1 ' => ' value1 ' , ' column2 ' => ' value2 ' ],
[ ' column1 ' => ' value3 ' , ' column2 ' => ' value4 ' ],
// ...
];
$ insert -> rows ( $ rows );
Eksekusi
$ success = $ insert -> execute ();
Cek
Sebelum menjalankan operasi penyisipan, kelas akan secara otomatis memeriksa:
- Jika database berada dalam mode read-only , mencegah operasi penulisan yang tidak diinginkan.
- Jika ada tabrakan pada kunci utama non-peningkatan otomatis , pastikan integritas data.
Kelas Insert
adalah solusi menyeluruh untuk menangani operasi penyisipan dalam database, menawarkan kemudahan penggunaan dan fitur-fitur canggih untuk mengelola tugas penyisipan kompleks secara efisien.
Kelas Update
di perpustakaan PHP-DbHandler menyediakan cara yang canggih dan fleksibel untuk membuat dan mengeksekusi kueri pembaruan dalam database. Ini dirancang untuk berintegrasi secara mulus dengan struktur database yang ada sambil menawarkan fitur-fitur canggih untuk mengelola operasi pembaruan secara efektif.
Pembuatan kueri
$ 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 ' ));
Eksekusi
$ success = $ update -> execute ();
Pemeriksaan Mode Read-Only : Sebelum eksekusi, kelas memeriksa apakah database berada dalam mode read-only, sehingga mencegah operasi penulisan yang tidak diinginkan.
Kelas Update
mewakili solusi komprehensif untuk membangun dan melaksanakan operasi pembaruan dalam database. Kombinasi fleksibilitas, ketahanan, dan kemudahan penggunaan menjadikannya pilihan ideal untuk mengelola pembaruan basis data dalam aplikasi PHP.
Kelas Delete
di perpustakaan PHP-DbHandler menawarkan pendekatan canggih untuk membangun dan mengeksekusi query penghapusan dalam database. Kelas ini memastikan bahwa operasi penghapusan dilakukan dengan presisi dan aman, mengintegrasikan pemeriksaan dan fitur penting untuk penanganan kueri yang optimal.
Pembuatan kueri
Kelas ini memungkinkan penargetan rekaman yang tepat untuk dihapus menggunakan ekspresi kondisional. Hal ini dicapai melalui metode where
, memungkinkan baris tertentu dipilih untuk dihapus berdasarkan kriteria yang diberikan.
$ delete = $ db -> delete ()
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column ' , ' value ' ));
Klausul Where Wajib : Untuk menghindari penghapusan semua record dalam tabel secara tidak sengaja, kelas memerlukan klausa
WHERE
untuk ditentukan. Ini berfungsi sebagai perlindungan terhadap penghapusan massal yang tidak disengaja.
Eksekusi
$ success = $ delete -> execute ();
Kelas melakukan pemeriksaan penting sebelum menjalankan operasi penghapusan, termasuk memverifikasi keberadaan tabel dan memastikan database tidak dalam mode baca-saja.
Kelas Delete
dirancang untuk menangani operasi penghapusan dengan tingkat kontrol dan keamanan yang tinggi. Ini memastikan bahwa penghapusan dilakukan secara akurat, dengan menghormati struktur dan batasan database. Baik Anda melakukan tugas penghapusan yang sederhana atau rumit, kelas ini menyediakan alat yang diperlukan untuk menjalankannya dengan andal dan aman.
Kelas StoredProcedure
di perpustakaan PHP-DbHandler menawarkan pendekatan yang efisien dan efisien untuk menjalankan prosedur tersimpan dalam database. Kelas ini menyediakan cara yang kuat untuk berinteraksi dengan prosedur tersimpan, menangani manajemen parameter, eksekusi, dan pengambilan hasil dengan mudah.
Pembuatan kueri
Menyiapkan Panggilan Prosedur Tersimpan : Mengatur panggilan ke prosedur tersimpan dengan mudah dengan manajemen parameter dinamis. Tentukan nama prosedur dan parameter yang diperlukan.
$ procedure = $ db -> storedProcedure ()
-> call ( ' procedure_name ' )
-> with ( ' paramName ' , $ value )
// ...
-> with ( ' paramName2 ' , $ value );
Eksekusi
$ results = $ procedure -> execute ();
Pemeriksaan Mode Read-Only : Sebelum eksekusi, kelas memverifikasi apakah database berada dalam mode read-only, memastikan bahwa operasi tulis tidak dilakukan secara tidak sengaja.
Kelas StoredProcedure
adalah alat yang sangat diperlukan untuk menangani panggilan prosedur tersimpan dalam aplikasi PHP. Ini menyederhanakan interaksi dengan prosedur tersimpan, menjadikan proses lebih intuitif dan mengurangi rawan kesalahan, terutama dalam aplikasi yang sangat bergantung pada operasi database yang kompleks.
Mengelola transaksi database merupakan aspek penting untuk memastikan integritas data, terutama dalam aplikasi yang berhubungan dengan manipulasi data yang kompleks. PHP-DbHandler menyederhanakan proses ini, menawarkan cara yang intuitif dan mudah untuk menangani transaksi.
Dengan kemampuan manajemen transaksi yang disediakan, Anda dapat dengan mudah memulai, melakukan, atau membatalkan transaksi, sehingga memberi Anda kendali penuh atas operasi database Anda. Hal ini memastikan bahwa serangkaian operasi database dapat diperlakukan sebagai satu unit atom, baik selesai seluruhnya atau tidak selesai sama sekali, sehingga menjaga konsistensi dan keandalan data Anda.
$ db -> transaction -> begin ();
$ db -> transaction -> commit ();
$ db -> transaction -> rollback ();
Fitur ini sangat berguna dalam skenario di mana beberapa operasi database terkait perlu dijalankan secara bersamaan. Jika ada operasi dalam transaksi yang gagal, metode rollback dapat digunakan untuk mengembalikan semua perubahan yang dilakukan sejak awal transaksi, sehingga mencegah pembaruan sebagian yang dapat menyebabkan inkonsistensi data. Sebaliknya, jika semua operasi berhasil, metode komit akan menyimpan semua perubahan ke database.
Dengan memanfaatkan kontrol transaksi ini, PHP-DbHandler memastikan bahwa manajemen data aplikasi Anda kuat, konsisten, dan tahan kesalahan. Baik Anda berurusan dengan entri data yang kompleks, pembaruan, atau proses batch, kemampuan transaksional ini menyediakan alat yang diperlukan untuk mengelola operasi database Anda secara efektif.
Kelas Transaction
juga memperkenalkan fitur canggih untuk mengelola skenario transaksi yang kompleks. Fitur ini memungkinkan Anda mengontrol komitmen transaksi secara global, terutama berguna ketika Anda ingin mencakup beberapa metode yang menggunakan transaksi dalam satu konteks transaksional yang menyeluruh.
Menangani Transaksi Secara Global
Anda dapat mengelola beberapa operasi transaksional sebagai bagian dari transaksi yang lebih besar dengan menonaktifkan penerapan otomatis. Hal ini sangat berguna dalam skenario di mana beberapa operasi, yang masing-masing mampu menangani transaksi secara independen, perlu dijalankan sebagai bagian dari satu transaksi atom.
// 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 ();
Fitur ini meningkatkan kontrol atas operasi transaksional, memungkinkan skenario manipulasi data yang lebih kompleks dan andal. Hal ini memastikan bahwa semua perubahan yang dilakukan dalam lingkup transaksi global dilakukan secara bersamaan atau dibatalkan, menjaga integritas dan konsistensi data.
Kami sangat menghargai dan menyambut baik kontribusi pada proyek ini! Jika Anda tertarik untuk berkontribusi, silakan baca file CONTRIBUTING.md kami untuk informasi rinci tentang cara memulai, panduan untuk mengirimkan kontribusi, dan tips untuk membuat prosesnya semudah dan seefektif mungkin.
Baik Anda memperbaiki bug, menambahkan fitur, atau menyempurnakan dokumentasi, kontribusi Anda sangat dihargai dan memberikan dampak signifikan pada proyek.
Jika Anda memiliki pertanyaan atau ingin mendiskusikan ide sebelum melakukan coding, silakan buka masalah di halaman Masalah GitHub kami untuk berdiskusi.
Kami menghargai kesediaan Anda untuk berkontribusi dan menantikan kiriman Anda!
Perpustakaan ini dilisensikan di bawah Lisensi MIT. Lihat file LISENSI untuk lebih jelasnya.
Untuk dukungan, silakan kunjungi halaman masalah di repositori GitHub: Masalah GitHub