Lihatlah kode PHP:
$user->v_useragent = 'coresky.agent';
Kode tersebut dapat memicu permintaan SQL UPDATE atau INSERT, atau mungkin tidak memprovokasi jika data yang identik sudah diinstal dalam database, yang mengapa fungsi ini disebut Phantom SQL Queries. Fungsionalitas yang serupa biasanya ada di sebagian besar CRM, tetapi mari kita lihat bagaimana hal itu dapat diimplementasikan tanpa CRM. Permintaan phantom memiliki potensi untuk digunakan secara luas di aplikasi web, terutama dalam hal konfigurasi. Algoritma tipikal (tetapi tidak perlu) berlangsung dalam tiga tahap: membaca data dari database, mengubah data, mungkin beberapa kali, dan menghasilkan query SQL nyata untuk memperbarui data dalam database. Mari kita cari tahu detailnya ...
Secara total, Anda harus memiliki tiga metode, satu untuk setiap tahap. Saya akan memberikan kode metode pertama yang membongkar data yang dibaca dari database sepenuhnya, karena ini cukup sederhana:
class SKY // coresky { ... static function &ghost($char, $original, $sql = '', $flag = 0) { SKY::$mem[$char] = [$flag, $flag & 4 ? null : $original, $sql, []]; if ($sql) trace('GHOST SQL: ' . (is_array($sql) ? end($sql) : $sql), false, 1); if ($original) foreach (explode("\n", unl($original)) as $v) { list($k, $v) = explode(' ', $v, 2); SKY::$mem[$char][3][$k] = unescape($v, true); } return SKY::$mem[$char][3]; }
Parameter input metode:
- $ char - satu huruf kecil dari alfabet bahasa Inggris, menunjukkan jenis fungsionalitas permintaan hantu, dapat digunakan dalam awalan variabel, seperti pada contoh di atas;
- $ original - konten tekstual dari sel basis data (`mediumtext` untuk MySQL), di mana semua variabel pertanyaan hantu $ char disimpan dalam jumlah besar. String kosong juga bisa menjadi input;
- $ sql - templat kueri yang akan digunakan untuk menghasilkan kueri SQL nyata, misalnya, dalam fungsi panggilan balik untuk register_shutdown_function ();
- $ flag - bendera. Lebih sering, nilai 0 yang telah ditentukan digunakan;
Templat kueri dapat terdiri dari dua jenis, berdasarkan fungsi sql (..) atau sqlf (..). Saya akan memberikan kode kedua sepenuhnya, karena, ketika digunakan dengan benar, menjamin ketidakmungkinan injeksi SQL, cepat dan sangat sederhana:
function sqlf() {
Sayangnya, fungsi sqlf () tidak universal dalam hal mengkompilasi
permintaan SQL arbitrer dalam hal perlindungan terhadap injeksi. Namun, ada secara paralel dengan fungsi universal sql (), karena kecepatan operasi yang relatif tinggi. Templat untuk sqlf () digunakan untuk kasus bekerja dengan hanya satu sel mediumtext. Templat kedua digunakan ketika Anda perlu mengatur kueri yang tertunda untuk banyak kolom tabel.
Bagaimana pemrosesan kode PHP yang ditentukan di awal artikel
Variabel $ user berisi pointer ke objek USER, yang pada gilirannya memiliki metode ajaib __get () dan __set (). Dengan awalan v_, kelas memahami bahwa ia menulis ke tabel sesi `pengunjung` dan memanggil metode SKY :: save (..), yang menyimpan kode dalam array SKY :: $ mem. Di akhir skrip, fungsi callback untuk register_shutdown_function () dipanggil, di mana query SQL aktual dalam database benar-benar dilakukan (atau tidak).
Jadi, dua metode lain yang diperlukan untuk mengatur fungsional adalah SKY :: save (..) dan SKY :: here (..). Yang pertama menyimpan data dalam sebuah array, dan yang kedua menghasilkan dan melakukan permintaan nyata dalam database.
Kode coresky (reusable framework atau kode CMF) menggunakan 8 jenis phantom SQL:
- konfigurasi sistem, yang disimpan dalam database;
- Konfigurasi pengunjung
- konfigurasi pengguna yang sah;
- konfigurasi sistem panel admin;
- konfigurasi sistem peluncuran konsol;
- tiga jenis phantom SQL digunakan untuk mengatur utilitas i18n;
Seperti yang Anda lihat, "phantom SQL" relevan untuk hampir semua aplikasi web.
Keuntungan dari fungsi yang dijelaskan
- tidak perlu melakukan ALTER TABLE ... (atau INSERT baris baru) untuk menambahkan variabel konfigurasi baru saat aplikasi berkembang. Anda dapat menambahkan variabel baru hanya dalam kode PHP tanpa mengubah struktur database;
- fungsionalitas dapat mengurangi jumlah kueri basis data menjadi satu, untuk kasus ketika ada catatan di baris yang sama dari tabel yang sama;
Kerugian
Untuk variabel ghost SQL, Anda tidak dapat "mengacaukan" indeks, kemungkinan besar, Anda tidak dapat membuat LOCK TABLE atau menggunakan fitur MySQL canggih lainnya.
Informasi lebih lanjut dapat ditemukan di
situs web proyek SKY.