PHPのPDOを使ったDBの基本操作

DBMS, MySQL, PDO, PHP, PostgreSQL, SQLite, データベース, プレースホルダ

PHPでDBMS方式のDBを使う方法は、大きく次の2通りがある。

  1. PDOクラスを使う。
  2. 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;