0

多くの 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)時代遅れか、特定の状況下で機能不全か? これを機能させ続けるにはどうすればよいですか?

4

2 に答える 2

1

myerror()機能はまったくないはずです。データベース層は、それ自体のエラー ハンドラーをほとんど必要としません。そしてコンストラクターは

public function __construct( $dbconf ) {
    $dsn  = "mysql:";
    $dsn .= "host=".   $dbconf['dbhost'].";";
    $dsn .= "dbname=". $dbconf['dbname'].";";
    $dsn .= "port=".   $dbconf['dbport'].";";
    $dsn .= "charset=".$dbconf['dbcharset'];
    $options = array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.$dbconf['charset'],
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_PERSISTENT         => (bool)$dbconf['persist'],
    );
    parent::__construct($dsn, $dbconf['dbuser'], $dbconf['dbpass'],$options);
}
于 2013-06-24T06:49:42.040 に答える
1

その理由は、接続が成功しPDO::__constructたときにのみ作成されるためです。objectしたがって、親コンストラクターを呼び出して失敗すると、オブジェクトはもう存在しません。self::myerror()この場合、エラー関数に静的にアクセスするために使用する必要があります。

于 2013-06-24T06:41:37.190 に答える