0

別の非推奨の問題を回避するために、クラスを使用してデータベースに接続し、そのクラスがデータベース ハンドルを返すようにして、使いやすくしたいと考えています。

もう少し具体的に言うと、次の目的でクラスが必要です。

  • すぐにデータベースに接続します。
  • 状況に応じて、管理者または読み取り専用アクセスとして接続します。
  • このクラスを使用して $db を $dbh にする
  • したがって、$db はオープン PDO 接続 (データベース ハンドル) になり、$db->query などを実行できるようになります。したがって、'return $this->dbh;'

私はこのアプローチを試みましたが、何かがうまくいきません:

<?php

class database {
    private $dbh;

    public function __construct($type=null) {
        switch ($type) {
            case 0:
                self::ro();
                break;
            case 1:
                self::admin();
                break;
            default:
                self::ro();
                break;
            }
        return $this->dbh;
}


    private function ro() {
        try {
            # MySQL with PDO_MYSQL (Read-only access)
            $dbhost = 'localhost';
            $dbname = 'dbname';
            $dbuser = 'dbuser';
            $dbpass = 'dbpass';
            $this->dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
        }
        catch(PDOException $e) {
            echo $e->getMessage();
        }  
    }


    private function admin() {
        try {
            # MySQL with PDO_MYSQL
            $dbhost = 'localhost ';
            $dbname = 'dbname';
            $dbuser = 'dbadminuser';
            $dbpass = 'dbadminpass';
            $this->dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
        }
        catch(PDOException $e) {
            echo $e->getMessage();
        }  
    }

}

$db = new database();
//test connection
$attributes = array(
    "AUTOCOMMIT", "ERRMODE", "CASE", "CLIENT_VERSION", "CONNECTION_STATUS",
    "ORACLE_NULLS", "PERSISTENT", "PREFETCH", "SERVER_INFO", "SERVER_VERSION",
    "TIMEOUT"
);

foreach ($attributes as $val) {
    echo "PDO::ATTR_$val: ";
    echo $db->getAttribute(constant("PDO::ATTR_$val")) . "<br>\n";
}

次のエラーが表示されます。

致命的なエラー: 未定義のメソッド database::getAttribute() への呼び出し...

4

2 に答える 2

3

getAttribute関数は PDO クラスのメソッドです。あなたのdbクラスはそれを実装していません。

getAttribute内部 PDO クラスを呼び出す関数を作成するか、 PDO を拡張する必要があります。

function getAttribute( $attribute ) {
    return $this->dbh->getAttribute( $attribute );
}
于 2013-10-05T17:51:38.900 に答える
1

あなたのニーズは、オブジェクトの機能を強化することではなく、特定の方法でオブジェクトを作成および構成することに集中しているようです。この場合、pdo インスタンスを作成して返す単純な関数で十分です。ただし、より正式には Factory パターンとして知られています。

静的クラスを使用した例を次に示します。

class MyDatabaseFactory {


    public static function create($type=null) {
        switch ($type) {
            case 0:
                return self::ro();
                break;
            case 1:
                return self::admin();
                break;
            default:
                return self::ro();
                break;
            }
}


    private static function ro() {
        try {
            # MySQL with PDO_MYSQL (Read-only access)
            $dbhost = 'localhost';
            $dbname = 'dbname';
            $dbuser = 'dbuser';
            $dbpass = 'dbpass';
            return new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
        }
        catch(PDOException $e) {
            echo $e->getMessage();
        }  
    }


    private static function admin() {
        try {
            # MySQL with PDO_MYSQL
            $dbhost = 'localhost ';
            $dbname = 'dbname';
            $dbuser = 'dbadminuser';
            $dbpass = 'dbadminpass';
            return new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
        }
        catch(PDOException $e) {
            echo $e->getMessage();
        }  
    }

}

それで

$db = MyDatabaseFactory::create(0);
$db->getAttribute(...);
于 2013-10-06T01:56:11.110 に答える