Panduan Pengguna Ini
Anda dapat mendownloadnya sebagai arsip, mengkloning dari situs ini, atau mendownload melalui composer (link ke packagist.org):
composer require krugozor/database
krugozor/database
? krugozor/database
adalah perpustakaan kelas PHP >= 8.0 untuk pekerjaan yang sederhana, nyaman, cepat dan aman dengan database MySql, menggunakan ekstensi PHP mysqli.
Kerugian utama dari semua perpustakaan untuk bekerja dengan database mysql di PHP adalah:
int
dan float
.krugozor/database
adalah kelas untuk bekerja dengan MySqlmysqli
dan mysqli_result
untuk membuat metode yang perlu Anda gunakan.krugozor/database
?Kebanyakan pembungkus untuk berbagai driver database adalah sekumpulan kode tidak berguna dengan arsitektur yang menjijikkan. Penulisnya, yang tidak memahami tujuan praktis dari pembungkusnya, mengubahnya menjadi semacam pembuat kueri (pembangun sql), perpustakaan ActiveRecord, dan solusi ORM lainnya.
Perpustakaan krugozor/database
tidak termasuk di atas. Ini hanyalah alat yang berguna untuk bekerja dengan SQL biasa dalam kerangka DBMS MySQL - dan tidak lebih!
Placeholder — penanda yang diketik khusus yang ditulis dalam string kueri SQL , bukan nilai eksplisit (parameter kueri) . Dan nilai-nilai itu sendiri diteruskan "nanti", sebagai argumen berikutnya ke metode utama yang mengeksekusi kueri SQL:
$ result = $ db -> query (
" SELECT * FROM `users` WHERE `name` = '?s' AND `age` = ?i " ,
" d'Artagnan " , 41
);
Parameter kueri SQL yang melewati sistem placeholder diproses oleh mekanisme pelolosan khusus, bergantung pada jenis placeholder. Itu. Anda tidak perlu lagi membungkus variabel dalam tipe fungsi escape mysqli_real_escape_string()
atau memasukkannya ke tipe numerik seperti sebelumnya:
<?php
// Previously, before each request to the DBMS, we did
// something like this (and many people still don't do it):
$ id = ( int ) $ _POST [ ' id ' ];
$ value = mysqli_real_escape_string ( $ mysql , $ _POST [ ' value ' ]);
$ result = mysqli_query ( $ mysql , " SELECT * FROM `t` WHERE `f1` = ' $ value ' AND `f2` = $ id " );
Sekarang menulis kueri menjadi mudah, cepat, dan yang paling penting, pustaka krugozor/database
sepenuhnya mencegah kemungkinan injeksi SQL.
Jenis pengisi dan tujuannya dijelaskan di bawah ini. Sebelum mengenal jenis-jenis filler, perlu dipahami cara kerja mekanisme perpustakaan.
PHP adalah bahasa yang diketik dengan lemah dan dilema ideologis muncul ketika mengembangkan perpustakaan ini. Bayangkan kita mempunyai tabel dengan struktur sebagai berikut:
` name ` varchar not null
` flag ` tinyint not null
dan perpustakaan HARUS (untuk beberapa alasan, mungkin di luar kendali pengembang) menjalankan permintaan berikut:
$ db -> query (
" INSERT INTO `t` SET `name` = '?s', `flag` = ?i " ,
null , false
);
Dalam contoh ini, upaya dilakukan untuk menulis nilai null
ke bidang teks not null
name
, dan tipe boolean false
ke bidang numerik flag
. Apa yang harus kita lakukan dalam situasi ini?
false
untuk kolom tinyint
sebagai nilai 0
, dan null
sebagai string kosong untuk kolom name
?Mengingat pertanyaan yang diajukan, diputuskan untuk menerapkan dua mode operasi di perpustakaan ini.
Mysql::MODE_STRICT
, tipe argumen harus cocok dengan tipe placeholder . Misalnya, upaya untuk meneruskan nilai 55.5
atau '55.5'
sebagai argumen untuk placeholder bilangan bulat ?i
akan menghasilkan pengecualian: // set strict mode
$ db -> setTypeMode (Mysql:: MODE_STRICT );
// this expression will not be executed, an exception will be thrown:
// attempt to specify a value of type "integer" for placeholder of type "double" in query template "SELECT ?i"
$ db -> query ( ' SELECT ?i ' , 55.5 );
Mysql::MODE_TRANSFORM
diatur secara default dan merupakan mode "toleransi" - jika tipe placeholder dan tipe argumen tidak cocok, ia tidak akan memunculkan pengecualian, namun mencoba mengonversi argumen ke tipe placeholder yang diinginkan menggunakan bahasa PHP itu sendiri . Omong-omong, saya, sebagai penulis perpustakaan, selalu menggunakan mode khusus ini, saya belum pernah menggunakan mode ketat ( Mysql::MODE_STRICT
) dalam pekerjaan nyata, tetapi mungkin Anda memerlukannya secara khusus. Transformasi berikut diperbolehkan di Mysql::MODE_TRANSFORM
:
int
(placeholder ?i
)string
dan double
bool
TRUE diubah menjadi int(1)
, FALSE diubah menjadi int(0)
null
diubah menjadi int(0)
double
(placeholder ?d
)string
dan int
bool
TRUE menjadi float(1)
, FALSE menjadi float(0)
null
diubah menjadi float(0)
string
(placeholder ?s
)bool
TRUE diubah menjadi string(1) "1"
, FALSE diubah menjadi string(1) "0"
. Perilaku ini berbeda dengan memasukkan bool
ke int
di PHP, karena dalam praktiknya, tipe boolean sering kali ditulis di MySql sebagai angka.numeric
diubah menjadi string sesuai dengan aturan konversi PHPnull
diubah menjadi string(0) ""
null
(placeholder ?n
)krugozor/database
? ?i
— placeholder bilangan bulat $ db -> query (
' SELECT * FROM `users` WHERE `id` = ?i ' , 123
);
Kueri SQL setelah konversi templat:
SELECT * FROM ` users ` WHERE ` id ` = 123
PERHATIAN! Jika Anda mengoperasikan angka yang berada di luar batas PHP_INT_MAX
, maka:
?s
(lihat di bawah). Maksudnya angka diluar batas PHP_INT_MAX
, PHP mengartikannya sebagai angka floating point. Pengurai perpustakaan akan mencoba mengonversi parameter menjadi tipe int
, sebagai hasilnya " hasilnya tidak akan ditentukan, karena float tidak memiliki presisi yang cukup untuk mengembalikan hasil yang benar. Dalam hal ini, peringatan atau bahkan komentar tidak akan ditampilkan ! ” — php.net. ?d
— placeholder titik mengambang $ db -> query (
' SELECT * FROM `prices` WHERE `cost` IN (?d, ?d) ' ,
12.56 , ' 12.33 '
);
Kueri SQL setelah konversi templat:
SELECT * FROM ` prices ` WHERE ` cost ` IN ( 12 . 56 , 12 . 33 )
PERHATIAN! Jika Anda menggunakan perpustakaan untuk bekerja dengan tipe data double
, atur lokal yang sesuai sehingga jika pemisah bagian bilangan bulat dan pecahan sama baik di tingkat PHP dan tingkat DBMS.
?s
— placeholder tipe string Nilai argumen di-escape menggunakan metode mysqli::real_escape_string()
:
$ db -> query (
' SELECT "?s" ' ,
" You are all fools, and I am d'Artagnan! "
);
Kueri SQL setelah konversi templat:
SELECT " You are all fools, and I am d'Artagnan! "
?S
— placeholder tipe string untuk substitusi di operator SQL LIKE Nilai argumen di-escape menggunakan metode mysqli::real_escape_string()
+ pelolosan karakter khusus yang digunakan dalam operator LIKE ( %
dan _
):
$ db -> query ( ' SELECT "?S" ' , ' % _ ' );
Kueri SQL setelah konversi templat:
SELECT " % _ "
?n
— tipe NULL
placeholder Nilai argumen apa pun diabaikan, placeholder diganti dengan string NULL
dalam kueri SQL:
$ db -> query ( ' SELECT ?n ' , 123 );
Kueri SQL setelah konversi templat:
SELECT NULL
?A*
— placeholder himpunan asosiatif dari array asosiatif, menghasilkan urutan pasangan bentuk key = value
dimana karakter *
adalah salah satu placeholder:
i
(pengganti bilangan bulat)d
(penampung mengambang)s
(placeholder tipe string)aturan konversi dan pelolosan sama dengan tipe skalar tunggal yang dijelaskan di atas. Contoh:
$ db -> query (
' INSERT INTO `test` SET ?Ai ' ,
[ ' first ' => ' 123 ' , ' second ' => 456 ]
);
Kueri SQL setelah konversi templat:
INSERT INTO ` test ` SET ` first ` = " 123 " , ` second ` = " 456 "
?a*
- mengatur placeholder dari array sederhana (atau juga asosiatif), menghasilkan urutan nilai di mana *
adalah salah satu tipenya:
i
(pengganti bilangan bulat)d
(penampung mengambang)s
(placeholder tipe string)aturan konversi dan pelolosan sama dengan tipe skalar tunggal yang dijelaskan di atas. Contoh:
$ db -> query (
' SELECT * FROM `test` WHERE `id` IN (?ai) ' ,
[ 123 , 456 ]
);
Kueri SQL setelah konversi templat:
SELECT * FROM ` test ` WHERE ` id ` IN ( " 123 " , " 456 " )
?A[?n, ?s, ?i, ...]
— placeholder himpunan asosiatif dengan indikasi eksplisit jenis dan jumlah argumen, menghasilkan rangkaian pasangan key = value
Contoh:
$ db -> query (
' INSERT INTO `users` SET ?A[?i, "?s"] ' ,
[ ' age ' => 41 , ' name ' => " d'Artagnan " ]
);
Kueri SQL setelah konversi templat:
INSERT INTO ` users ` SET ` age ` = 41 , ` name ` = " d'Artagnan "
?a[?n, ?s, ?i, ...]
— mengatur placeholder dengan indikasi eksplisit jenis dan jumlah argumen, menghasilkan urutan nilaiContoh:
$ db -> query (
' SELECT * FROM `users` WHERE `name` IN (?a["?s", "?s"]) ' ,
[ ' Daniel O"Neill ' , " d'Artagnan " ]
);
Kueri SQL setelah konversi templat:
SELECT * FROM ` users ` WHERE ` name ` IN ( " Daniel O " Neill " , " d ' Artagnan")
?f
— placeholder nama tabel atau bidangPlaceholder ini ditujukan untuk kasus di mana nama tabel atau bidang diteruskan dalam kueri sebagai parameter. Nama bidang dan tabel dibingkai dengan tanda kutip:
$ db -> query (
' SELECT ?f FROM ?f ' ,
' name ' ,
' database.table_name '
);
Kueri SQL setelah konversi templat:
SELECT ` name ` FROM ` database ` . ` table_name `
Perpustakaan mengharuskan programmer untuk mengikuti sintaks SQL. Ini berarti kueri berikut tidak akan berfungsi:
$ db -> query (
' SELECT CONCAT("Hello, ", ?s, "!") ' ,
' world '
);
— placeholder ?s
harus diapit tanda kutip tunggal atau ganda:
$ db -> query (
' SELECT concat("Hello, ", "?s", "!") ' ,
' world '
);
Kueri SQL setelah konversi templat:
SELECT concat( " Hello, " , " world " , " ! " )
Bagi mereka yang terbiasa bekerja dengan PDO, ini akan tampak aneh, tetapi menerapkan mekanisme yang menentukan apakah nilai placeholder perlu diapit dalam tanda kutip dalam satu kasus atau tidak adalah tugas yang sangat tidak sepele yang memerlukan penulisan parser keseluruhan. .
Lihat di file ./console/tests.php