我到处都看到了这段代码的变体,包括许多 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)
过时或功能失调?我如何继续让它工作?