Jadi adakah mungkin untuk tidak menentukan jenis lajur sama sekali? Perbezaan antara sqlite dan mysql dan pangkalan data yang serupa

SQLite ialah pangkalan data yang agak serupa dengan MySQL. Perbezaan asas SQLite daripada pangkalan data lain ialah keseluruhan pangkalan data adalah satu fail. Jika dalam pangkalan data MySQL disimpan di suatu tempat di belantara pelayan dan tidak tersedia untuk pemindahan, maka dalam SQLite semuanya sangat mudah: satu fail - satu pangkalan data.

Sudah tentu, pelayan mesti menyokong pemacu SQLite (sama seperti pangkalan data lain), tetapi sebagai peraturan tidak ada masalah dengan ini sekarang.

SQLite membolehkan anda bekerja dengan pangkalan data menggunakan SQL seperti biasa, mencipta jadual, medan, dsb. Secara umum, kita boleh mengatakan bahawa SQLite sama sekali tidak kalah dengan MySQL biasa, dengan pengecualian, mungkin, lebih banyak lagi. kerja lambat dengan pertanyaan SQL "berat" untuk mengemas kini data (masukkan dan kemas kini). Tetapi, sekali lagi, ini adalah untuk tapak muatan tinggi.

Kelebihan besar SQLite ialah kemudahan mudah alihnya. Salin fail - apa yang lebih mudah? Anda tidak perlu risau tentang sandaran, seperti dalam MySQL, anda tidak perlu mencipta pengguna dengan kata laluan pada pelayan, anda tidak perlu mencipta pangkalan data itu sendiri. Dengan SQLite, kami hanya mengambil dan menggunakannya.

Untuk bekerja dengan pangkalan data dalam PHP lebih baik gunakan PDO - Objek Data PHP - inilah yang dipanggil. abstraksi yang menawarkan antara muka tunggal untuk bekerja dengan pangkalan data yang berbeza. Secara teori, menggunakan PDO, anda boleh bertukar kepada mana-mana pangkalan data tanpa menukar pertanyaan SQL, contohnya dari MySQL ke SQLite. Hanya parameter sambungan yang berubah.

Dengan cara ini SQLite akan menyambung melalui PDO. Tiada apa-apa yang diperlukan untuk ini, kerana PDO sendiri sudah disertakan dalam PHP, dan pemacu SQLite biasanya disertakan pada pelayan juga.

Tetapi, sebelum anda memulakan pengaturcaraan, anda perlu mencipta pangkalan itu sendiri. Sebagai contoh, untuk MySQL terdapat phpMyAdmin, di mana anda boleh melaksanakan pelbagai operasi. Terdapat juga perkembangan serupa untuk SQLite, tetapi saya akan menunjukkan bagaimana ini boleh dilakukan melalui pelayar Firefox. Untuk melakukan ini, anda hanya perlu memasang alat tambah.

Untuk menambah alat tambah ini kepada yang utama Menu FireFox(“hamburger”), klik Edit dan seret ikon ke menu.

Ini dipasang dan anda boleh menggunakannya.

Mula-mula, mari buat pangkalan baru data. Dalam SQLite ini fail berasingan, yang akan mempunyai sambungan .sqlite . Pengurus SQLite akan menggesa anda untuk menentukan direktori tempat fail ini akan disimpan. Pilih atau buat katalog baru. Ini tidak begitu penting kepada kami lagi. Akibatnya, fail sqlite dengan pangkalan data baharu akan dibuat.

Fail ini boleh dialihkan (dan dinamakan semula) di mana-mana, dan kemudian dibuka dengan arahan menu Pangkalan data - Sambungkan pangkalan data.

Sekarang anda perlu mencipta jadual (atau jadual) dalam pangkalan data.

Pengurus SQLite mencipta jadual perkhidmatan secara automatik sqlite_XXX. Kami tidak menyentuh mereka dan mereka tidak mengganggu kami.

Jadual dalam pangkalan data adalah di mana maklumat berstruktur. Jadual mesti mempunyai satu set medan dengan sifat yang ditentukan. Sebagai contoh, medan boleh menjadi integer - untuk integer, atau teks - untuk teks. Bilangan medan boleh sewenang-wenangnya dan hanya ditentukan oleh tugas juruweb.

Biarkan, sebagai contoh, kita mempunyai halaman jadual dengan medan

  • ID - nombor unik(autoincrement)
  • slug- pautan
  • teks- teks Percuma
  • hits- bilangan tontonan

