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,
);
}
}