Memprogram Database SQLite3 di PHP

SQLite adalah engine database yang paling banyak dipakai, digunakan di setiap smartphone dan di banyak komputer, dibundel dibanyak aplikasi yang digunakan sehari-hari. Meski aplikasi server seperti PHP lebih mengandalkan database server seperti MySQL atau PostgreSQL, SQLite dapat menjadi pilihan tepat untuk aplikasi yang berjalan di server tunggal dan membutuhkan engine database yang ringan.

SQLite3 adalah SQLite versi 3, peningkatan dari versi sebelumnya 2.8. Saat tulisan ini dibuat, rilis terakhir SQLite3 yang dapat dipakai adalah versi 3.29.0

Instalasi Modul dan Klien

Sebelum menggunakan SQLite di PHP, lakukan pemasangan modul sqlite3 dengan perintah berikut:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo apt install php-sqlite3
$ sudo apt install php-sqlite3
 $ sudo apt install php-sqlite3

Jika membangun aplikasi PHP di windows, pastikan ekstensi sqlite3 diaktifkan, berikut baris kode di php.ini untuk mengaktifkan ekstensi sqlite3:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
...
;extension=sockets
extension=sqlite3
;extension=tidy
...
... ;extension=sockets extension=sqlite3 ;extension=tidy ...
...
;extension=sockets
extension=sqlite3
;extension=tidy
...

Instal pula aplikasi klien untuk dapat bekerja menggunakan SQLite, seperti membuat database baru dan mengatur bentuk tabel. Di Linux, aplikasi klien dapat diinstal dengan perintah berikut:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo apt install sqlite3
sudo apt install sqlite3
sudo apt install sqlite3

Aplikasi klien untuk sistem operasi lain bisa diunduh melalui: https://www.sqlite.org/download.html.

Alternatif selain aplikasi klien berbasis baris perintah / CLI, aplikasi klien SQLite juga terdapat antarmuka berbasis grafis / GUI, salah satunya adalah SQLite Browser yang dapat diunduh melalui https://sqlitebrowser.org/

Buat Database

Sebelum melakukan pemprograman database SQLite menggunakan PHP, buat database baru dengan perintah sebagai berikut:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sqlite3 my.db
SQLite version 3.29.0 2019-07-10 17:32:03
Enter ".help" for usage hints.
sqlite>
$ sqlite3 my.db SQLite version 3.29.0 2019-07-10 17:32:03 Enter ".help" for usage hints. sqlite>
$ sqlite3 my.db
SQLite version 3.29.0 2019-07-10 17:32:03
Enter ".help" for usage hints.
sqlite> 

Dari perintah di atas, akan dibuat database dengan nama my.db. Pada command prompt sqlite>, masukkan beberapa perintah berikut:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sqlite> .tables
sqlite> .exit
sqlite> .tables sqlite> .exit
sqlite> .tables
sqlite> .exit

Akses SQLite3 di PHP

Kelas SQLite3 digunakan sebagai interface untuk berinteraksi dengan database SQLite. Berikut contoh menampilkan versi SQLite3 yang digunakan oleh PHP.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$ver = SQLite3::version();
echo $ver['versionString'] . "\n";
<?php $ver = SQLite3::version(); echo $ver['versionString'] . "\n";
<?php
$ver = SQLite3::version();
echo $ver['versionString'] . "\n";

Simpan file di atas dengan nama version.php kemudian jalankan perintah:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ php version.php
SQLite3 version 3.29.0
$ php version.php SQLite3 version 3.29.0
$ php version.php 
SQLite3 version 3.29.0

Berikut contoh lain mengakses database SQLite3 yang telah dibuat sebelumnya:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$db = new SQLite3('my.db');
echo $db->querySingle('SELECT SQLITE_VERSION()') . "\n";
<?php $db = new SQLite3('my.db'); echo $db->querySingle('SELECT SQLITE_VERSION()') . "\n";
<?php
$db = new SQLite3('my.db');
echo $db->querySingle('SELECT SQLITE_VERSION()') . "\n";

