PHP-DB - 9. PDOインスタンスの設定
続いて PDO
インスタンスのカスタマイズについて学習していきましょう。 PDO
インスタンスはデータベースとの接続を管理するオブジェクトです。また、これまでに学習してきたように PDO
クラスの query
メソッドや exec
メソッドを使うことでSQLを実行できます。
PDO
クラスにはデータベースアクセス時の振る舞いをカスタマイズするためのメソッドとして setAttribute
メソッドが用意されています。 この setAttribute
メソッドには、以下のような定数と設定値を指定できます。
定数 | 設定内容 |
---|---|
PDO::ATTR_DEFAULT_FETCH_MODE |
フェッチモードの指定 |
PDO::ATTR_ERRMODE |
エラーレポートの指定 |
PDO::ATTR_EMULATE_PREPARES |
プリペアドステートメントのエミュレーション指定 |
ここではまず PDO::ATTR_DEFAULT_FETCH_MODE
を指定して、フェッチモードを変更する方法を見ていきましょう。
PDO::ATTR_DEFAULT_FETCH_MODE
の指定
それでは実際に PDO
クラスの setAttribute
メソッドの利用方法について学習していきましょう。ここでは setAttribute
メソッドの引数に PDO::ATTR_DEFAULT_FETCH_MODE
定数を指定して、デフォルトのフェッチモードを変更します。次のプログラム( pdo7.php
)を作成します。
<?php
$dsn = "mysql:host=localhost;dbname=eldb;charset=utf8mb4";
$username = "root";
$password = "admin";
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$sql = "select id, title from categories";
$st = $pdo->query($sql);
$row = $st->fetchAll();
var_dump($row);
このプログラムではPDOインスタンスを生成した後、以下のように setAttribute
メソッドを呼び出しています。
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
PDO
クラスの setAttribute
メソッドは、2つの引数(設定項目と設定値)を受け取ります。ここでは PDO::ATTR_DEFAULT_FETCH_MODE
という設定項目に PDO::FETCH_ASSOC
を設定値として指定しているので、デフォルトのフェッチモードが PDO::FETCH_ASSOC
となります。
それではプログラムを実行してみましょう。
$ php pdo7.php
array(3) {
[0]=>
array(2) {
["id"]=>
int(1)
["title"]=>
string(11) "Programming"
}
[1]=>
array(2) {
["id"]=>
int(2)
["title"]=>
string(6) "Design"
}
[2]=>
array(2) {
["id"]=>
int(3)
["title"]=>
string(9) "Marketing"
}
}
実行結果から連想配列のキーに列番号(要素番号)が含まれていないことを確認できます。
コンストラクタによる設定のカスタマイズ
これまでに PDO
クラスの setAttribute
メソッドの利用方法を学習しました。
$dsn = "mysql:host=localhost;dbname=eldb;charset=utf8mb4";
$username = "root";
$password = "admin";
$pdo = new PDO($dsn, $username, $password);;
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
このような setAttribute
メソッドの呼び出しは、次のように PDO
クラスのコンストラクタの引数にオプションを追加することでも代用できます。
$dsn = "mysql:host=localhost;dbname=eldb;charset=utf8mb4";
$username = "root";
$password = "admin";
$options = [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC];
$pdo = new PDO($dsn, $username, $passwd, $options);
PDO
クラスのコンストラクタは第4引数に連想配列でオプションを指定できます。このオプションには setAttribute
メソッドで設定可能な項目を指定できます。ここではオプションに [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
と指定することで、フェッチモードを列名による連想配列( PDO::FETCH_ASSOC
)としています。
さきほどのプログラム( pdo7.php
)を次のように修正してみましょう。
<?php
$dsn = "mysql:host=localhost;dbname=eldb;charset=utf8mb4";
$username = "root";
$password = "admin";
$options = [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC];
$pdo = new PDO($dsn, $username, $passwd, $options);
$sql = "select id, title from categories";
$st = $pdo->query($sql);
$row = $st->fetchAll();
var_dump($row);
それからプログラムを実行してみましょう。
$ php pdo7.php
array(3) {
[0]=>
array(2) {
["id"]=>
string(1) "1"
["title"]=>
string(11) "Programming"
}
[1]=>
array(2) {
["id"]=>
string(1) "2"
["title"]=>
string(6) "Design"
}
[2]=>
array(2) {
["id"]=>
string(1) "3"
["title"]=>
string(9) "Marketing"
}
}
実行結果からフェッチモードの指定を正しく指定できていることがわかります。
まとめ
PDO
クラスのsetAttribute
メソッドによって、フェッチ方法など様々な設定を変更できるsetAttribute
メソッドと同様の変更はPDO
クラスのコンストラクタ引数のオプションで指定することもできるPDO
クラスのコンストラクタは引数にDSN、ユーザ名、パスワード、オプションを指定できる