Selepas jadual dibuat, perhatikan blok "pernyataan SQL yang mencipta objek ini". Ia akan mengandungi pertanyaan SQL yang boleh digunakan untuk membuat jadual. Ia boleh berguna jika anda perlu membuat jadual dalam pangkalan data melalui PHP.

Tab Lihat dan Carian membolehkan anda mengedit jadual. Sebagai contoh, mari kita buat dua baris di mana medan slug akan berada di rumah dan menghubungi . Ini akan menjadi dua halaman: rumah Dan laman web/hubungan.

Padang hits akan mengandungi kaunter paparan halaman. Teks boleh jadi apa sahaja.

Itu sahaja, asas sudah siap, kini anda boleh menggunakannya.

Mari kita tetapkan tugas. Marilah kita mempunyai laman web mudah yang akan dipaparkan pautan pendek(slug) teks yang sepadan dan bilangan paparan.

Jika kita melakukan ini pada pelayan tempatan, kemudian biarkan tapak berada dalam direktori sqlite. Terdapat subdirektori di dalamnya db, di mana kami akan menyalin kami pages.sqlite.

Kita boleh melakukan penghalaan seperti yang diterangkan dalam artikel sebelumnya. File.htaccess

AddDefaultCharset UTF-8 Options -Indeks RewriteEngine pada RewriteBase /sqlite/ RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule (.*) /sqlite/index.php?$1

DALAM index.php Penghalaan itu sendiri akan diterangkan dalam satu baris:

$halaman = ($p = kunci($_GET)) ? $p: "rumah";

  • menyambung pangkalan
  • kami membuat pilihan di dalamnya dengan $page
  • memaparkan data yang diterima
Saya sengaja memudahkan algoritma supaya tidak merumitkan kod PHP.

Terdapat dua pilihan untuk bekerja dengan pangkalan data. Yang pertama ialah kod PHP asli. Ia tidak begitu rumit, tetapi banyaknya parameter agak menjengkelkan. Oleh itu, pilihan kedua ialah menggunakan perpustakaan pembungkus tambahan. Dengan mereka, kod menjadi lebih ringkas.

Saya akan memberikan kod index.php dalam versi pertama:

setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $sql ="SELECT * FROM pages WHERE slug=:page LIMIT 1"; $sth = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $sth->execute(array(":page" => $page)); $rows = $sth->fetchAll(); print_r($baris); // data keluaran di sini ) tangkap(Pengecualian $e) ( echo $e->getMessage(); ) # akhir fail

Untuk pilihan kedua, saya menggunakan perpustakaan php dari tapak labaka.ru, yang saya letakkan dalam subdirektori lib.

kod index.php:

Contoh ini akan memaparkan teks yang berbeza untuk alamat yang berbeza dan kaunter pandangan akan berfungsi. Jika anda perlu menambah halaman baharu, maka anda hanya perlu menciptanya dalam pangkalan data. Untuk kemudahan, dalam Pengurus SQLite anda boleh menyambungkan pangkalan data terus dari direktori tapak.

Terdapat beberapa perkara penting yang perlu diperhatikan di sini.

Pertama sekali, semua kerja dengan PDO harus terkandung dalam try..catch block. Mesej ralat ditangkap dengan cara ini.

Data yang dihantar ke pertanyaan sql mesti melalui pengesahan. Dalam PDO, apabila penyediaan data digunakan (PDO::prepare), pelarian parameter dipaksa. Ini membolehkan anda melindungi daripada kemungkinan suntikan SQL.

Apabila pangkalan data SQLite disambungkan, jika tiada fail pangkalan data, ia akan dibuat secara automatik. Ini adalah asas untuk mencipta pangkalan data sejurus selepas menyambungkannya dan mencipta jadual yang diperlukan dengan pertanyaan sql pertama (yang saya tulis di atas).

Satu lagi nota tentang SQLite. Memandangkan pangkalan data ialah fail, ia boleh dimuat turun dari URL terus melalui pelayar. Oleh itu, adalah lebih baik untuk melindungi direktori dengan fail SQLite melalui .htaccess dengan Deny dari semua baris. Atau letakkannya lebih tinggi daripada direktori www utama.

SQLite boleh berguna untuk tugas kecil yang memerlukan pangkalan data kecil: kaunter, undian, metadata halaman, dsb.

Anda boleh rujuk artikel ini.

