お客様から調査依頼で、さくらサーバーのMySqlに接続しようとしたところ、下記のようなMySqlエラーが発生しました。
■エラーメッセージ:
1 2 3 4 5 |
SQLSTATE[HY000] [2002] No such file or directory |
元の実装は下記の通りです。
1 2 3 4 5 6 7 8 9 10 11 |
$db['host'] = "mysqlxxx.db.sakura.ne.jp"; // DBサーバのURL $db['user'] = "username"; // ユーザー名 $db['passwd'] = "password"; // ユーザー名のパスワード $db['dbname'] = "sample_db"; // データベース名 $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8;', $db['host'], $db['dbname']); $pdo = new PDO($dsn, $db['user'], $db['passwd'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); |
上記、new PDOした際に、「SQLSTATE[HY000] [2002] No such file or directory」というエラーが発生しました。
「No such file or directory」を見た瞬間に、思考停止してしまいました。見たこともない、深刻なエラーのように見えるからです。
ネットで調べたら、php.ini修正やapache再起動など面倒なキーワードが目に入りました。これ、ヤバいと思って、本家サイトのサンプルを確認したところ、$dsnの中の各パラメータの間に、スペースがないことを気付いて、まさか、これ?と半信半疑で、スペースをとってもう一度確認したら、なんと、直りました!!!
■元の実装
1 2 3 4 5 |
$dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8;', $db['host'], $db['dbname']); |
■修正後の実装
1 2 3 4 5 |
$dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8;', $db['host'], $db['dbname']); |
これで解決!時間が掛かる問題と思いましたが、意外と簡単に直しました。PDOは厳しいですね、少しスペースを入れたら、すぐに怒るのですね。よく考えたら、プログラム世界に、よくあることを気付きました。例えば、YAMLもそうです。大丈夫ようなところにスペースを入れたら、すぐに怒ります。皆さんも気を付けてね。ヤバそうなエラーがあった場合、まずは、スペースを入れたかを確認しましょう。
■追伸
自分も分からなくなりましたが、後日に、下記ようなエラーメッセージが吐き出されました。同じように、$dsnのスペースを取ったら、エラーが消えて、正常に動作しました。
1 2 3 4 5 |
Fatal error: Uncaught PDOException: SQLSTATE[28000] [1045] Access denied XXXXX |