PHP 資料一覧
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()); }