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:

 $ 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:

...
;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:

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:

$ 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:

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.

<?php
$ver = SQLite3::version();
echo $ver['versionString'] . "\n";

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

$ php version.php 
SQLite3 version 3.29.0

Berikut contoh lain mengakses database SQLite3 yang telah dibuat sebelumnya:

<?php
$db = new SQLite3('my.db');
echo $db->querySingle('SELECT SQLITE_VERSION()') . "\n";

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

$ 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.

<?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:

$ php exec.php
The last inserted row ID is 3

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

$ 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:

<?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:

Name: Doug Baldwin

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

$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:

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:

$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:

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.

<?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.

<?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.

<?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