ServBay の組み込み SQLite データベースモジュールで PHP を開発する
ServBay は、開発者向けに設計された高機能なローカル Web 開発環境であり、複数のテクノロジースタックに対応しています。SQLite データベースモジュールを内蔵しているため、PHP アプリケーションで SQLite を用いたデータ保存や管理が非常に容易です。本記事では、ServBay でこの特長を活用する方法を詳しく解説します。
SQLite モジュールについて
SQLite は、軽量かつ組み込み型のリレーショナルデータベース管理システムです。従来のクライアント/サーバー型データベース(MySQL や PostgreSQL など)とは異なり、独立したサーバープロセスを必要とせず、アプリケーション内部にライブラリとして直接組み込まれます。データベース全体が一つのファイル内に保存され、導入・管理を大幅に簡素化します。
SQLite は以下のような理由で幅広く利用されており、中小規模のアプリ、ローカルキャッシュ、モバイルアプリ、開発・テスト環境に特に最適です。
主な特長
- 軽量:コアライブラリのサイズが小さく、リソース消費も最小限。
- ゼロ構成:サーバーのインストールや設定、ユーザー権限管理は不要、すぐに使えます。
- 高パフォーマンス:ほとんどの読み取り操作や中〜小規模の書き込み操作において高速です。
- 単一ファイル保存:データベース全体が
.sqlite
ファイル一つに収まるため、バックアップや移行・管理が容易。 - ACID トランザクション対応:信頼性高いトランザクション処理で、データの一貫性と完全性を確保します。
- マルチプラットフォーム:多様な OS やプログラミング言語に対応しています。
ServBay における SQLite のサポート
ServBay には複数の PHP バージョンが組み込まれており、それぞれのバージョンで対応する SQLite 拡張(sqlite3
や pdo_sqlite
など)がプリインストールされ、デフォルトで有効化されています。つまり、PHP 拡張のダウンロードやコンパイル・設定を手動で行う手間なく、PHP プロジェクト内で直接 SQLite 機能を利用できます。
前提条件
- macOS に ServBay をインストールし、起動していること。
- ServBay で利用したい PHP バージョンを有効化し、稼働していること。
- サイトのファイルを格納するディレクトリが必要です。ServBay 標準のウェブルート
/Applications/ServBay/www
またはそのサブディレクトリを推奨します。
ServBay で SQLite を使うには
ServBay では SQLite モジュールが既にデフォルトで有効化されているため、特別な有効化手順は必要ありません。PHP 環境はすぐに SQLite 関連の関数やクラスを使える状態になっています。
SQLite 拡張が有効かどうかの確認方法:
SQLite 拡張が正しくロードされているかを確認するには、phpinfo()
ページをチェックします。
<?php phpinfo(); ?>
を記述した PHP ファイル(例:info.php
)を作成します。- そのファイルを ServBay のウェブルート
/Applications/ServBay/www
配下の任意のサイトディレクトリ(例:/Applications/ServBay/www/servbay.demo/info.php
)に配置。 - ブラウザで該当ファイル(例:
http://servbay.demo/info.php
)にアクセス。 - 出力画面で "sqlite" または "pdo_sqlite" を検索し、関連設定セクションが表示されていれば拡張子が有効化されています。
PHP コードで SQLite を利用する
SQLite 拡張が利用可能と確認できたら、PHP アプリケーション内で直接 SQLite の API を使ってデータベース操作を行えます。PHP には SQLite と連携する複数の方法がありますが、最も一般的なのは SQLite3
クラス(オブジェクト指向型)と PDO
(PHP Data Objects)です。
以下は ServBay 環境で、これら2種類の方法での接続・テーブル作成・データ挿入と取得を行うサンプルです。PHP ファイルおよび作成される .sqlite
データベースファイルは、ウェブプロジェクトのディレクトリ(例: /Applications/ServBay/www/your-project-name/
)に配置してください。
サンプルコード(標準 SQLite3 使用)
この方法では、PHP 組み込みの SQLite3
クラスで SQLite データベースをオブジェクト指向的に扱えます。
<?php
// データベースファイルのパス
// データベースファイルは、プロジェクト配下の data/ ディレクトリなどへの配置を推奨
$db_file = __DIR__ . '/data/servbay_demo.sqlite'; // __DIR__ は現在のスクリプトディレクトリ
// データディレクトリが存在しない場合は作成
if (!is_dir(__DIR__ . '/data')) {
mkdir(__DIR__ . '/data', 0777, true);
}
// SQLite データベースへ接続
// ファイルが存在しない場合は自動で作成されます
try {
$db = new SQLite3($db_file);
echo "データベースへの接続に成功しました: " . $db_file . "\n";
} catch (Exception $e) {
die("データベース接続に失敗: " . $e->getMessage());
}
// テーブル作成
// IF NOT EXISTS で重複作成エラーを回避
$create_table_sql = "CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
)";
if ($db->exec($create_table_sql)) {
echo "テーブル 'users' を作成、または既に存在します\n";
} else {
echo "テーブル作成に失敗: " . $db->lastErrorMsg() . "\n";
}
// データ挿入
$name = 'ServBay Demo User';
$email = '[email protected]';
$age = 30;
// プリペアドステートメントで SQL インジェクション対策
$stmt = $db->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->bindValue(':email', $email, SQLITE3_TEXT);
$stmt->bindValue(':age', $age, SQLITE3_INTEGER);
// 挿入実行、成功判定(email は UNIQUE のため重複時は失敗)
if ($stmt->execute()) {
echo "データ挿入に成功: Name=" . $name . ", Email=" . $email . "\n";
} else {
// ユニーク制約違反かどうかを判定
if (strpos($db->lastErrorMsg(), 'UNIQUE constraint failed') !== false) {
echo "データ挿入に失敗: Email '" . $email . "' は既に存在しています\n";
} else {
echo "データ挿入に失敗: " . $db->lastErrorMsg() . "\n";
}
}
$stmt->close(); // プリペアドステートメントをクローズ
// データ取得
$search_name = 'ServBay Demo User';
$query_sql = "SELECT id, name, email, age FROM users WHERE name = :name";
$stmt = $db->prepare($query_sql);
$stmt->bindValue(':name', $search_name, SQLITE3_TEXT);
$result = $stmt->execute();
echo "検索結果:\n";
$found = false;
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
print_r($row);
$found = true;
}
if (!$found) {
echo "該当データが見つかりませんでした\n";
}
$result->finalize(); // 結果セットの解放
$stmt->close(); // プリペアドステートメントをクローズ
// データベース接続を終了
$db->close();
echo "データベース接続を閉じました\n";
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
サンプルコード(PDO 使用)
PDO(PHP Data Objects)は、さまざまなデータベースを同じインタフェースで扱うための抽象レイヤです。PDO を利用することで、より柔軟かつ多様なデータベースへの対応が容易になります。SQLite も PDO で推奨される方法のひとつです。
<?php
// データベースファイルのパス
// データベースファイルは、プロジェクト配下の data/ ディレクトリなどへの配置を推奨
$db_file = __DIR__ . '/data/servbay_demo_pdo.sqlite'; // __DIR__ は現在のスクリプトディレクトリ
// データディレクトリが存在しない場合は作成
if (!is_dir(__DIR__ . '/data')) {
mkdir(__DIR__ . '/data', 0777, true);
}
try {
// 新しい PDO インスタンスを作成
// DSN(データソース名)は 'sqlite:ファイルパス' 形式
$dsn = 'sqlite:' . $db_file;
$pdo = new PDO($dsn);
// エラーモードを例外に設定し、デバッグを容易に
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// デフォルトの fetch モード(例:連想配列形式)
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo "データベースへの接続に成功しました: " . $db_file . "\n";
// テーブル作成
$create_table_sql = "CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
)";
$pdo->exec($create_table_sql);
echo "テーブル 'users' を作成、または既に存在します\n";
// データ挿入
$name = 'ServBay PDO User';
$email = '[email protected]';
$age = 35;
// プリペアドステートメントを使用
$stmt = $pdo->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
// 挿入実行、成功判定(email は UNIQUE のため重複時は失敗)
try {
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "データ挿入に成功: Name=" . $name . ", Email=" . $email . "\n";
} catch (PDOException $e) {
// UNIQUE 制約違反エラー (SQLite コード 19) の判定
if ($e->getCode() == '23000' || strpos($e->getMessage(), 'UNIQUE constraint failed') !== false) {
echo "データ挿入に失敗: Email '" . $email . "' は既に存在しています\n";
} else {
throw $e; // その他のエラーは再スロー
}
}
$stmt->closeCursor(); // ステートメントリソースを解放
// データ取得
$search_name = 'ServBay PDO User';
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => $search_name]);
$data = $stmt->fetchAll(); // 全結果行を取得
echo "検索結果:\n";
if ($data) {
print_r($data);
} else {
echo "該当データが見つかりませんでした\n";
}
$stmt->closeCursor(); // ステートメントリソースを解放
} catch (PDOException $e) {
// PDO 例外のキャッチ
echo "データベース操作に失敗しました: " . $e->getMessage();
// $e->getCode() で SQLSTATE エラーコードを取得できます
}
// PDO はスクリプト終了時に自動で接続がクローズされるため、明示的な close() は不要
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
データベースファイルの保存先について:
上記サンプルでは、データベースファイル(servbay_demo.sqlite
および servbay_demo_pdo.sqlite
)は、実行中の PHP スクリプトと同じディレクトリ配下の data/
サブディレクトリに作成されます。例えば PHP ファイルが /Applications/ServBay/www/my-servbay-project/index.php
にある場合、データベースファイルは /Applications/ServBay/www/my-servbay-project/data/
に生成されます。
データベースファイルをプロジェクトのサブディレクトリに分離して配置することで、管理やバックアップが容易になります。ServBay の標準設定では書き込み権限も問題ない場合が多いですが、該当ディレクトリの書き込み権限にもご注意ください。
注意事項
- SQLite データベースファイルは機密データを含みます。直接インターネット経由でアクセスされないように注意しましょう。ウェブルート外に保存する、または Caddy や Nginx などのサーバー設定で
.sqlite
ファイルへのアクセスをブロックすることを推奨します。本サンプルでdata/
ディレクトリ配下に配置しているのは説明用であり、本番運用環境では一層厳格なセキュリティ管理を行ってください。 - SQLite は高頻度の同時書き込みには向きません。高い同時書き込みが必要な場合は、MySQL や PostgreSQL などのクライアント/サーバー型データベースを採用しましょう。
- ServBay で SQLite 拡張はデフォルトで有効ですが、
phpinfo()
で情報が表示されない場合は、ServBay の PHP 設定を見直すか、ServBay サービスの再起動をお試しください。
よくある質問 (FAQ)
Q: SQLite を個別にインストールする必要がありますか?
A: 必要ありません。ServBay の PHP パッケージには SQLite 拡張が標準で組み込まれており、すぐに PHP コードから利用できます。
Q: .sqlite
データベースファイルはどこに保存すべき?
A: Web から直接アクセスできないプロジェクトサブディレクトリ(例: data/
や database/
)などに保存するのがお勧めです。セキュリティ対策のため、サンプルでは __DIR__ . '/data/'
で相対パスを指定しています。
Q: PHP スクリプトが SQLite データベースに接続・作成できない場合は?
A: 以下を確認してください:
- ServBay が起動しており、PHP ファイルを ServBay 経由でアクセスしているか。
phpinfo()
の出力でsqlite3
およびpdo_sqlite
拡張が有効になっているか。- データベースファイルを保存するディレクトリが存在し、ServBay の実行ユーザーに書き込み権限があるか。
まとめ
ServBay は PHP 開発者にとって、SQLite データベースの利便性を最大化するローカル環境を提供します。組み込み・デフォルト有効の SQLite モジュールにより、煩雑な設定なしでローカルでの SQLite ベース開発やテストが可能です。軽量・ゼロ設定という SQLite の特長と相まって、ServBay は効率的かつ使いやすいローカル開発の強力なツールと言えるでしょう。