Simpan skrip di atas sebagai file access.php kemudian jalankan:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ php version.php
3.29.0
$ php version.php 3.29.0
$ php version.php 
3.29.0

Method exec()

Method exec() Menjalankan query tanpa hasil terhadap suatu database. Fungsi ini dapat digunakan untuk membuat tabel atau memasukkan record ke dalam tabel.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$db = new SQLite3('my.db');
$sql = "CREATE TABLE `people` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT,
`gender` TEXT,
`age` INT,
`city` TEXT,
`created_at` TEXT
)";
$db->exec($sql);
$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`)
VALUES ('Caydence Dillon','Female',NULL,'Amarillo','3/30/2019 4:37 PM');");
$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`)
VALUES ('Doug Baldwin','Male',52,'Indianapolis','1/24/2019 1:38 PM');");
$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`)
VALUES ('David Janes','Male',62,'Anaheim','2/11/2019 8:07 AM');");
$last_row_id = $db->lastInsertRowID();
echo "The last inserted row ID is $last_row_id \n";
<?php $db = new SQLite3('my.db'); $sql = "CREATE TABLE `people` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT, `gender` TEXT, `age` INT, `city` TEXT, `created_at` TEXT )"; $db->exec($sql); $db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) VALUES ('Caydence Dillon','Female',NULL,'Amarillo','3/30/2019 4:37 PM');"); $db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) VALUES ('Doug Baldwin','Male',52,'Indianapolis','1/24/2019 1:38 PM');"); $db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) VALUES ('David Janes','Male',62,'Anaheim','2/11/2019 8:07 AM');"); $last_row_id = $db->lastInsertRowID(); echo "The last inserted row ID is $last_row_id \n";
<?php
$db = new SQLite3('my.db');

$sql = "CREATE TABLE `people` (
  `id`	INTEGER PRIMARY KEY AUTOINCREMENT,
  `name`	TEXT,
  `gender`	TEXT,
  `age`	INT,
  `city`	TEXT,
  `created_at`	TEXT
)";
$db->exec($sql);

$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) 
    VALUES ('Caydence Dillon','Female',NULL,'Amarillo','3/30/2019 4:37 PM');");
$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) 
    VALUES ('Doug Baldwin','Male',52,'Indianapolis','1/24/2019 1:38 PM');");
$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) 
    VALUES ('David Janes','Male',62,'Anaheim','2/11/2019 8:07 AM');");

$last_row_id = $db->lastInsertRowID();
echo "The last inserted row ID is $last_row_id \n";

Kode di atas membuat tabel people dan menambahkan 3 baris data ke tabel tersebut. Di bagian terakhir kode, terdapat method lastInsertRowID() untuk mengetahui ID terakhir dari baris yang telah dimasukkan ke dalam tabel. Jalankan kode di atas sebagai berikut:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ php exec.php
The last inserted row ID is 3
$ php exec.php The last inserted row ID is 3
$ php exec.php
The last inserted row ID is 3

Untuk melihat data yang telah dimasukkan ke dalam database, gunakan konsol sqlite3 berikut:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sqlite3 my.db
sqlite> .mode column
sqlite> .headers on
sqlite> select * from people;
id name gender age city created_at
---------- --------------- ---------- ---------- ---------- -----------------
1 Caydence Dillon Female Amarillo 3/30/2019 4:37 PM
2 Doug Baldwin Male 52 Indianapol 1/24/2019 1:38 PM
3 David Janes Male 62 Anaheim 2/11/2019 8:07 AM
$ sqlite3 my.db sqlite> .mode column sqlite> .headers on sqlite> select * from people; id name gender age city created_at ---------- --------------- ---------- ---------- ---------- ----------------- 1 Caydence Dillon Female Amarillo 3/30/2019 4:37 PM 2 Doug Baldwin Male 52 Indianapol 1/24/2019 1:38 PM 3 David Janes Male 62 Anaheim 2/11/2019 8:07 AM
$ sqlite3 my.db
sqlite> .mode column
sqlite> .headers on
sqlite> select * from people;
id          name             gender      age         city        created_at       
----------  ---------------  ----------  ----------  ----------  -----------------
1           Caydence Dillon  Female                  Amarillo    3/30/2019 4:37 PM
2           Doug Baldwin     Male        52          Indianapol  1/24/2019 1:38 PM
3           David Janes      Male        62          Anaheim     2/11/2019 8:07 AM

Query Data

Dalam bahasa SQL, statement SELECT digunakan untuk mengambil data dalam tabel. Ada dua method yang dapat digunakan untuk query data menggunakan statement SELECT, yaitu method querySingle dan method query.

Method querySingle mengembalikan nilai dari kolom pertama yang dihasilkan query. Sebagai contoh:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$db = new SQLite3('my.db');
$name = $db->querySingle('SELECT name FROM people WHERE id=2');
echo "Name: $name";
<?php $db = new SQLite3('my.db'); $name = $db->querySingle('SELECT name FROM people WHERE id=2'); echo "Name: $name";
<?php
$db = new SQLite3('my.db');

$name = $db->querySingle('SELECT name FROM people WHERE id=2');
echo "Name: $name";

Kode di atas akan menghasilkan nilai dari kolom name yang mempunyai id = 2, output yang dihasilkan:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Name: Doug Baldwin
Name: Doug Baldwin
Name: Doug Baldwin

Parameter kedua method querySingle dapat diset true untuk menghasilkan array dari seluruh baris pertama.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$person = $db->querySingle('SELECT name, gender, age FROM people WHERE id=3', true);
echo "Name: {$person['name']}, Gender: {$person['gender']}, Age: {$person['age']}";
$person = $db->querySingle('SELECT name, gender, age FROM people WHERE id=3', true); echo "Name: {$person['name']}, Gender: {$person['gender']}, Age: {$person['age']}";
$person = $db->querySingle('SELECT name, gender, age FROM people WHERE id=3', true);
echo "Name: {$person['name']}, Gender: {$person['gender']}, Age: {$person['age']}";

Kode di atas akan menghasilkan output:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Name: Doug Baldwin, Gender: Male, Age: 52
Name: Doug Baldwin, Gender: Male, Age: 52
Name: Doug Baldwin, Gender: Male, Age: 52

Sedangkan method query() mengembalikan nilai objek dari kelas SQLite3Result. Method ini dapat digunakan untuk mengambil seluruh data yang dihasilkan dari statement SELECT. Sebagai contoh:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$res = $db->query("SELECT id, name, gender, age FROM people");
while ($row = $res->fetchArray()) {
echo "{$row['id']}. {$row['name']}: {$row['gender']} {$row['age']} \n";
}
$res = $db->query("SELECT id, name, gender, age FROM people"); while ($row = $res->fetchArray()) { echo "{$row['id']}. {$row['name']}: {$row['gender']} {$row['age']} \n"; }
$res = $db->query("SELECT id, name, gender, age FROM people");
while ($row = $res->fetchArray()) {
    echo "{$row['id']}. {$row['name']}: {$row['gender']} {$row['age']} \n";
}

Kode di atas akan mengasilkan:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
1. Caydence Dillon: Female
2. Doug Baldwin: Male 52
3. David Janes: Male 62
1. Caydence Dillon: Female 2. Doug Baldwin: Male 52 3. David Janes: Male 62
1. Caydence Dillon: Female  
2. Doug Baldwin: Male 52 
3. David Janes: Male 62 

Escape String

Gunakan method escapeString() untuk escape string sebelum eksekusi atau query statement SQL.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$db = new SQLite3('my.db');
$name = "O'Reilly";
$escaped_name = SQLite3::escapeString($name);
$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`).
VALUES('$escaped_name','Male',41,'Wien','2/1/2019 2:11 PM');");
$person = $db->querySingle("SELECT name, gender, age FROM people WHERE name LIKE '%{$escaped_name}%'", true);
echo "Name: {$person['name']}, Gender: {$person['gender']}, Age: {$person['age']}";
<?php $db = new SQLite3('my.db'); $name = "O'Reilly"; $escaped_name = SQLite3::escapeString($name); $db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`). VALUES('$escaped_name','Male',41,'Wien','2/1/2019 2:11 PM');"); $person = $db->querySingle("SELECT name, gender, age FROM people WHERE name LIKE '%{$escaped_name}%'", true); echo "Name: {$person['name']}, Gender: {$person['gender']}, Age: {$person['age']}";
<?php
$db = new SQLite3('my.db');

$name  = "O'Reilly";
$escaped_name = SQLite3::escapeString($name);

$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`).
    VALUES('$escaped_name','Male',41,'Wien','2/1/2019 2:11 PM');");

