PHPでDBMS方式のDBを使う方法は、大きく次の2通りがある。
- PDOクラスを使う。
- SQLiteの場合はsqlite_open関数やsqlite_query関数などという具合に、PHPに標準で含まれる各種DBMS用の関数を活用する。
特定のDBMSだけ(SQLiteだけ、MySQLだけ、とか)でずっと運用していく場合は2の方法で問題ないけれど、今後例えばSQLiteからMySQLやPostgreSQLなどに乗り換える可能性がある場合は、乗り換えの手間が軽減できる1の方法が適している。
このページではPDOクラスを用いてSQLiteを使うコードの例を備忘録として列挙していく。MySQLやその他のDBMSを使う場合でもほぼ同じコードとなるはず。
もくじ
PDOクラスとは?
PDOは、PHP Data Objectsの略。SQLite、MySQL、PostgreSQLなどをほぼ同じコードで使えるようにしてくれるもの。クラス形式で作られたものなのでPDOクラスと呼ばれる。
例えば、普通にDBMSにクエリを送信するとき、SQLiteでは次のようなコードになる。
sqlite_query(クエリ文字列);
MySQLではこうなる。
mysql_query(クエリ文字列);
これを、PDOクラスを使って書くと次のように統一的に書ける。
$conn->query(クエリ文字列);
以下、具体的なコード例を挙げていく。
データベースに接続する
$dbPath = '.dbファイルのパス';
$conn = new PDO('sqlite:'.$dbPath);
SQLiteを使う場合はPDOの初期化(2行目)に「sqlite」の文字やDBファイルへのパスが必要になるけれど、DBMS毎に実装が異なる箇所は基本的にここだけ。
データを取得する
// SQLクエリ。コロンが付いているところは、プレースホルダ。
// プレースホルダは、SQLインジェクション攻撃の対策として必要。
$query = 'select * from テーブル名 where data1 >= :min_data and data1 <= :max_data';
try
{
// プレースホルダ付のSQLクエリの処理を準備する。
$stmt = $conn->prepare($query);
// プレースホルダに値をセットして、クエリの処理を実行する。
// セットする値をユーザーが指定した場合、必要に応じて値のチェックをしておくこと。
// ここではdata1の値が3以上10以下のすべてのレコードを取得している。
$stmt->execute(array(
'min_data' => 3,
'max_data' => 10
));
}
catch(PDOException $e)
{
// エラー処理
}
// DBから返された値を格納する配列。
$ary = array();
// 1レコードずつ値を配列に格納していく。
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$ary[] = array(
'id' => intval($row['id']),
'data1' => $row['data1'],
'data2' => $row['data2']
);
}
データを追加する
// SQLクエリ。コロンが付いているところは、プレースホルダ。
// プレースホルダは、SQLインジェクション攻撃の対策として必要。
$query = 'insert into テーブル名(data1, data2) values(:data1, :data2)';
try
{
// プレースホルダ付のSQLクエリの処理を準備する。
$stmt = $conn->prepare($query);
// プレースホルダに値をセットして、クエリの処理を実行する。
// セットする値をユーザーが指定した場合、必要に応じて値のチェックをしておくこと。
// ここではdata1の値が5、data2の値が12であるレコードをテーブルに追加している。
$stmt->execute(array(
'data1' => 5,
'data2' => 12
));
}
catch(PDOException $e)
{
// エラー処理
}
データを編集する
// SQLクエリ。コロンが付いているところは、プレースホルダ。
// プレースホルダは、SQLインジェクション攻撃の対策として必要。
$query = 'update テーブル名 set data1 = :data1, data2 = :data2 where id = :id';
try
{
// プレースホルダ付のSQLクエリの処理を準備する。
$stmt = $conn->prepare($query);
// プレースホルダに値をセットして、クエリの処理を実行する。
// セットする値をユーザーが指定した場合、必要に応じて値のチェックをしておくこと。
// ここではidが7のレコードのdata1の値を15に、data2の値を23にそれぞれ書き換えている。
$stmt->execute(array(
'data1' => 15,
'data2' => 23,
'id' => 7
));
}
catch(PDOException $e)
{
// エラー処理
}
データを削除する
// SQLクエリ。コロンが付いているところは、プレースホルダ。
// プレースホルダは、SQLインジェクション攻撃の対策として必要。
$query = 'delete from テーブル名 where id = :id';
try
{
// プレースホルダ付のSQLクエリの処理を準備する。
$stmt = $conn->prepare($query);
// プレースホルダに値をセットして、クエリの処理を実行する。
// セットする値をユーザーが指定した場合、必要に応じて値のチェックをしておくこと。
// ここではidの値が7であるレコードを削除している。
$stmt->execute(array(
'id' => 7
));
}
catch(PDOException $e)
{
// エラー処理
}
データベースとの接続を終了する
$stmt = null;
$conn = null;