LoginSignup
2
0

More than 5 years have passed since last update.

PDOにPEAR_DB形式のDSNを渡しても大丈夫なように

Posted at

PDOとPEAR_DBを共存させると、DSNを複数回か書かなくてはいけなくて不便です。
そこで一括で扱えるようにします。

ポイントはPDOはExtends出来るという点。
php:myPDO.php
<?php
class SQLDB extends PDO{
}

PDOはExtendsしてオーバーライド出来るのです、胸熱。

これを利用してPEAR_DB形式のDSNを解釈するようにします。

myPDO.php
<?php
class SQLDB extends PDO{
    public $database_name;
    public $DSN;
    public $USER;
    public $PASS;
    public function __construct($DSN,$USER=null,$PASS=null){
        if($this->is_pear_db_style_dsn($DSN)){
            list($DSN,$USER,$PASS) = trans_pear_db_DSN_to_pdo_dsn($DSN);
        }
        if($USER=null||!$PASS=null){
            throw new Exception("USER/PASSがnullです。".
            "DBのユーザー名とパスワードを省略するときは、空文字 PASS=''を与えて下さい ");
            exit;
        }
        parent::__construct($DSN,$USER,$PASS);
        $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->DSN  = $DSN;
        $this->USER = $USER;
        $this->PASS = $PASS;
    }
    //PEAR DB 形式のDSNか判定する。
    public function is_pear_db_style_dsn($dsn){
        //PEAR DSNは、URL形式なのでURL形式でパースして、結果がNULLでなければ、
        //PEAR::DB形式と断定
        return array_key_exists("hash", $parse_url($dsn));
    }
    //PEAR DB 形式のDNSをPDO形式に変えてしまう
    public function trans_pear_db_DSN_to_pdo_dsn($DSN){
        $dsn = $DSN;
        $hash = parse_url($dsn);
        $dsn_array = array();
        $dsn_array["driver"] = $hash["scheme"];
        $dsn_array["host"] = $hash["host"];
        $dsn_array["db_name"] = str_replace("/","",$hash["path"]);
        $dsn_array["user"] = $hash["user"];
        $dsn_array["pass"] = $hash["pass"];
        //var_dump($hash);
        //var_dump($dsn_array);exit;

        $PDO_DSN = "{$dsn_array['driver']}:host={$dsn_array['host']};dbname={$dsn_array['db_name']}";
        $PDO_DB_USER = $dsn_array["user"];
        $PDO_DB_PASS = $dsn_array["pass"];
        return array(
            "DSN"         => $PDO_DSN,
            "USER" => $PDO_DB_USER,
            "PASS" => $PDO_DB_PASS,
        );    
    }

}
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0