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、ユーザ名、パスワード、オプションを指定できる