PDO::MYSQL_ATTR_READ_DEFAULT_FILE
pdo_mysql を libmysqlclient を使うようビルドした場合に使えるようになるPDOのクラス定数。
mysqlnd を使うようビルドした場合は存在しない。
なのでこれを使うようなコードは、定数が存在するかどうかを確認してからにしないと環境によってFatalが起きる。
PHP Fatal error: Undefined class constant 'MYSQL_ATTR_READ_DEFAULT_FILE'
if(defined('PDO::MYSQL_ATTR_READ_DEFAULT_FILE'))) {
...
}
ただ、現状生きのこっているphp-5.3は、redhatなどのベンダの独自サポートのみだし、
それらは5.3の最終バージョンの 5.3.29 なはずなので、PDO_MYSQL DSN で指定できる。
よってこのコードを新たに書くケースは存在しないはず。
ちがった、5.3.3 だった・・。となると 5.1 のredhat環境もまだ残っているわけか・・。
php-5.3.5以前のPDOでは、libmysqlclient に charset を伝えるためにこれを使うしかなかった。
SET NAMES utf8
は間違ったやり方で、これではMySQLサーバにしかcharsetが伝わらず、
libmysqlclientのデフォルトcharset(ビルド方法による)によってはトラブることになる。
$pdoOpts = array( PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/my.cnf', PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => 'testapp', ); $strDsn = 'mysql:host=localhost;dbname=testdb'; $pdo = new PDO($strDsn, 'testuser', 'testpass', $pdoOpts); );
/etc/my.cnf
[client] default-character-set = utf8 [testapp] default-character-set = utf8 connect-timeout = 1
php-5.3.6以降であれば、PDOに与えるDSNにcharsetを含めることができる。
$strDsn = 'mysql:host=localhost;dbname=testdb;charset=utf8'; $pdo = new PDO($strDsn, 'testuser', 'testpass', $pdoOpts);