繁体   English   中英

PHP:使用一个类来建立并返回一个PDO句柄

[英]PHP: use a class to establish and return a PDO handle

为避免另一个弃用问题,我想使用一个类连接到我的数据库,并让该类返回数据库句柄,以便于使用。

为了更具体一点,我想要一个类以便:

  • 立即连接到数据库。
  • 根据情况以管理员或只读访问权限进行连接。
  • 通过使用此类使$ db变为$ dbh
  • 因此,$ db成为一个开放的PDO连接(数据库句柄)-这样我就可以执行$ db-> query ... etc。 因此,“返回$ 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()

getAttribute函数是PDO类上的方法。 您的db类没有实现它。

您要么必须编写调用内部PDO类的getAttribute函数,要么扩展PDO。

function getAttribute( $attribute ) {
    return $this->dbh->getAttribute( $attribute );
}

看来您的需求集中在以某种方式创建和配置对象,而不是增强其功能。 在这种情况下,创建pdo实例并返回它的简单函数就足够了。 但是,它更正式地称为工厂模式。

这是使用静态类的示例。

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(...);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM