PHP PDO MySQL的:如何使用在不同类的数据库连接(PHP PDO-MYSQL : How

2019-06-26 08:09发布

我有点新的使用MySQL的PDO,这里有我的两个文件:

我有我用来连接到数据库的连接类:

class connection{

private $host = 'localhost';
private $dbname = 'devac';
private $username = 'root';
private $password ='';  

public $con = '';

function __construct(){

    $this->connect();   

}

function connect(){

    try{

        $this->con = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username, $this->password);
        $this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);


    }catch(PDOException $e){

        echo 'We\'re sorry but there was an error while trying to connect to the database';
        file_put_contents('connection.errors.txt', $e->getMessage().PHP_EOL,FILE_APPEND);

    }
}   
}

我有我使用查询从数据库中的数据的ACCOUNT_INFO类:

class account_info{


function getAccountInfo(){

    $acc_info = $this->con->prepare("SELECT * FROM account_info");
    $acc_info->execute();

    $results = $acc_info->fetchAll(PDO::FETCH_OBJ);

    foreach ($results as $key) {
        $results->owner_firstname;

    }
}       


}

我包括在我的index.php页面这些文件:

include_once 'classes/connection.class.php';
include_once 'classes/accountinfo.class.php';

$con = new connection();
$info = new account_info();
$info->getAccountInfo();

我只是无法得到它的工作我没有得到任何输出,我认为这是与范围,但我不知道正确的为什么要修复它,因为我是新来的这个PDO和面向对象的东西。 提前致谢。

Answer 1:

解决方法1

更换class account_info {class account_info extends connection {

更换

$con = new connection();
$info = new account_info();

$info = new account_info();

它应该工作。

溶液2(建议)

我强烈建议你在这种情况下,依赖注入解决您的问题。 只是更换您的账户类:

class account_info {

    private $con;

    public function __construct(connection $con) {
        $this->con = $con->con;
    }

    public function getAccountInfo(){

        $acc_info = $this->con->prepare("SELECT * FROM account_info");
        $acc_info->execute();

        $results = $acc_info->fetchAll(PDO::FETCH_OBJ);

        foreach ($results as $key) {
            $results->owner_firstname;
        }
    }       

}

而在这样的index.php使用它:

include_once 'classes/connection.class.php';
include_once 'classes/accountinfo.class.php';

$con = new connection();
$info = new account_info($con);
$info->getAccountInfo();

说明

作为一般好的规则:始终指定职能范围关键字(公有,保护或私有)。

第一个解决方案被称为继承,我们主要做是为了继承所有从连接类的方法和属性,方便地使用其扩展与连接类的账户类。 在这种情况下,你必须注意命名冲突。 我建议你去看看在PHP手册中的类继承。

第二个解决方案叫做依赖注入,这是一个疯狂鼓励设计模式,使您的班接受以明确定义类的依赖关系树(在这种情况下,考虑在其构造其它类依赖的连接,没有我们做不到的连接做帐的工作)。

另外,数以千计的可能的解决方案,将是有人张贴下面被称为辛格尔顿一个设计模式之一。 但是,这种拍打最近已重新评估的反模式,不应该被使用。



Answer 2:

常用方法是使用一个singleton数据库中的类模式。

事情是这样的:

class connection {

   private static $hInstance;

   public static function getInstance() {
     if (!(self::$hInstance instanceof self)) {
         self::$hInstance = new self();
     }

     return self::$hInstance;
   }

   /* your code */
}

然后,你可以简单地使用

$database = connection::getInstance(); 
$database->con->prepare(....)

等等



文章来源: PHP PDO-MYSQL : How to use database connection across different classes