Saya akhirnya memutuskan untuk menulis artikel tentang SQLite, di mana saya ingin meringkaskan pengalaman 3 tahun saya menggunakan pangkalan data ini di bawah Windows. Saya melihat bahawa topik itu popular, tetapi terdapat sedikit maklumat.

Sedikit nota pengenalan.

Artikel ini bukan untuk pengaturcara pemula.
Ia bukan tutorial SQL.
Dia tidak menyokong menggunakan SQLite.
Dia tidak menganjurkan untuk tidak menggunakan SQLite.
Artikel itu ditulis dalam bentuk soalan daripada pemula hipotesis kepada SQLite dan jawapan kepada mereka (kerana terdapat banyak maklumat dan sekurang-kurangnya lebih mudah untuk menyusunnya dengan cara ini).

Apakah itu SQLite?
SQLite ialah pangkalan data merentas platform terbenam yang menyokong set perintah SQL yang agak komprehensif dan tersedia dalam kod sumber (dalam C).

Kod sumber SQLite berada dalam domain awam, yang bermaksud tiada sekatan ke atas penggunaan sama sekali.

Laman web (dengan dokumentasi yang sangat baik dalam bahasa Inggeris): http://sqlite.org

Versi semasa: 3.7.13

Anda boleh menyusun SQLite sendiri, tetapi saya memuat turunnya telah disusun sebagai Windows DLL.

Untuk pemasangan anda sendiri, anda biasanya memuat turun apa yang dipanggil. "penyatuan"
mereka. Sumber SQLite dalam bentuk fail tunggal dalam C + sqlite3.h.

Untuk mengurangkan saiz kod SQlite dengan menghapuskan perkara yang tidak perlu, semua jenis DEFINE digunakan.

Seberapa popular SQLite?
Secara ringkas: dia ada di mana-mana. Sekurang-kurangnya pada mana-mana telefon pintar.
Sejauh manakah ia boleh dipercayai?
sangat. Apabila versi dikeluarkan, ia akan melalui satu siri ujian automatik yang serius (~ 2 juta ujian dijalankan), liputan kod mengikut ujian adalah 100% (sejak Ogos 2009).
Apakah alatan lain yang disediakan oleh pembangun?
Utiliti konsol untuk bekerja dengan pangkalan data tersedia (sqlite3.exe, "shell baris arahan untuk mengakses dan mengubah suai pangkalan data SQLite").
Itu sahaja?
Ya, semuanya daripada pemaju utama. Walau bagaimanapun, orang lain menulis semua jenis pengurus, dsb.
Secara peribadi, saya tidak pernah menemui yang ideal dan menggunakan konsol.
Apakah maksud "set SQL yang cukup lengkap"?
Seperti yang anda ketahui, SQL telah bergerak ke arah yang berbeza dalam pembangunannya. Pengeluar besar mula mendorong dalam semua jenis sambungan. Dan walaupun semua jenis piawaian diterima (SQL 92), dalam kehidupan sebenar semua pangkalan data yang besar tidak menyokong sepenuhnya piawaian + mereka mempunyai sesuatu yang tersendiri. Jadi, SQLite cuba untuk hidup dengan prinsip "set minimum tetapi lengkap". Ia tidak menyokong perkara yang rumit, tetapi ia hampir sama dengan SQL 92.
Dan ia memperkenalkan beberapa cirinya sendiri, yang sangat mudah, tetapi tidak standard.
Apakah secara khusus tentang sokongan SQL yang mungkin menyebabkan kekeliruan?
Anda tidak boleh memadam atau menukar lajur dalam jadual (ALTER TABLE DROP COLUMN..., ALTER TABLE ALTER COLUMN...).
Terdapat pencetus, tetapi tidak sekuat RDBMS yang besar.
Terdapat sokongan kunci asing, tetapi secara lalai ia DIHENTIKAN.
Tiada sokongan terbina dalam untuk UNICODE (tetapi pada umumnya tidak sukar untuk dicapai).
Tiada prosedur tersimpan.
Apa yang baik atau luar biasa?
a) Setiap rekod mengandungi lajur rowid maya, yang sama dengan nombor 64-bit (unik untuk jadual).
Anda boleh mengisytiharkan lajur INTEGER PRIMARY KEY anda dan kemudian lajur ini akan menjadi rowid (dengan namanya sendiri, nama rowid masih berfungsi).
Apabila memasukkan rekod, anda boleh menentukan rowid, atau anda tidak boleh menentukannya (dan sistem kemudiannya akan memasukkan yang unik).
Butiran: www.sqlite.org/autoinc.html
b) anda boleh dengan mudah menyusun pangkalan data dalam ingatan (ini sangat mudah dan saya akan memberitahu anda lebih lanjut mengenainya kemudian);
c) mudah untuk diangkut: secara lalai, pangkalan data adalah satu fail (dalam format merentas platform);
d) jenis lajur tidak menentukan jenis nilai yang disimpan dalam medan rekod ini, iaitu, sebarang nilai boleh dimasukkan dalam mana-mana lajur;
e) banyak fungsi terbina dalam (yang boleh digunakan dalam SQL): www.sqlite.org/lang_corefunc.html;
Saya tidak faham - apa yang salah dengan jenisnya? Mengapa anda memerlukan jenis lajur sama sekali?
Jenis lajur menentukan cara nilai dibandingkan (ia perlu ditukar kepada satu jenis apabila membandingkan, katakan, di dalam indeks).
Tetapi ia tidak mewajibkan anda untuk memasukkan nilai jenis tertentu ini ke dalam lajur. Sesuatu seperti menaip lemah.

