Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:使用类建立并返回PDO句柄_Php_Mysql_Class_Pdo - Fatal编程技术网

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

PHP:使用类建立并返回PDO句柄,php,mysql,class,pdo,Php,Mysql,Class,Pdo,为了避免另一个弃用问题,我想使用一个类连接到我的数据库,并让该类返回数据库句柄,以便于使用 更具体地说,我想要一个类,以便: 立即连接到数据库 以管理员或只读访问权限连接,具体取决于情况 通过使用该类将$db变成$dbh 这样,$db就变成了一个开放的PDO连接(数据库句柄)——这样我就可以做$db->query…等等。因此“return$this->dbh;” 我尝试过这种方法,但有些方法不起作用: <?php class database { private $dbh;

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

更具体地说,我想要一个类,以便:

  • 立即连接到数据库
  • 以管理员或只读访问权限连接,具体取决于情况
  • 通过使用该类将$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";
}

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

您要么编写一个调用内部PDO类的
getAttribute
函数,要么扩展PDO

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

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

}
然后


您的需求似乎集中在以某种方式创建和配置对象,而不是增强其功能。在这种情况下,创建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[1]
-为什么要像数组一样分配它?刷新页面,我更正了代码鉴于您发布的内容,我认为工厂模式会更好地为您服务,在工厂模式中,您调用一个函数或方法来创建pdo实例,配置它,然后返回它。@chris a Factory什么?!!!。。。???对不起,我是PHP/PDO的业余爱好者。你能用“苹果和橘子”来解释一下吗?什么是
$db[1]
-为什么你要把它当作数组来分配?刷新页面,我更正了代码根据你发布的内容,我认为工厂模式会更好地为你服务,你可以调用一个函数或方法来创建pdo实例,配置它,然后把它还回去。@chris一家工厂什么?!!!。。。???对不起,我是PHP/PDO的业余爱好者。你能用“苹果和橘子”来解释一下吗?我不想用一个类来代替整个PDO,而必须对每个PDO函数进行编码。我只想通过使用这个类把$db变成$dbh,把$db变成一个开放连接(数据库句柄),这样我就可以做$db->query…等等。因此“return$this->dbh;”@Omar-不能从构造函数返回$dbh。您只能返回构造函数所属类的实例。我如何才能完成我所追求的目标?@omar构造函数不返回值。对象实例化的值是新对象。您可以像$db->dbh@JAL-他必须公开$dbh我不想用一个类来代替整个PDO,必须对每个PDO函数进行编码/等等。我只想通过使用这个类$db变成$dbh,$db成为一个开放连接(数据库句柄),这样我就可以做$db->query…等等。因此“return$this->dbh;”@Omar-不能从构造函数返回$dbh。您只能返回构造函数所属类的实例。我如何才能完成我所追求的目标?@omar构造函数不返回值。对象实例化的值是新对象。您可以像$db->dbh@JAL-他必须打$dbh publicGood电话!你猜对了,打得好!你搞定了。