PHP資料一覧

DBにアクセスする(PDO)

2009/3/3更新

対応バージョン: 5.2.9

PHPでDBにアクセスするにはPDO(PHP Data Objects)を使用する。

以下、簡単なサンプルとともに説明する。

例外処理定義

まずDBアクセス時にエラーが起きた場合の例外処理を定義しておく。

try
{
  <<<DBアクセス処理を記述>>>
}
catch (PDOException $e)
{
  var_dump($e->getMessage());
}

エラーが起きるとPDOExceptionオブジェクトが生成されるのでこれを補足してgetMessageメソッドをコールすることによりエラーメッセージを取得する。

以下、実際のDBアクセスについて説明する。

DB接続

以下の引数をPDOに与えてハンドルを生成する。

DSN(データベースのデータソース名)
データベースにアクセスするユーザ名
上記ユーザのパスワード
PDOのオプション

例) SQLiteの場合

$dsn = "sqlite:/tmp/test.db";
$user = null;
$password = null;
$pdo = new PDO($dsn, $user, $password);

例) MySQLの場合

$dsn = "mysql:host=localhost, dbname=test.db";
$user = "root";
$password = "*******";
$pdo = new PDO($dsn, $user, $password);

テーブル作成

クエリ文字列を生成し、PDO::queryメソッドをコールする。

ここでは以下のようなスキーマ定義を持つテーブルを作成する。

テーブル名
property

持ち物リスト

カラム
name (text)

持ち物名

num (integer)

個数

この場合、コードは以下のようになる。

$query = "CREATE TABLE property(name text primary key, num integer)";
$pdo->query($query);

データ挿入

PDO::prepareメソッドによりPDOStatementオブジェクト(ステートメントハンドル)を生成し、PDOStatement::bindValueメソッドで各カラムにデータを割り付けた後にPDOStatement::executeメソッドを実行する。

ここでは上記で作成した持ち物リストテーブルに以下のデータを挿入する。

iPhone

1台

Wii

1台

LoveLetter

30枚

この場合、コードは以下のようになる。

$name_list = array("iPhone", "Wii", "LoveLetter");
$num_list = array(1, 1, 30);

$query = $pdo->prepare("INSERT INTO property(name, num) VALUES(:name, :num)");

for($i = 0; $i < count($name_list); $i++)
{
  $query->bindValue(':name', $name_list[$i]);
  $query->bindValue(':num', $num_list[$i]);
  $query->execute();
}

PDOStatementオブジェクトを使用し終わったらnullをセットしてオブジェクトを開放する。

$query = null;

データ読み出し

PDO::queryメソッドによりステートメントハンドルを生成し、PDOStatement::fetchメソッドでデータを読み出す。

上記で挿入したデータを取り出してみる。

$select = $pdo->query("SELECT * FROM property");

while($row = $select->fetch(PDO::FETCH_ASSOC))
{
  echo implode("|", $row) . "\n";     // 各カラムを"|"で連結
}

$select = null;

結果は以下のようになる。

iPhone|1
Wii|1
LoveLetter|30

DB切断

PDOオブジェクトにnullをセットしてオブジェクトの開放、つまりDBからの切断を行う。

$pdo = null;

まとめ

上記のコードをまとめると以下のようになる。

try
{
  //
  // DBハンドル生成
  //
  $dsn = "sqlite:/tmp/test.db";
  $user = null;
  $password = null;
  $pdo = new PDO($dsn, $user, $password);

  //
  // テーブル作成
  //   < テーブル定義 >
  //   - テーブル名:property ........ 持ち物リスト
  //   - カラム    :name (text) ..... 持ち物名
  //               :num (integer) ... 個数
  //
  $query = "CREATE TABLE property(name text primary key, num integer)";
  $pdo->query($query);

  //
  // データ挿入
  //
  $name_list = array("iPhone", "Wii", "LoveLetter");
  $num_list = array(1, 1, 30);

  $query = $pdo->prepare("INSERT INTO property(name, num) VALUES(:name, :num)");

  for($i = 0; $i < count($name_list); $i++)
  {
    $query->bindValue(':name', $name_list[$i]);
    $query->bindValue(':num', $num_list[$i]);
    $query->execute();
  }

  $query = null;

  //
  // データ読み出し
  //
  $select = $pdo->query("SELECT * FROM property");

  while($row = $select->fetch(PDO::FETCH_ASSOC))
  {
    echo implode("|", $row) . "\n";    // 各カラムを"|"で連結
  }

  $select = null;

  //
  // DB切断
  //
  $pdo = null;
}
catch (PDOException $e)
{
  var_dump($e->getMessage());
}