php - 如何跨多个类访问PDO连接对象?[php +Mysql]

标签 php mysql pdo

我想在 php 中使用 PDO 进行 mysql 连接。我需要有 PDO 连接对象,该对象必须在多个文件上可用。数据库连接也必须是一个类。这里找到的许多答案并不令人满意。请说明正确的实现方法。

我目前采用的方法是: 文件名:connectClass.php

<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
class connect
{
    public $db;
    public $isConnected;
    public function __construct()
    {
        $this->isConnected = true;
        try { 
            $this->db=new PDO('mysql:host=localhost;dbname=dbname','root','rootpass');
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        }
        catch(PDOException $e) { 
            $this->isConnected = false;
            throw new Exception($e->getMessage());
        }
    }
}
$obj=new connect();
?>

连接对象被访问 文件名:addContentClass.php

<?php
include_once 'class/connectClass.php';
class addContent extends connect
{
    public function insertContent($title, $content, $page_title, $meta_tags) {
        try {
            $qry = $this->db->prepare("INSERT INTO tblPageContents (PageName, PageTitle, PageMeta, PageKeyWords, PageContents, PageFooter, PageShortName) VALUES (?, ?, ?, ?, ?, ?, ?)");
            $data = array($title, $content, $page_title, $meta_tags);
            $qry->execute($data);  
            echo "<div id=\"dialog-ci\" title=\"Content updation success\" style=\"color:green\">Content insertion success</div>";
        }
        catch(PDOException $e)
        {
            echo 'Query failed'.$e->getMessage();
        }
    }
}
?>

这段代码的问题是我每次都需要使用扩展。

最佳答案

单例方法可以这样实现

<?php
class Connect {
    public $db;
    public $isConnected;
    public static $instance = null;

    public static function getInstance() {
        if (self::$instance == null) self::$instance = new static();
        return self::$instance;
    }

    private function __construct() {
        $this->isConnected = true;
        try { 
            $this->db = new PDO('mysql:host=localhost;dbname=dbname','root','rootpass');
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        }catch(PDOException $e) { 
            $this->isConnected = false;
            throw new Exception($e->getMessage());
        }
    }
}

class AddContent {
    public function insertContent($title, $content, $page_title, $meta_tags) {
        try {
            $qry = Connect::getInstance()->db->prepare("INSERT INTO tblPageContents (PageName, PageTitle, PageMeta, PageKeyWords, PageContents, PageFooter, PageShortName) VALUES (?, ?, ?, ?, ?, ?, ?)");
            $data = array($title, $content, $page_title, $meta_tags);
            $qry->execute($data);  
            echo "<div id=\"dialog-ci\" title=\"Content updation success\" style=\"color:green\">Content insertion success</div>";
        }
        catch(PDOException $e)
        {
            echo 'Query failed'.$e->getMessage();
        }
    }
}

请注意,这不是最好的方法,因为它不是其他情况下可改变的解决方案。更好的方法是使用依赖注入(inject)并将 connect 类的实例传递给其他类

interface DatabaseImplementation {
    public function connect();
    public function execute();
    public function bar();
}

class Connect implements DatabaseImplementation {
    public function connect() {
        // Logic A...
        // ex. Connect to mysql with PDO
    }
    public function execute() {
        // logic A...
    }
    public function bar() {     
        return 'bar';
    }
}

class AlternativeConnect implements DatabaseImplementation {
    public function connect() {
        // Logic B...
        // ex. Connect to mongoDB
    }
    public function execute() {
        // logic B...
    }
    public function bar() {     
        return 'foo';
    }
}

class Controller {
    public function __construct() {
        $database_pdo = new Connect();
        $database_json = new AlternativeConnect();

        $pdo_content = new AddContent($database_pdo);
        $json_content = new AddContent($database_json);
    }
}

class AddContent {
    private $db;

    public function __construct(DatabaseImplementation $db) {
        $this->db = $db;
        $this->db->connect();
    }
}

使用 DI 的优点是类不需要知道使用哪个实现来存储数据,无论是使用 PDO 还是使用 MongoDB。它只需要知道它可以使用哪些功能(例如连接/执行/...)

关于php - 如何跨多个类访问PDO连接对象?[php +Mysql],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26119576/

相关文章:

php - 尝试将具有多个 XOR 组件的 PHP hash_hmac 转换为 coldfusion

php - 如何使用php _GET?

PHP OpenID 不适用于 Google/Yahoo 和 'hacks' 修复它...它们安全吗?

php - 使 MySQL 查询动态化的最佳方法(例如,更新查询参数以显示前一周)

javascript - anchor 上的动态ID不会在其他 anchor 上触发最后一个 anchor php js pdo

javascript - 如果空白,则在 HTML 表单上设置默认字段值

php - 如何在一列中插入多个选择框项目

mysql - 尝试创建 sql 表但显示错误

mysql - 存储多个时间戳和数字的最佳方式?

php - PDO 将执行结果返回到数组