Menggunakan Modul Pangkalan Data SQLite Terbina dalam ServBay untuk Pembangunan PHP
ServBay ialah persekitaran pembangunan web tempatan yang berkuasa, direka khusus untuk pembangun dengan sokongan pelbagai teknologi. Ia dilengkapi dengan modul pangkalan data SQLite terbina dalam, yang menjadikan penggunaan serta pengurusan data melalui SQLite dalam aplikasi PHP amat mudah. Artikel ini akan menerangkan dengan terperinci bagaimana memanfaatkan ciri ini dalam ServBay.
Pengenalan Modul SQLite
SQLite ialah sistem pengurusan pangkalan data hubungan terbina dalam yang ringan. Berbeza dengan pangkalan data klien/pelayan tradisional seperti MySQL atau PostgreSQL, SQLite tidak memerlukan proses pelayan berasingan – sebaliknya ia terus dibenamkan dalam aplikasi sebagai pustaka. Seluruh pangkalan data disimpan dalam satu fail tunggal, yang memudahkan penyebaran dan pengurusan.
SQLite terkenal kerana ciri-ciri berikut dan sangat sesuai untuk aplikasi sederhana, cache tempatan, aplikasi mudah alih, serta persekitaran pembangunan dan ujian:
Ciri-ciri Utama
- Ringan: Saiz teras pustaka kecil dengan penggunaan sumber yang minimum.
- Tanpa Konfigurasi: Tiada pemasangan atau konfigurasi pelayan diperlukan, sedia untuk digunakan.
- Prestasi Tinggi: Menyediakan prestasi cemerlang untuk kebanyakan operasi bacaan dan penulisan sederhana.
- Satu Fail Penyimpanan: Keseluruhan pangkalan data disimpan dalam satu fail
.sqlite
, mudah untuk sandaran, migrasi, dan pengurusan. - Sokongan Transaksi ACID: Menjamin pemprosesan transaksi yang boleh dipercayai untuk integriti data.
- Merentas Platform: Disokong di pelbagai sistem operasi dan bahasa pengaturcaraan.
Sokongan ServBay untuk SQLite
ServBay mengintegrasikan pelbagai versi PHP, dan untuk setiap versi, ekstensi SQLite berkaitan seperti sqlite3
dan pdo_sqlite
telah dipra-pasang dan diaktifkan secara lalai. Ini bermaksud anda tidak perlu memuat turun, kompilasi atau mengkonfigurasi tambahan ekstensi PHP – anda boleh terus menggunakan fungsi-fungsi SQLite dalam projek PHP anda.
Prasyarat
- ServBay telah dipasang dan dijalankan di macOS.
- Versi PHP pilihan anda telah diaktifkan dan dijalankan dalam ServBay.
- Anda mempunyai direktori untuk menyimpan fail laman web – disarankan menggunakan direktori root laman web lalai ServBay
/Applications/ServBay/www
atau mana-mana subdirektorinya.
Cara Menggunakan SQLite dalam ServBay
Oleh kerana modul SQLite diaktifkan secara lalai dalam ServBay, anda tidak perlu melakukan langkah pengaktifan khusus. Persekitaran PHP telah siap dan anda boleh terus memanggil fungsi serta kelas berkaitan SQLite.
Mengesahkan sama ada ekstensi SQLite telah diaktifkan:
Jika anda ingin mengesahkan bahawa ekstensi SQLite telah diloadkan, anda boleh melihat pada halaman keluaran phpinfo()
:
- Cipta satu fail PHP yang mengandungi
<?php phpinfo(); ?>
(contohnyainfo.php
). - Letakkan fail ini dalam mana-mana direktori laman web di bawah root ServBay, contohnya
/Applications/ServBay/www/servbay.demo/info.php
. - Akses fail tersebut melalui pelayar web (contohnya
http://servbay.demo/info.php
). - Cari perkataan "sqlite" atau "pdo_sqlite" pada halaman tersebut. Jika anda melihat bahagian konfigurasi berkaitan, ekstensi telah berjaya diaktifkan.
Menggunakan SQLite dalam Kod PHP
Sebaik sahaja anda mengesahkan ekstensi SQLite tersedia, anda boleh melakukan operasi pangkalan data dengan API SQLite dalam aplikasi PHP anda. PHP menawarkan beberapa kaedah untuk berinteraksi dengan SQLite; yang paling kerap digunakan adalah kelas SQLite3
(berorientasikan objek) dan PDO
(PHP Data Objects).
Berikut merupakan contoh mudah untuk sambungan, penciptaan jadual, penyisipan, dan carian data menggunakan kedua-dua cara dalam persekitaran ServBay. Disarankan supaya fail PHP dan fail pangkalan data .sqlite
anda disimpan dalam direktori projek laman web, contohnya /Applications/ServBay/www/nama-projek-anda/
.
Contoh Kod (Kaedah SQLite3 Standard)
Kaedah ini menggunakan kelas SQLite3
terbina dalam PHP, menyediakan antaramuka berorientasikan objek untuk mengendalikan SQLite.
php
<?php
// Laluan fail pangkalan data
// Disarankan meletakkan fail pangkalan data dalam subdirektori projek laman web, contohnya data/
$db_file = __DIR__ . '/data/servbay_demo.sqlite'; // __DIR__ ialah direktori skrip semasa
// Pastikan direktori data wujud
if (!is_dir(__DIR__ . '/data')) {
mkdir(__DIR__ . '/data', 0777, true);
}
// Sambungkan ke pangkalan data SQLite
// Jika fail tidak wujud, SQLite akan mencipta secara automatik
try {
$db = new SQLite3($db_file);
echo "Berjaya sambung ke pangkalan data: " . $db_file . "\n";
} catch (Exception $e) {
die("Gagal sambung ke pangkalan data: " . $e->getMessage());
}
// Cipta jadual
// Guna IF NOT EXISTS untuk elak ralat mencipta semula
$create_table_sql = "CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
)";
if ($db->exec($create_table_sql)) {
echo "Jadual 'users' telah dicipta atau sudah wujud\n";
} else {
echo "Gagal cipta jadual: " . $db->lastErrorMsg() . "\n";
}
// Sisip data
$name = 'ServBay Demo User';
$email = '[email protected]';
$age = 30;
// Guna pernyataan pra-siap untuk mengelak serangan SQL Injection
$stmt = $db->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->bindValue(':email', $email, SQLITE3_TEXT);
$stmt->bindValue(':age', $age, SQLITE3_INTEGER);
// Laksanakan penyisipan & semak sama ada berjaya (email adalah UNIQUE, sisipan berganda akan gagal)
if ($stmt->execute()) {
echo "Sisipan data berjaya: Name=" . $name . ", Email=" . $email . "\n";
} else {
// Semak jika ralat kekangan unik
if (strpos($db->lastErrorMsg(), 'UNIQUE constraint failed') !== false) {
echo "Sisipan data gagal: Email '" . $email . "' telah wujud\n";
} else {
echo "Sisipan data gagal: " . $db->lastErrorMsg() . "\n";
}
}
$stmt->close(); // Tutup pernyataan pra-siap
// Carian data
$search_name = 'ServBay Demo User';
$query_sql = "SELECT id, name, email, age FROM users WHERE name = :name";
$stmt = $db->prepare($query_sql);
$stmt->bindValue(':name', $search_name, SQLITE3_TEXT);
$result = $stmt->execute();
echo "Hasil carian:\n";
$found = false;
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
print_r($row);
$found = true;
}
if (!$found) {
echo "Tiada data sepadan dijumpai\n";
}
$result->finalize(); // Bebaskan set keputusan
$stmt->close(); // Tutup pernyataan pra-siap
// Tutup sambungan pangkalan data
$db->close();
echo "Sambungan pangkalan data ditutup\n";
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Contoh Kod (Kaedah PDO)
PDO (PHP Data Objects) menyediakan lapisan abstraksi capaian pangkalan data yang seragam. Anda boleh menggunakan kaedah yang sama untuk mengakses pelbagai sistem pangkalan data. Mengakses SQLite melalui PDO amat disarankan kerana ia lebih fleksibel dan menyokong lebih banyak fitur.
php
<?php
// Laluan fail pangkalan data
// Disarankan meletakkan fail pangkalan data dalam subdirektori projek laman web, contohnya data/
$db_file = __DIR__ . '/data/servbay_demo_pdo.sqlite'; // __DIR__ ialah direktori skrip semasa
// Pastikan direktori data wujud
if (!is_dir(__DIR__ . '/data')) {
mkdir(__DIR__ . '/data', 0777, true);
}
try {
// Cipta instans PDO baharu
// Format DSN (Data Source Name) adalah 'sqlite:laluan-fail-pangkalan-data'
$dsn = 'sqlite:' . $db_file;
$pdo = new PDO($dsn);
// Tetapan mod ralat: buang pengecualian untuk debug
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Tetapan mod pengambilan secara lalai – contoh: array bersekutu
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo "Berjaya sambung ke pangkalan data: " . $db_file . "\n";
// Cipta jadual
$create_table_sql = "CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
)";
$pdo->exec($create_table_sql);
echo "Jadual 'users' telah dicipta atau sudah wujud\n";
// Sisip data
$name = 'ServBay PDO User';
$email = '[email protected]';
$age = 35;
// Pernyataan pra-siap
$stmt = $pdo->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
// Laksanakan penyisipan & semak sama ada berjaya (email adalah UNIQUE, sisipan berganda akan gagal)
try {
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "Sisipan data berjaya: Name=" . $name . ", Email=" . $email . "\n";
} catch (PDOException $e) {
// Semak jika ralat kekangan unik (Kod ralat SQLite 19)
if ($e->getCode() == '23000' || strpos($e->getMessage(), 'UNIQUE constraint failed') !== false) {
echo "Sisipan data gagal: Email '" . $email . "' telah wujud\n";
} else {
throw $e; // Lempar semula jenis ralat lain
}
}
$stmt->closeCursor(); // Bebaskan sumber pernyataan
// Carian data
$search_name = 'ServBay PDO User';
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => $search_name]);
$data = $stmt->fetchAll(); // Ambil semua baris keputusan
echo "Hasil carian:\n";
if ($data) {
print_r($data);
} else {
echo "Tiada data sepadan dijumpai\n";
}
$stmt->closeCursor(); // Bebaskan sumber pernyataan
} catch (PDOException $e) {
// Tangkap pengecualian PDO
echo "Operasi pangkalan data gagal: " . $e->getMessage();
// Anda juga boleh ambil kod ralat SQLSTATE melalui $e->getCode()
}
// Sambungan PDO akan ditutup automatik pada akhir skrip, tidak perlu tutup secara eksplisit
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Lokasi Fail Pangkalan Data:
Dalam contoh di atas, fail pangkalan data (servbay_demo.sqlite
dan servbay_demo_pdo.sqlite
) akan dicipta dalam subdirektori data/
pada direktori skrip PHP semasa. Contohnya, jika fail PHP anda berada di /Applications/ServBay/www/my-servbay-project/index.php
, maka fail pangkalan data akan wujud di /Applications/ServBay/www/my-servbay-project/data/
.
Menyimpan fail pangkalan data dalam subdirektori projek adalah amalan yang baik untuk pengurusan dan sandaran projek. Pastikan pengguna ServBay mempunyai hak menulis pada direktori tersebut (dalam tetapan lalai ServBay pada macOS, perkara ini biasanya tidak bermasalah).
Perhatian
- Fail pangkalan data SQLite adalah data sensitiviti, pastikan ia tidak boleh diakses secara umum. Simpan fail pangkalan data di luar direktori yang boleh diakses web, atau gunakan konfigurasi pelayan (seperti Caddy atau Nginx) untuk menghalang capaian terus ke fail
.sqlite
. Contoh di atas meletakkannya dalam subdirektoridata/
hanyalah untuk kemudahan demonstrasi; untuk persekitaran produksi, pastikan anda mengikuti piawaian keselamatan yang lebih ketat. - SQLite sesuai untuk senario yang tidak memerlukan penulisan selari secara tinggi. Jika digunakan dalam persekitaran penulisan serentak yang banyak, mungkin akan berdepan isu prestasi atau kekunci. Untuk aplikasi penulisan serentak tahap tinggi, pilihlah pangkalan data klien/pelayan seperti MySQL atau PostgreSQL.
- Walaupun SQLite dihidupkan secara lalai dalam ServBay, jika maklumat berkaitan tidak kelihatan pada
phpinfo()
, semak konfigurasi PHP di ServBay atau cuba mulakan semula perkhidmatan ServBay.
Soalan Lazim (FAQ)
S: Adakah saya perlu pasang SQLite secara berasingan?
J: Tidak perlu. Pek perisian PHP ServBay telah menyertakan dan menghidupkan ekstensi SQLite secara lalai, jadi anda boleh menggunakannya terus dalam kod PHP anda.
S: Di mana saya patut letak fail pangkalan data .sqlite
saya?
J: Disarankan supaya anda letakkan dalam subdirektori projek laman web anda yang tidak boleh dicapai secara langsung dari web (contohnya dalam data/
atau database/
), untuk meningkatkan keselamatan. Dalam contoh kod, lokasi diberikan sebagai laluan relatif dengan __DIR__ . '/data/'
.
S: Kenapa skrip PHP saya tak boleh sambung ke SQLite atau cipta fail?
J: Periksa perkara berikut:
- Pastikan ServBay berjalan, dan anda mengakses fail PHP anda melalui ServBay.
- Semak maklumat
phpinfo()
dan pastikan ekstensisqlite3
sertapdo_sqlite
telah dinyalakan. - Pastikan direktori untuk menyimpan fail pangkalan data wujud dan pengguna ServBay mempunyai hak menulis.
Rumusan
ServBay menyediakan sokongan SQLite yang mudah untuk pembangun PHP. Dengan modul SQLite terbina dalam yang diaktifkan secara lalai, anda boleh membangunkan dan menguji aplikasi berasaskan SQLite secara tempatan tanpa proses konfigurasi yang rumit. Digabung dengan ciri ringan dan tanpa konfigurasi SQLite, ServBay menjadi alat pembangunan tempatan yang efisien dan mudah digunakan.