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_ASSOC と PDO::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_UNIQUE と PDO::FETCH_ASSOC は、取得するデータの範囲とキー値の扱いにおいて、異なる役割を果たします。
例えばログインした人が持つ固有のデータを全て主とする場合はPDO::FETCH_UNIQUE。
指定したテーブルすべてのデータを取得する場合はPDO::FETCH_ASSOC。
このような使い分けでいいでしょう。