Katakan kita mengisytiharkan lajur sebagai "A INTEGER".
SQlite membolehkan anda memasukkan nilai apa-apa jenis ke dalam lajur ini (999, "abc", "123", 678.525).
Jika nilai yang dimasukkan bukan integer, maka SQlite cuba menghantarnya ke integer.
Itu. rentetan "123" akan bertukar menjadi integer 123, dan nilai yang selebihnya akan ditulis "sebagaimana adanya".

Jadi adakah mungkin untuk tidak menentukan jenis lajur sama sekali?
Ini sangat kerap dilakukan: BUAT JADUAL foo (a,b,c,d).
Bagaimana dengan seni bina? Adakah tiada pelayan?
Tiada pelayan, aplikasi itu sendiri adalah pelayan. Akses kepada pangkalan data berlaku melalui "sambungan" ke pangkalan data (sesuatu seperti pemegang fail OS), yang kami buka melalui panggilan ke fungsi DLL yang sepadan. Apabila dibuka, nama fail pangkalan data ditunjukkan. Jika tiada perkara sedemikian, ia secara automatik dicipta.
Ia boleh diterima untuk membuka berbilang sambungan ke pangkalan data yang sama (melalui nama fail) dalam aplikasi yang sama atau berbeza.
Sistem ini menggunakan mekanisme menyekat akses fail di peringkat OS untuk menjadikan semuanya berfungsi
(mekanisme ini biasanya tidak berfungsi dengan baik pada pemacu rangkaian, jadi tidak disyorkan untuk menggunakan SQlite dengan fail pada rangkaian).
Pada mulanya, SQlite bekerja berdasarkan prinsip "banyak membaca, satu menulis."
Iaitu, hanya satu sambungan yang menulis ke pangkalan data pada masa tertentu. Jika sambungan lain cuba menulis juga, mereka akan mendapat ralat SQLITE_BUSY.
Walau bagaimanapun, anda boleh memasukkan tamat masa operasi. Kemudian sambungan, berhadapan dengan pangkalan data yang sibuk, akan menunggu N saat sebelum gagal dengan ralat SQLITE_BUSY.
Jadi apa yang patut kita buat?
Sama ada satu sambungan dan semua permintaan melaluinya, atau meneruskan dari tamat masa yang mungkin dan menyediakan untuk mengulangi pelaksanaan SQL.
Terdapat satu lagi kemungkinan: tidak lama dahulu jenis log SQlite baharu muncul: Tulis Log Hadapan, WAL.
Jika anda mendayakan mod log khusus ini untuk pangkalan data, maka beberapa sambungan akan dapat mengubah suai pangkalan data secara serentak.
Tetapi dalam mod ini pangkalan data sudah menduduki beberapa fail.
Nah, kini jelas mengapa SQLite dahsyat, kerana ia tidak mempunyai GLOBAL CACHE?
Sesungguhnya, semua RDBMS moden tidak dapat difikirkan tanpa cache kongsi global, yang boleh menyimpan semua jenis barang seperti pertanyaan berparameter yang disusun. Ini dilakukan oleh pelayan yang tidak ada di sini. Walau bagaimanapun, dalam aplikasi yang sama, SQlite boleh berkongsi cache antara beberapa sambungan (baca di sini: www.sqlite.org/sharedcache.html) dan menyimpan sedikit memori.
Mengapa semua orang mengadu bahawa SQLite lambat?
Dua sebab. Yang pertama ialah tetapan lalai. Mereka bekerja untuk kebolehpercayaan, bukan prestasi.
Yang kedua ialah kurangnya pemahaman tentang mekanisme merekod transaksi. Secara lalai, selepas sebarang arahan, SQlite akan melakukan transaksi (iaitu, tunggu sehingga pangkalan data berada dalam keadaan konsisten sebelum mematikan kuasa). Bergantung pada mod paranoia, SQLite akan menghabiskan dari 50 hingga 300 ms untuk ini (menunggu tamat menulis data ke cakera).
Apa patut saya buat? Saya perlu memasukkan 100 ribu rekod dan cepat!
Padamkan indeks, hidupkan mod penyegerakan OFF (atau NORMAL), masukkan dalam bahagian N ribu (N - pilih, ambil 5000 untuk bermula). Sebelum memasukkan bahagian, lakukan MULAKAN TRANSAKSI, selepas - KOMIT.
Tetapi saya mendapati kesilapan! Bagaimana untuk melaporkan?
tak boleh.

