m6uのエンジニアっぽい日記

PHP利用開発やFuelPHP利用開発、PostgreSQL利用開発、Androidアプリ開発、CentOS7サーバー構築など、テクニカルでエンジニアっぽい内容の日記

PHP: PDO経由でMySQL接続するときのあれこれ

 数週間後(?)の自分に向けてのメモ(?)

基本形

 公式ドキュメント「PHP: PDO::__construct」にある方法。

<?php
    /* ドライバ呼び出しを使用して MySQL データベースに接続する */
    $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
    $user = 'dbuser';
    $password = 'dbpass';

    try {
        $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
?>

基本形+UTF8トラブル対策

 アレンジして、DSNに文字エンコーディング指定を加える。

<?php
    /* ドライバ呼び出しを使用して MySQL データベースに接続する */
    $dsn = 'mysql:dbname=testdb;host=127.0.0.1;charset=utf8';
    $user = 'dbuser';
    $password = 'dbpass';

    try {
        $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
?>

基本形+UTF8トラブル対策+エラートラップ強化

 さらにアレンジして、DB接続時以降の処理でエラー派生した時にも例外処理できるように強化する。
 公式ドキュメントにある方法「PHP: エラーおよびエラー処理」を参考に。

<?php
    /* ドライバ呼び出しを使用して MySQL データベースに接続する */
    $dsn = 'mysql:dbname=testdb;host=127.0.0.1;charset=utf8';
    $user = 'dbuser';
    $password = 'dbpass';

    try {
        $dbh = new PDO($dsn, $user, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  // エラー発生時に例外スロー
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
?>

基本形+UTF8トラブル対策+エラートラップ強化(別な書き方)

 もしくは、接続時にもう設定してしまう方法。 これは知らなかったなぁ。

<?php
    /* ドライバ呼び出しを使用して MySQL データベースに接続する */
    $dsn = 'mysql:dbname=testdb;host=127.0.0.1;charset=utf8';
    $user = 'dbuser';
    $password = 'dbpass';
    $options = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION  // エラー発生時に例外スロー
    );

    try {
        $dbh = new PDO($dsn, $user, $password, $options);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
?>

あわせて読みたい

 PHP: 文字セットでは、PHPからMySQLに接続する際の文字セットにまつわる話がまとまっています。
 PDOを使うか、mysqliを使うかで、やり方も変わってくるそうで。