はじめてPDOを使う人が知っておきたい 6 + 1 のポイント
最近、PDO 初体験しちゃったので、PDO童貞の人たちに贈る「思ったよりPDOって良かったよ」的エントリ。
1. PDOって何?
正式名称はPHP Data Objects。
PHP: PDO - Manual
PHP5.1 から標準搭載された「データベースアクセス抽象化ライブラリ」です。
もっと簡単に言うと、いろんなデータベースを同じ様に使えるようになります。
- Mysql との接続には mysql_connect() を
- PostgreSQL との接続には pg_connect() を
- SQLite との接続には sqlite_open() を
といったように、データベースへの接続ひとつをとっても、それぞれのデータベースに応じた別々の関数を使う必要があります。
けれど、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(); } ?>
SQLiteとの接続
要素 | 説明 | 例 |
---|---|---|
DSN接頭辞 | sqlite: | sqlite: |
- ディスク上のデータベースにアクセスする場合は、DSN接頭辞に絶対パスを付加します。
<?php $dbconnect = new PDO('sqlite:/opt/databases/test.sqlite3'); ?>
- メモリ内にデータベースを生成するには、 DSN 接頭辞に:memory: を付加します。
<?php $dbconnect = new PDO('sqlite::memory:'); ?>
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']; } ?>
6. 更新処理
前述のPDO::query()メソッドを実行する方法と、PDO::exec()メソッドを実行する方法があります。
どちらもSQLステートメントを発行しますが、返り値が異なります。
PDO::exec()メソッドの返り値
発行した SQL ステートメントによって更新もしくは 削除された行数を返します。 1 行も作用しなかった場合、PDO::exec() は 0 を返します。
<?php $count = $conn->exec("DELETE FROM vegetables"); echo $count . "品が廃棄されました"; ?>
おわりに
データベース関係が面倒で、PHPを挫折しちゃう人もいるとか聞いたので、なるべくサックリ書いてみました(が……サックリ書きすぎて内容がなかったらゴメンなさい)
以上、紹介したのは、簡単な6つのポイントだけですが最低限のことはPDOで出来るはずです。
数行でデータベースの操作が可能なので、今まで食わず嫌いだった人も一度はチャレンジしてみることをお勧めします。
他にもPDOを使ってトランザクションとかプリペアドステートメントなども実行可能ですし、PDOメソッドは他にもたくさんありますので、PDOに興味を持ったら調べてみるといいかもですね。
もっと詳しい情報が欲しい人へ
パーフェクトPHP (PERFECT SERIES 3)
読めば読むほどパーフェクトな内容です。
PHPer なら一家に一冊!