Masalahnya, populariti SQLite adalah menakutkan - ia ada di mana-mana. Saya tidak bergurau.
Dan pembangun berdepan dengan limpahan mesej ralat yang sama ada disebabkan oleh salah faham atau permintaan ciri tersembunyi. Mereka sebenarnya menutup penerimaan langsung laporan dengan ralat.
Oleh itu, anda harus mendaftar untuk senarai mel dan menyiarkan masalah anda di sana dan berharap untuk yang terbaik.

Secara peribadi, saya mempunyai situasi yang saya tafsirkan sebagai kecacatan dalam SQLIte. Saya menerangkan perkara ini dalam surat berita. Tingkah laku SQLite telah diperbetulkan dalam versi seterusnya.

Utiliti berguna untuk bermain-main dengan SQLite.

Akan bersambung.

Tag: Tambah tag

Pada hari yang lain saya perlu membuat sistem untuk menjana data dengan cepat dan menyimpannya dalam pangkalan data SQLite. Dan semuanya perlu bekerja dengan cepat. Dengan cara ini, adalah perlu untuk menambah pangkalan data ke MySQL. Bagi MySQL, terdapat pelbagai pilihan alat untuk menambah data:

  1. INSERT mudah
  2. INSERT dan banyak nilai tambah (BULK INSERT)
  3. menambah melalui fail CSV

Yang terpantas, tanpa ragu-ragu, ialah pilihan No. 3. Sebenarnya, ia telah digunakan dalam sistem. Dengan cara ini, pilihan ini membolehkan anda menambah sehingga beberapa ratus ribu/juta rekod ke pangkalan data dalam masa beberapa saat. Sudah tentu, perkakasan pelayan juga memainkan peranan yang besar di sini, tetapi ini tidak akan dipertimbangkan sekarang.

Seperti yang kita semua tahu dengan baik, dan telah melihat lebih daripada sekali, keupayaan yang lebih besar memerlukan sumber yang lebih besar dan/atau perisian tambahan untuk menambah interaksi dengan sistem ini dan mengenakan sekatan tambahan.

Tidak seperti MySQL, SQLite agak ringan dan hanya memerlukan satu perpustakaan untuk berfungsi dengannya. Fail pangkalan data boleh diletakkan di mana-mana dan dipindahkan. Tetapi, menambah pangkalan data hanya boleh dilakukan melalui INSERT mudah. Ini bermakna penambahan melalui INSERT "PUKAL" tidak disokong. Dan, jika jadual mempunyai sekurang-kurangnya satu kunci (sekurang-kurangnya ia akan menjadi kunci utama), maka menambah satu rekod juga membayangkan membina semula indeks. Sekarang bayangkan anda perlu menambah beberapa ribu rekod dalam masa yang sesingkat mungkin. Walaupun betapa ringan dan pantasnya SQLite, ia mengambil masa yang agak lama.

Penyelesaian yang tidak dijangka telah ditemui (sekurang-kurangnya untuk saya - saya tidak mengkaji semua kemungkinan pangkalan data ini) - penggunaan transaksi. Ini memberikan peningkatan 10-100 kali ganda dalam kelajuan. Menyimpan/berjaya menyelesaikan transaksi adalah pantas - sebenarnya, data hanya dibuang ke dalam fail pangkalan data.

