SQLiteは、無償で利用できる軽量のデータベース(RDBMS)です。
単一のファイルにデータを格納するタイプなので非常に扱いやすいです。
SQLiteについては、別エントリーに少し書いているので確認してみてください。
今回は、LinuxにインストールしてPDOを使って接続してみます。
こちらで構築したローカル開発環境にインストールします。
目次
インストール
yumでパッケージをインストールします。
sudo yum -y install sqlite
コマンド操作
コマンドでDBを作ってデータを投入してみます。
SQLiteはSELECTの結果表示が見づらいです。こちら見やすくする設定をエントリーしています。
SQLite実行
SQLiteはDB名を指定して実行します。
DBがない場合は、カレントディレクトリ(現在のディレクトリ)に作成します。
DB名、test.dbで実行します。
sqlite3 test.db; SQLite version 3.6.20 Enter ".help" for instructions Enter SQL statements terminated with a ";"
テーブル作成
create table macs (id, name);
データ挿入
insert into macs values(1, 'MacBook'); insert into macs values(2, 'MacBook Pro'); insert into macs values(3, 'iMac');
データSELECT
select * from macs; 1|MacBook 2|MacBook Pro 3|iMac
終了
.q
PDO利用
こちらのエントリーで作成した、example.comのDocumentRootにpdo.phpファイルを配置します。
コマンドで行った処理を同じようにPDOで行います。
MySQLで利用している、コードを再利用しています。
PHP Data Objects(PDO)の利点も再確認してみたいと思います。
PHPの公式サイトでは、以下のように説明されています。
使用しているデータベースが何であるかにかかわらず、同じ 関数を使用してクエリの発行やデータの取得が行えるということです。 PDO は、データベースの抽象化を行うのでは ありません。つまり、SQL を書き直したり 存在しない機能をエミュレートしたりはしないということです。
DB接続
try { $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); $dbh = new PDO('sqlite:test.db','' ,'' ,$options); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); exit; }
SQLiteには、ユーザ、パスワードの概念はありません。
第4引数を省略する場合は、第2引数と第3引数も省略可能です。
PDOのエラーは明確に明示しなければなりません。
PDO::ERRMODE_EXCEPTIONで、接続時以外のエラーもtry catchでcatchします。
参考ページ
PHP: エラーおよびエラー処理 – Manual
テーブル作成
try { $sql = 'create table macs ( id integer primary key autoincrement, name text );'; $dbh->query($sql); } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); exit; }
データ挿入
$names = array('MacBook', 'MacBook Pro', 'iMac'); try { $sql = 'insert into macs values(null, :name);'; $stmt = $dbh->prepare($sql); foreach ($names as $name) { $ret = $stmt->execute(array(':name'=>$name)); } } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); exit; }
トランザクション
トランザクションも確認します。
強制的に、Syntaxエラーを発生させてロールバックさせます。
$names = array('MacBook Air', 'Mac mini', 'Mac Pro'); try { $sql = 'insert into macs values(null, :name);'; $stmt = $dbh->prepare($sql); $dbh->beginTransaction(); foreach ($names as $name) { if ($name == 'Mac mini') { $ret = $stmt->execute(array(':n'=>$name)); } else { $ret = $stmt->execute(array(':name'=>$name)); } } $dbh->commit(); } catch (PDOException $e) { $dbh->rollback(); echo 'Error: ' . $e->getMessage(); // exit; }
データSELECT
try { $sql = 'select *, typeof(id) from macs;'; $stmt = $dbh->query($sql); $rows = array(); foreach ($stmt as $row) { $rows[] = $row; } $stmt->closeCursor(); } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); exit; } var_dump($rows);
結果を、ブラウザのソースで見てみます。
きちんとロールバックはされています。
idは数値型で格納されていますが、文字列型でSELECTされています。
必要な場合は、ソースで吸収するようにしなければなりません。
まとめ
SQLiteは、扱いやすいRDBMSです。
PDOを利用すればMySQLのソースも、ほぼ再利用可能でした。
厳格なデータ型指定が必要な場合は、ソースでキャストする必要があります。