Toshusai blog

知識の保管庫

PHPでSQLite3を使う

PHPでSQLite3を使う

SQLite3とは、簡単に言えばサーバーを必要としないデータベースのこと。
(PHP 5 >= 5.3.0, PHP 7)で使える。

インストール

apt-get install php5-sqlite

データベースにアクセスする

ファイルがなければ作られる。

<?php
$db = new SQLite3(filename);
?>

クエリを実行する

public bool SQLite3::exec ( string $query )でクエリを実行できる。
成功したらtrue、失敗したらfalseが返る。

<?php
$db->exec("CREATE TABLE fruits (id, name)");
$db->exec("INSERT INTO fruits VALUES (1, 'apple')");
?>

SELECT文を実行する

execでSELECT文を実行してもデータは抜き出せないので、SELECT文を使いたい時は、
public SQLite3Result SQLite3::query ( string $query )
SQLIte3Resultから抜き出したカラム(行)を得るには、
public array SQLite3Result::fetchArray ([ int $mode = SQLITE3_BOTH ] )
引数の$modeによって得られる配列の形が変わる。
SQLITE3_ASSOC:文字列のインデックス(カラム名)
SQLITE3_NUM:数字のインデックス(0から始まる)
SQLITE3_BOTH:文字列、数字、両方

<?php
$res = $db->query("SELECT * FROM fruits");
var_dump($res->fetchArray());
/*
array(4) {
  [0]=>
  int(1)
  ["id"]=>
  int(3)
  [1]=>
  string(4) "apple"
  ["name"]=>
  string(4) "apple"
}
*/
?>

SELECTしたデータを扱う

実はfetchArray()で取れるのは1行だけなので、SELECTした行を順に取るには、while文で繰り返す必要がある。

<?php
$db->exec("INSERT INTO fruits VALUES (2, 'banana')");
$db->exec("INSERT INTO fruits VALUES (3, 'orange')");
$res = $db->query("SELECT * FROM fruits");
while($row = $res->fetchArray()){
    print($row["id"] . ", " . $row["name"] . "\n");
}
/*
1, apple
2, banana
3, orange
*/
?>

fetchArray()とwhile文について

fetchArray()は1行だけ取り、呼び出す度に次の行を取ってくる。 全部の行を取り終わったらfalseを返す。
そのためwhileが止まる。
気になったので実際に挙動を確認した。出力は一部省略してある。

<?php
$res = $db->query("SELECT * FROM fruits");
for($i = 0; $i < 5; $i++){
    var_dump($array = $res->fetchArray());
}
/*
array(4) {
  ["name"]=>
  string(4) "apple"
}
array(4) {
  string(3) "banana"
}
array(4) {
  ["name"]=>
  string(7) "orange"
}
bool(false)    <<<<これ
array(4) {
  ["name"]=>
  string(4) "apple"
}
*/
?>

ちょっと見にくいが4回目でfalseが返ってきて、5回目でまた始めに戻った。