Apa yang diterangkan adalah baik, tetapi untuk set lengkap adalah perlu bahawa data ini ditulis ke fail sqlite yang berbeza. Untuk ini, kaedah yang mudah dan terbukti telah digunakan - penggunaan beberapa deskriptor. Nasib baik, terdapat beberapa fail. Selepas semua manipulasi ini, kami mempunyai skrip yang berjalan dalam masa kurang daripada 5 minit dan menulis data ke N fail dengan baris M dalam setiap satu. Biar saya membuat tempahan segera - dalam kes ini terdapat satu jadual dalam setiap fail pangkalan data.

Dan kini beberapa nombor:

Dalam pangkalan data ujian, transaksi dibuka untuk setiap fail dan kemudian ditutup dan disimpan. Nota penting: Setiap SQLite hanya boleh membenarkan satu pemegang bagi setiap fail. Jika anda cuba berinteraksi dengan pangkalan data dengan pemegang kedua, ralat akan dilemparkan.

Seperti yang anda lihat, pendekatan ini membolehkan anda menambah sejumlah besar data dalam masa yang minimum.

Perlu dinyatakan bahawa apabila saya mengatakan bahawa satu-satunya cara untuk menambah pangkalan data ke SQLite ialah INSERT mudah, saya tidak menunjukkan bahawa ini adalah satu-satunya pilihan menggunakan bahasa SQL.

Terdapat satu lagi pilihan - analog "LOAD DATA ..." dalam MySQL - mengimport data daripada fail CSV. Hanya pilihan ini membolehkan anda menambah data terus daripada persekitaran SQLite. Dalam erti kata lain, anda perlu terlebih dahulu membuka pangkalan data - sebagai contoh, memanggilnya dari konsol.

Import jadual path_to_csv_file

Pembatas lalai ialah aksara "|".

Untuk menukar pemisah, anda perlu memanggil arahan:

Pemisah

Sebagai pemisah, anda perlu menentukan pemisah lajur, sebagai contoh, ",".

Kelajuan penambahan dalam kes ini melebihi kelajuan kaedah yang diterangkan sebelum ini dengan faktor 100. Jadi mengapa kaedah ini tidak digunakan? Intinya ialah ini: bahasa pengaturcaraan sebelah pelayan (dalam kes ini PHP) boleh menggunakan satu versi perpustakaan sqlite, dan versi lain mungkin (atau mungkin tidak) dipasang pada sistem. Apabila menggabungkan kedua-dua kaedah interaksi sqlite ini, pangkalan data mungkin tidak tersedia untuk salah satu pilihan - ralat akan dilemparkan apabila cuba membacanya.

pengenalan

SQLite ialah pangkalan data hubungan yang boleh disoal menggunakan bahasa pertanyaan SQL. Pangkalan data tidak menyokong semua ciri SQL dan mempunyai fungsi yang lebih rendah daripada DBMS lain yang dibangunkan, tetapi ia agak sesuai untuk menyimpan dan mendapatkan maklumat.

Perbezaan antara SQLite dan MySQL dan DBMS yang serupa

DBMS klasik, seperti MySQL (serta MS SQL, Oracle, PostgreeSQL) terdiri daripada pelayan berasingan yang menyokong pangkalan data dan mendengar pada port tertentu untuk permintaan pelanggan. Pelanggan juga boleh menjadi sambungan PHP yang melaksanakan antara muka melalui mana permintaan kepada pangkalan data dibuat. Enjin SQLite dan antara mukanya dilaksanakan dalam satu perpustakaan, yang meningkatkan kelajuan pelaksanaan pertanyaan. Pelayan ini sering dipanggil terbina dalam.

Komen

Pangkalan data lain, seperti MySQL, juga mempunyai pelayan terbina dalam, tetapi penggunaannya memerlukan bayaran pelesenan dan oleh itu tidak digunakan secara meluas dalam dunia sumber terbuka.

SQLite ialah pangkalan data tanpa jenis. Lebih tepat lagi, terdapat hanya dua jenis - integer "integer" dan teks "teks". Selain itu, "integer" digunakan terutamanya untuk kunci utama jadual, dan "teks" akan digunakan untuk data yang tinggal. Panjang rentetan yang ditulis pada medan teks boleh menjadi sebarang panjang.

Ciri-ciri SQLite

