多くの SO 投稿を含め、このコードのバリエーションをあちこちで見てきました。
class db extends PDO {
public function __construct( $dbconf ) {
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_PERSISTENT => $dbconf['persist'] ? true : false
);
try {
parent::__construct('mysql:host='. $dbconf['dbhost'] .';port=3306;dbname='. $dbconf['dbname'] .';' , $dbconf['dbuser'],
$dbconf['dbpass'],
$options);
} catch (PDOException $e) {
$this->myerror( $e->getMessage() );
// echo 'Connection failed ... '. $e->getMessage();
}
}
...
private function myerror( $error ) {
echo 'Connection failed ... '. $error;
}
}
クラスは でインスタンス化され$db = new db( $config );
、接続が有効な場合はPDOException
うまく機能しますが、接続が失敗すると実際には機能しないようです。関数のcatch
実行に完全に失敗しました$this->myerror(...)
! $e->getMessage()
「接続に失敗しました...ユーザーのせいでアクセスが拒否されました」という便利なメッセージの代わりに、 PHP Fatal error: Call to a member function myerror() on a non-object in /.../lib/pdo.class.php on line 16
.
catch の最初の行をコメントアウトして のコメントを外すとecho
、期待どおりに動作し、接続エラーの理由が報告されます。メッセージが catch で利用できるのに、単純なmyerror
クラス関数で利用できないのはなぜですか?
この投稿 ... PHP、PDO、および例外... は該当するようですが、あまり説明していません。catch (PDOException $e)
時代遅れか、特定の状況下で機能不全か? これを機能させ続けるにはどうすればよいですか?