脳みそスワップアウト

揮発性なもので。おもにPHPのこととか。

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);