Semua pangkalan data disimpan dalam fail, satu fail setiap pangkalan data. Bilangan pangkalan data, serta jadual di dalamnya, dihadkan hanya oleh ruang kosong yang tersedia di tapak. Dan saiz maksimum yang mungkin bagi satu pangkalan data ialah 2 TB.

Memandangkan semua data disimpan dalam fail, tiada masalah dengan memindahkan pangkalan data dari satu pengehosan ke pengehosan yang lain - anda hanya perlu menyalin fail yang sepadan.

Memasang SQLite

Dalam PHP5, sokongan SQLite dipasang dan didayakan secara lalai.

Pemasangan di bawah Windows: Untuk memasang SQLite, anda perlu memuat turun dan menyalin perpustakaan "php_sqlite.dll" ke folder sambungan, yang boleh dimuat turun dari pautan: http://snaps.php.net/win32/PECL_STABLE/php_sqlite.dll. Kemudian anda perlu menyahkomen (atau menambah) baris "extension=php_sqlite.dll" dalam fail "php.ini". Untuk SQLite berfungsi dengan baik, anda juga perlu menyahkomen baris "extension=php_pdo.dll".

Komen

Komen

Pustaka "php_pdo.dll" mesti dimuatkan sebelum "php_sqlite.dll" dimuatkan. Iaitu, dalam php.ini baris "extension=php_sqlite.dll" sepatutnya muncul selepas "extension=php_pdo.dll".

Pemasangan di bawah Unix: Muat turun versi terkini SQLite dari tapak web rasmi (http://sqlite.org/download.html). Baca fail "INSTALL" yang dibekalkan dengan ujian modul sumber. Atau hanya gunakan arahan pemasangan PEAR: "pear install sqlite".

Bekerja dengan SQLite

Penciptaan pangkalan data: Untuk mencipta pangkalan data baharu, anda mesti menggunakan fungsi sqlite_open(). Jika pangkalan data yang namanya dinyatakan dalam parameter "nama fail" tidak wujud, maka fungsi tersebut akan mencipta pangkalan data baharu dengan nama "nama fail" dan mengembalikan pengecam pangkalan data.

Sumber sqlite_open (nama fail rentetan [, mod int [, rentetan &error_message]])

Skrip di bawah menunjukkan penciptaan pangkalan data baharu:

// Cipta pangkalan data

jika (! $db ) keluar( "Gagal mencipta pangkalan data!");
?>

Akibatnya, dalam folder dengan skrip kami akan mempunyai fail bernama "my_database.db" - pangkalan data kami.

Mencipta jadual: Semua pertanyaan ke pangkalan data dilakukan oleh fungsi sqlite_query(), yang mempunyai sintaks berikut:

Sumber sqlite_query (sumber dbhandle, pertanyaan rentetan)

Komen

Untuk bekerja dengan SQLite, seperti mana-mana pangkalan data hubungan, bahasa pertanyaan SQL digunakan. Oleh itu, anda boleh mencipta jadual data menggunakan pertanyaan CREATE TABLE tradisional, memasukkan rekod menggunakan pernyataan INSERT, mendapatkan semula rekod menggunakan pernyataan SELECT dan mengemas kini rekod sedia ada menggunakan pertanyaan KEMASKINI.

Contoh di bawah mencipta jadual jadual1 yang mengandungi tiga medan: id medan integer, yang bertindak sebagai kunci utama dan dua medan teks medan1 dan medan2.

$db = sqlite_open("my_database.db" );
jika (! $db ) keluar();
"BUAT JADUAL jadual1
(id KUNCI UTAMA INTEGER,
TEKS medan1,
bidang2 TEKS);
"
);
jika (! $query_table ) keluar();
$query_insert = sqlite_query ($db, "INSERT INTO table1(field1, field2) VALUES ("PHP5", "Apache");");
jika (! $query_insert ) keluar( "Tidak dapat menulis data ke jadual!");
?>

Selepas mencipta jadual, rekod ditambah kepadanya yang mengandungi baris "PHP5" dan "Apache", medan id secara automatik menerima nilai 1.

Mengeluarkan data daripada pangkalan data: Untuk memaparkan data daripada jadual, fungsi yang sama digunakan - sqlite_query(). Jika berbilang rekod diambil, hasil pengambilan hendaklah diproses menggunakan gelung while() dan fungsi sqlite_fetch_array(), yang mempunyai sintaks berikut:

