PDO接続

PDO接続とは、PHP Data Objects(PDO)インターフェイスを使用してデータベースに接続することです。

PDO接続を行うには、PDO基底クラスのインスタンスを作成します。どのドライバを使用するのかにかかわらず、常にPDOクラスを指定します。

今回はmysqlに接続する方法についてみていきましょう。

$dsn = 'mysql:host=mysql-reserve;dbname=attend;charset=utf8';
$user = 'root';
$password = 'password';

$dbh = new PDO($dsn, $user, $password);
var_dump($dbh);
exit;

接続結果として以下のように表示されていれば接続ができています。

object(PDO)[1]

接続に失敗したときに例外処理をしていきます。

まずPDOにオプションを設定します。

$dbh = new PDO($dsn, $user, $password, [
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
]);

オプションを配列で指定します。

今回の場合、エラーモードを例外処理するオプションを指定。

try~catchにて接続成功した場合と、失敗した場合の処理を記述

try {
    $dbh = new PDO($dsn, $user, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
    echo '接続完了';
    $dbh = null; // 接続を終了
} catch (PDOException $e) {
    echo '接続エラー' . $e->getMessage();
    exit; // 接続失敗した場合は接続を閉じる
}

以下のように表示されていれば接続は成功しています。

接続完了

試しにパスワードやユーザー名を間違えて接続し見ました。

接続エラーSQLSTATE[HY000] [1045] Access denied for user 'roo'@'172.18.0.4' (using password: YES)

このようにエラーが表示されてしまいます。

実際データベースの中身を取得してみます。

今回はユーザー情報を取得します。

try {
    $dbh = new PDO($dsn, $user, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
    // echo '接続完了';
    // SQLの準備
    $sql = 'SELECT * FROM work';
    // SQLの実行
    $stmt = $dbh->query($sql);
    // SQLの結果を受け取る(PDO::FETCH_ASSOCはカラムを添え字として取得するオプション)
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    var_dump($result);
    $dbh = null;
} catch (PDOException $e) {
    echo '接続エラー' . $e->getMessage();
    exit;
}

以下のように表示されていればOK

array (size=1)
  0 => 
    array (size=7)
      'id' => string '1' (length=1)
      'user_id' => string 'XXXXXXX' (length=6)
      'password' => string 'XXXXXXX' (length=8)
      'last_name' => string 'XXXXXXX' (length=6)
      'first_name' => string 'XXXXXXX' (length=6)
      'email' => string 'XXXXXX@XXXXX.XXX' (length=33)
      'comment' => null


PDO::FETCH_ASSOCとPDO::FETCH_UNIQUEの違い

PDO::FETCH_ASSOCPDO::FETCH_UNIQUE は、どちらも PDOStatement::fetchAll() メソッドで使用できるフェッチモードですが、取得するデータの構造とキー値の扱いにおいて違いがあります。

1. 取得するデータ構造

  • PDO::FETCH_ASSOC: 取得した各行を、カラム名をキーとした連想配列として返します。つまり、各列にアクセスするには、カラム名を使用する必要があります。

【例】

$stmt = $pdo->query("SELECT * FROM users");
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($users as $user) {
  echo $user['id'] . ': ' . $user['name'] . '<br>';
}

この例では、$users 配列には各ユーザーのデータが連想配列として格納されています。各ユーザーの ID にアクセスするには $user['id'] 、名前には $user['name'] のようにカラム名を使用します。

  • PDO::FETCH_UNIQUE: 取得した各行を、指定したカラムの値をキーとした連想配列として返します。つまり、各列にアクセスするには、キー値を使用する必要があります。
$stmt = $pdo->query("SELECT id, name FROM users");
$users = $stmt->fetchAll(PDO::FETCH_UNIQUE);

foreach ($users as $id => $user) {
  echo $id . ': ' . $user['name'] . '<br>';
}

PDO::FETCH_UNIQUEPDO::FETCH_ASSOC は、取得するデータの範囲とキー値の扱いにおいて、異なる役割を果たします。

例えばログインした人が持つ固有のデータを全て主とする場合はPDO::FETCH_UNIQUE

指定したテーブルすべてのデータを取得する場合はPDO::FETCH_ASSOC

このような使い分けでいいでしょう。

コメントを残す

Javascript

前の記事

コールバック関数
PHP

次の記事

PHPログイン機能実装