【PHP】PDOでMySQLに接続する際、必ず例外処理(try,catch)を行う

公開日:
更新日:
カテゴリー: PHP

PDO(PHP Data Object)でMySQLに接続・処理を行う際、必ず例外処理を行わなければなりません。

ここではその理由と方法についてまとめています。

PDOでMySQLに接続

私はこれまで、次のようにPDOを利用してMySQLに接続していました。

<?php
//PDOオブジェクトの作成
$pdo = new PDO("mysql:host=MySQLサーバのホスト名;dbname=データベース名;charset=utf8;", "データベース接続のID", "データベース接続のパスワード");
//SQLの準備
$st = $pdo->prepare("INSERT INTO テーブル名 VALUES(?, ?, ?)");
//SQLの発行
$st->execute(array("001", "佐藤", "男性"));
?>

エラーが起きたら接続情報が丸見え

 しかしあるとき、さくらインターネットでPHPのバージョン?仕様?が変更され、次のようなエラーが起きていることに気づきました。

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2000] mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file' in /home/○○○/www/○○○/○○○.php:187 Stack trace: #0 /home/○○○/www/○○○/○○○.php(187): PDO->__construct('mysql:host=○○○', '○○○', '○○○') #1 {main} thrown in /home/○○○/www/○○○/○○○.php on line 187

最初は「何もいじっていないのにエラーが起きてて面倒くさいな・・・」って感じだったのですが、よく見ると私が利用しているMySQLのホスト名とユーザー名パスワードがモロ見えであることに気づきました。

つまり、これを悪意ある第三者に見られてメモされていた場合、何かしらの攻撃や情報を取得される恐れがあったのです。

例外処理を設定しなければならなかった

どうなってんだ・・・と愕然としてPDOについて勉強し直したのですが、ただ単純に私が無知なだけでした。

というのも、PDOでMySQLに接続する際、必ず例外処理をしなければなりませんでした。

例外処理の方法

例外処理の方法ですが、PDOでエラーが起きた場合、PDOExceptionが投げられます。

なので次のようにtry,catchでそのエラーをキャッチすれば、接続情報のモロ出しを防げます。

<?php
//例外処理
try {
	//PDOオブジェクトの作成
	$pdo = new PDO("mysql:host=MySQLサーバのホスト名;dbname=データベース名;charset=utf8;", "データベース接続のID", "データベース接続のパスワード");
	//SQLの準備
	$st = $pdo->prepare("INSERT INTO テーブル名 VALUES(?, ?, ?)");
	//SQLの発行
	$st->execute(array("001", "佐藤", "男性"));
}catch(PDOException $e){
	//エラー出力
	echo "データベースエラー(PDOエラー)";
	//var_dump($e->getMessage());    //エラーの詳細を調べる場合、コメントアウトを外す
}
?>

エラー文

ちなみに(上記エラーメッセージのコメントアウトを外した場合、)例外処理を記述していると、同じエラーでも、次のようにエラー説明文が出力されるだけで、データベース接続情報などは表示されなくなります。

SQLSTATE[HY000] [2000] mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file

 

あわせて読んでほしい!

 

コメント

1:tatu:2019/10/05 10:52:41

とても良い文で参考になりました。
頑張って下さい。

コメントフォーム
お名前
コメント