1. このページの目的
PHPからSQLiteを利用する手順について記録する。
実際に本ページで利用してみる。
2. 環境
実験時
- PHP: 7.3.14
 - SQLite: 3.7.17
 
3. PHP から SQLite を使う
要件
- PHP 7.4.0 以降では、別途 libsqlite ≥ 3.7.4 を導入して利用する。
 - それより前のバージョンでは、バンドルされた libsqlite が利用される。
 
(情報元:PHP: 要件 - Manual)
SQLite のファイルを用意する
sqlite3 コマンドで、データベースファイルを生成する。
$ sqlite3 ex1.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table tbl1(one varchar(10), two smallint);
sqlite> insert into tbl1 values('hello', 10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> insert into tbl1 values('hi', 105);
sqlite> select * from tbl1;
hello|10
goodbye|20
sqlite>
      ついでに、テーブルを1つ作成しておいた。
| レコードNo. | one | two | 
|---|---|---|
| 0 | 'hello' | 10 | 
| 1 | 'goodbye' | 20 | 
| 2 | 'hi' | 105 | 
データベースファイルは、ウェブ経由でアクセスされないように、ドキュメントルート外に置くかパーミッションを適切に設定すること。
(参考:Command Line Shell For SQLite)
4. PHPを使いデータを取得して表示する (SQLite3クラスを利用)
PHPコード
$db = new SQLite3('ex1.db');
$stmt = $db->prepare('SELECT * FROM tbl1 WHERE two>=:two');
$stmt->bindValue(':two', 15, SQLITE3_INTEGER);
$result = $stmt->execute();
if ($result !== false) {
  while ($arr = $result->fetchArray()) {
    echo '<pre>';
    var_export($arr);
    echo '</pre>';
  }
}
      デモ
array ( 0 => 'goodbye', 'one' => 'goodbye', 1 => 20, 'two' => 20, )
array ( 0 => 'hi', 'one' => 'hi', 1 => 105, 'two' => 105, )
5. PHPを使いデータを取得して表示する (PDOを利用)
PHPコード
try {
  $dbh = new PDO('sqlite:./ex1.db', '', '',
           [PDO::ATTR_EMULATE_PREPARES => false]);
  $st = $dbh->prepare('SELECT * from tbl1 WHERE two >= :two');
  $st->execute(array(':two' => 15));
  $rows = $st->fetchall();
  echo '<pre>';
  var_export($rows);
  echo '</pre>';
  $dbh = null;
} catch (PDOException $e) {
    echo "エラー!: " . $e->getMessage() . "<br/>";
}
      デモ
array (
  0 => 
  array (
    'one' => 'goodbye',
    0 => 'goodbye',
    'two' => 20,
    1 => 20,
  ),
  1 => 
  array (
    'one' => 'hi',
    0 => 'hi',
    'two' => 105,
    1 => 105,
  ),
)      - カラムtwoの値が文字列になっている。
PDO::ATTR_EMULATE_PREPARESを false にしてもダメなようだ(MySQLなら対応できるはず)。なので、この指定はいらないだろう。 PDO::ATTR_CURSORやPDO::FETCH_CLASSの指定については未調査。SQLite はこの手のオプションに対応していないことが多そう。
参考
6. メモ
- サーバー側でデータを保存しておきたい場合、SQLite は手軽に使えて便利。
 - SQLite のデータベースファイルは、ブラウザからアクセス不可のパーミッションで使えるので安全である。