Array sqlite_fetch_array (hasil sumber [, int result_type [, bool decode_binary]])

Di bawah ialah skrip yang menunjukkan output beberapa rekod daripada pangkalan data:

// Cipta pangkalan data baharu
$db = sqlite_open("my_database.db" );
jika (! $db ) keluar( "Tidak dapat mencipta pangkalan data!");
// Cipta jadual "table1" dalam pangkalan data
$query_table = sqlite_query ($db, "BUAT JADUAL jadual1
(id KUNCI UTAMA INTEGER,
/* id akan menjadi auto-increment secara automatik */
TEKS medan1,
bidang2 TEKS);
"
);
jika (! $query_table ) keluar( "Tidak dapat mencipta jadual dalam pangkalan data!");
// Tulis sesuatu pada meja
sqlite_query($db, );
sqlite_query($db, );
sqlite_query($db, );
// Mari kita sampel data
$res = sqlite_query ($db, "SELECT * FROM table1;" );
manakala ($array = sqlite_fetch_array ($res))
{

" );
}
?>

Hasil daripada skrip kami mendapat:

PHP5+Apache (id masuk:1)

Mengedit siaran: Untuk menukar medan, kami akan menggunakan fungsi sqlite_query() dan menghantar permintaan kemas kini (KEMASKINI).

// Cipta pangkalan data baharu
$db = sqlite_open("my_database.db" );
jika (! $db ) keluar( "Tidak dapat mencipta pangkalan data!");
// Cipta jadual "table1" dalam pangkalan data
$query_table = sqlite_query ($db, "BUAT JADUAL jadual1
(id KUNCI UTAMA INTEGER,
/* id akan menjadi auto-increment secara automatik */
TEKS medan1,
bidang2 TEKS);
"
);
jika (! $query_table ) keluar( "Tidak dapat mencipta jadual dalam pangkalan data!");
// Tulis sesuatu pada meja
sqlite_query ($db, "INSERT INTO table1(field1, field2) VALUES ("PHP5+", "Apache");");
sqlite_query ($db, "INSERT INTO table1(field1, field2) VALUES ("SQLite - ", "cool thing");");
sqlite_query ($db, "INSERT INTO table1(field1, field2) VALUES ("Lawati "," "sqlite.org");");
// Tukar medan dengan id=1
sqlite_query ($db, "KEMASKINI table1 SET field2="Apache+Linux" WHERE id=1;");
// Mari kita sampel data

// Dalam satu gelung kami akan memaparkan semua data yang diterima

{
echo($array [ "field1" ]. $array [ "field2" ]. " (entry id: " . $array [ "id" ]. ")
" );
}
?>

Hasilnya kami mendapat:

PHP5+Apache+Linux (id masuk:1)
SQLite adalah perkara yang menarik (post id: 2)
lawati sqlite.org (id pos:3)

Mengalih keluar rekod daripada jadual: Untuk memadamkan rekod daripada jadual, anda perlu menghantar permintaan padam (DELETE) kepada fungsi sqlite_query().

// Cipta pangkalan data baharu
$db = sqlite_open("my_database.db" );
jika (! $db ) keluar( "Tidak dapat mencipta pangkalan data!");
// Cipta jadual "table1" dalam pangkalan data
$query_table = sqlite_query ($db, "BUAT JADUAL jadual1
(id KUNCI UTAMA INTEGER,
/* id akan menjadi auto-increment secara automatik */
TEKS medan1,
bidang2 TEKS);
"
);
jika (! $query_table ) keluar( "Tidak dapat mencipta jadual dalam pangkalan data!");
// Tulis sesuatu pada meja
sqlite_query ($db, "INSERT INTO table1(field1, field2) VALUES ("PHP5+", "Apache");");
sqlite_query ($db, "INSERT INTO table1(field1, field2) VALUES ("SQLite - ", "cool thing");");
sqlite_query ($db, "INSERT INTO table1(field1, field2) VALUES ("Lawati "," "sqlite.org");");
// Padam medan dengan id=2
sqlite_query ($db, "PADAM DARI jadual1 WHERE id=2;");
// Mari kita sampel data
$query = sqlite_query ($db, "SELECT * FROM table1;" );
// Dalam satu gelung kami akan memaparkan semua data yang diterima
manakala ($array = sqlite_fetch_array ($query ))
{
echo($array [ "field1" ]. $array [ "field2" ]. " (entry id: " . $array [ "id" ]. ")
" );
}
?>