$person = $db->querySingle("SELECT name, gender, age FROM people WHERE name LIKE '%{$escaped_name}%'", true);
echo "Name: {$person['name']}, Gender: {$person['gender']}, Age: {$person['age']}";

Parameter Binding Pada Statement SQL

Saat aplikasi berhadapan dengan input dari user, statement SQL dibuat menjadi dinamis. Faktor keamanan menjadi hal utama saat berhadapan dengan input yang dimasukkan user. Cara yang disarankan untuk membuat statement SQL secara dinamis adalah dengan menggunakan pengikatan parameter.

Query dengan parameter dibuat dengan method prepare(), digunakan untuk menyiapkan statement SQL. Method ini akan mengembalikan objek dari kelas SQLite3Stmt. Objek statement tersebut mempunyai method bindParam() dan bindValue() yang digunakan untuk mengikat / binding value ke placeholder.

Method bindParam() digunakan untuk mengikat parameter ke variabel statement.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$db = new SQLite3('my.db');
$stmt = $db->prepare("INSERT INTO people
(`name`, `gender`, `age`, `city`, `created_at`)
VALUES(:name, :gender, :age, :city, :created_at);");
$stmt->bindParam(':name', $name, SQLITE3_TEXT);
$stmt->bindParam(':gender', $gender, SQLITE3_TEXT);
$stmt->bindParam(':age', $age, SQLITE3_INTEGER);
$stmt->bindParam(':city', $city, SQLITE3_TEXT);
$stmt->bindParam(':created_at', $created_at, SQLITE3_TEXT);
$name = 'Abdul Radley';
$gender = 'Male';
$age = 57;
$city = 'Fremont';
$created_at = '9/18/2019 2:56 PM';
$stmt->execute();
$name = 'Daron Reyes';
$gender = 'Male';
$age = 37;
$city = 'Las Vegas';
$created_at = '6/6/2019 3:44 PM';
$stmt->execute();
<?php $db = new SQLite3('my.db'); $stmt = $db->prepare("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) VALUES(:name, :gender, :age, :city, :created_at);"); $stmt->bindParam(':name', $name, SQLITE3_TEXT); $stmt->bindParam(':gender', $gender, SQLITE3_TEXT); $stmt->bindParam(':age', $age, SQLITE3_INTEGER); $stmt->bindParam(':city', $city, SQLITE3_TEXT); $stmt->bindParam(':created_at', $created_at, SQLITE3_TEXT); $name = 'Abdul Radley'; $gender = 'Male'; $age = 57; $city = 'Fremont'; $created_at = '9/18/2019 2:56 PM'; $stmt->execute(); $name = 'Daron Reyes'; $gender = 'Male'; $age = 37; $city = 'Las Vegas'; $created_at = '6/6/2019 3:44 PM'; $stmt->execute();
<?php
$db = new SQLite3('my.db');

$stmt = $db->prepare("INSERT INTO people 
    (`name`, `gender`, `age`, `city`, `created_at`)
    VALUES(:name, :gender, :age, :city, :created_at);");
$stmt->bindParam(':name', $name, SQLITE3_TEXT);
$stmt->bindParam(':gender', $gender, SQLITE3_TEXT);
$stmt->bindParam(':age', $age, SQLITE3_INTEGER);
$stmt->bindParam(':city', $city, SQLITE3_TEXT);
$stmt->bindParam(':created_at', $created_at, SQLITE3_TEXT);

$name = 'Abdul Radley';
$gender = 'Male';
$age = 57;
$city = 'Fremont';
$created_at = '9/18/2019 2:56 PM';
$stmt->execute();

$name = 'Daron Reyes';
$gender = 'Male';
$age = 37;
$city = 'Las Vegas';
$created_at = '6/6/2019 3:44 PM';
$stmt->execute();

Method bindValue() digunakan untuk mengikat nilai dari parameter ke variabel statement.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$db = new SQLite3('my.db');
$stmt = $db->prepare("INSERT INTO people
(`name`, `gender`, `age`, `city`, `created_at`)
VALUES(:name, :gender, :age, :city, :created_at);");
$stmt->bindValue(':name', 'Rick Martin', SQLITE3_TEXT);
$stmt->bindValue(':gender', 'Male', SQLITE3_TEXT);
$stmt->bindValue(':age', 59, SQLITE3_INTEGER);
$stmt->bindValue(':city', 'New Orleans', SQLITE3_TEXT);
$stmt->bindValue(':created_at', '1/11/2019 5:26 PM', SQLITE3_TEXT);
$stmt->execute();
$stmt->bindValue(':name', 'Peter Wilson', SQLITE3_TEXT);
$stmt->bindValue(':gender', 'Male', SQLITE3_TEXT);
$stmt->bindValue(':age', 55, SQLITE3_INTEGER);
$stmt->bindValue(':city', 'Louisville', SQLITE3_TEXT);
$stmt->bindValue(':created_at', '1/19/2019 7:13 AM', SQLITE3_TEXT);
$stmt->execute();
<?php $db = new SQLite3('my.db'); $stmt = $db->prepare("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) VALUES(:name, :gender, :age, :city, :created_at);"); $stmt->bindValue(':name', 'Rick Martin', SQLITE3_TEXT); $stmt->bindValue(':gender', 'Male', SQLITE3_TEXT); $stmt->bindValue(':age', 59, SQLITE3_INTEGER); $stmt->bindValue(':city', 'New Orleans', SQLITE3_TEXT); $stmt->bindValue(':created_at', '1/11/2019 5:26 PM', SQLITE3_TEXT); $stmt->execute(); $stmt->bindValue(':name', 'Peter Wilson', SQLITE3_TEXT); $stmt->bindValue(':gender', 'Male', SQLITE3_TEXT); $stmt->bindValue(':age', 55, SQLITE3_INTEGER); $stmt->bindValue(':city', 'Louisville', SQLITE3_TEXT); $stmt->bindValue(':created_at', '1/19/2019 7:13 AM', SQLITE3_TEXT); $stmt->execute();
<?php
$db = new SQLite3('my.db');

$stmt = $db->prepare("INSERT INTO people 
    (`name`, `gender`, `age`, `city`, `created_at`)
    VALUES(:name, :gender, :age, :city, :created_at);");

$stmt->bindValue(':name', 'Rick Martin', SQLITE3_TEXT);
$stmt->bindValue(':gender', 'Male', SQLITE3_TEXT);
$stmt->bindValue(':age', 59, SQLITE3_INTEGER);
$stmt->bindValue(':city', 'New Orleans', SQLITE3_TEXT);
$stmt->bindValue(':created_at', '1/11/2019 5:26 PM', SQLITE3_TEXT);
$stmt->execute();

$stmt->bindValue(':name', 'Peter Wilson', SQLITE3_TEXT);
$stmt->bindValue(':gender', 'Male', SQLITE3_TEXT);
$stmt->bindValue(':age', 55, SQLITE3_INTEGER);
$stmt->bindValue(':city', 'Louisville', SQLITE3_TEXT);
$stmt->bindValue(':created_at', '1/19/2019 7:13 AM', SQLITE3_TEXT);
$stmt->execute();

Kode Github