kwsktr's study log

kwsktr のおべんきょログ

はじめてPDOを使う人が知っておきたい 6 + 1 のポイント

最近、PDO 初体験しちゃったので、PDO童貞の人たちに贈る「思ったよりPDOって良かったよ」的エントリ。

1. PDOって何?

正式名称はPHP Data Objects。
PHP: PDO - Manual


PHP5.1 から標準搭載された「データベースアクセス抽象化ライブラリ」です。
もっと簡単に言うと、いろんなデータベースを同じ様に使えるようになります。

といったように、データベースへの接続ひとつをとっても、それぞれのデータベースに応じた別々の関数を使う必要があります。


けれど、PDOを使えば……

<?php
$dsn = new PDO ($dbname, $user, $password);
?>

といったように、PDOクラスのインスタンスを作成するだけで、どのデータベースとも接続が可能です。

2. 接続

PDOクラスのコンストラクタは以下のように定義されています。

PDO::__construct() ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

要素 説明
dsn データベースに接続するために必要な情報/DSN接頭辞など DBによって異なる
username DSN文字列のユーザ名/DBによっては必須ではない root
password パスワード/DBによっては必須ではない password
driver_options ドライバ固有の接続オプションを指定する連想配列
MySQLとの接続
要素 説明
DSN接頭辞 mysql: mysql:
host データベースサーバが存在するホスト名を指定します host=localhost
port データベースサーバが待機しているポートを指定します port=3306
dbname データベース名を指定します dbname=test
<?php
$dsn = 'mysql:dbname=test;host=localhost:port=3306';
$user = 'database_user';
$password = 'database_password';

try {
    $dbh = new PDO($dsn, $user, $password);
    echo 'MySQL DataBase と接続しました。';
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
?>


PHP: PDO_MYSQL DSN - Manual

SQLiteとの接続
要素 説明
DSN接頭辞 sqlite: sqlite:
  • ディスク上のデータベースにアクセスする場合は、DSN接頭辞に絶対パスを付加します。
<?php
$dbconnect = new PDO('sqlite:/opt/databases/test.sqlite3');
?>
  • メモリ内にデータベースを生成するには、 DSN 接頭辞に:memory: を付加します。
<?php
$dbconnect = new PDO('sqlite::memory:');
?>

PHP: SQLite (PDO) - Manual

PostgreSQL

PHP: PostgreSQL (PDO) - Manual
ゴメンなさい。
環境がないので Pass します……

3. 接続の開放

PDOオブジェクトを破棄するか、PHPスクリプト終了時に自動的に接続が閉じられます。
もっとも明示的に切断するようにしておくに越したことはありませんが。

<?php
// sqlite と接続
$dbconnect = new PDO('sqlite:test.db');

// unset()で切断
unset($dbconnect);
?>

4. 問い合わせ

PDO::query()メソッドで、SQLステートメントを実行します。
PDO::query()メソッドは、結果をPDOStatementオブジェクトとして返します。

<?php
$conn = new PDO(...);

$sql = "SELECT * FROM vegetables";
$stmt = $conn->query($sql);
?>

5. 結果取得

PDOStatementオブジェクトに保持されている結果セットから値を取得します。
結果セットから単一の行を取得する PDOStatement::fetchAll()メソッドや、結果セットに含まれるすべての行を配列で取得する PDOStatement::fetchAll()メソッドなどがあります。

<?php
$conn = new PDO(...);

$sql = "SELECT * FROM vegetables";
$stmt = $conn->query($sql);

$results = $stmt->fetchall();
foreach ($results as $row) {
	echo $row['name'];
}
?>


PHP: PDOStatement::fetchAll - Manual

6. 更新処理

前述のPDO::query()メソッドを実行する方法と、PDO::exec()メソッドを実行する方法があります。
どちらもSQLステートメントを発行しますが、返り値が異なります。

PDO::exec()メソッドの返り値

発行した SQL ステートメントによって更新もしくは 削除された行数を返します。 1 行も作用しなかった場合、PDO::exec() は 0 を返します。

<?php
$count = $conn->exec("DELETE FROM vegetables");
echo  $count . "品が廃棄されました";
?>


PHP: PDO::exec - Manual

おわりに

データベース関係が面倒で、PHPを挫折しちゃう人もいるとか聞いたので、なるべくサックリ書いてみました(が……サックリ書きすぎて内容がなかったらゴメンなさい)
以上、紹介したのは、簡単な6つのポイントだけですが最低限のことはPDOで出来るはずです。
数行でデータベースの操作が可能なので、今まで食わず嫌いだった人も一度はチャレンジしてみることをお勧めします。
他にもPDOを使ってトランザクションとかプリペアドステートメントなども実行可能ですし、PDOメソッドは他にもたくさんありますので、PDOに興味を持ったら調べてみるといいかもですね。

もっと詳しい情報が欲しい人へ

パーフェクトPHP (PERFECT SERIES 3)
パーフェクトPHP (PERFECT SERIES 3)
読めば読むほどパーフェクトな内容です。
PHPer なら一家に一冊!