如何使用多个类别的PDO连接到数据库?

时间:2019-03-16 20:43:30

标签: php pdo

我有多个类,其中大多数需要连接到数据库,

如何只设置一次PDO选项/主机/数据库名称等,然后在每个类中使用它,同时牢记以下几点:

  1. 我不想包装PDO
  2. 我需要在每次查询($db=null之后关闭PDO连接,所以我不能简单地只使用$db = new PDO(...)然后将$db传递给我的班级

我想跳过每个需要连接到数据库的类中的内容:

<?php

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

1 个答案:

答案 0 :(得分:0)

如果您想完全控制打开和关闭连接,那么我建议我们只集中$dsn$user$pass$options变量。我假设还有$host$db$charset之类的变量,您没有向我们透露,但可以添加它们。

让我们将此文件称为global_db.php

<?php
$host = "127.0.0.1";
$db = "mydb";
$charset = "UTF-8";
$user = "root";
$pass = "";
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

看起来我们已经准备好所有商品,请记住,我没有对此进行测试,因此我们可能会遇到一两个语法错误。

现在在我们要打开连接的类或其他php文件中。

让我们将此页面称为fooClass.php

<?php
require_once 'global_db.php';

class FooClass {
    public function __construct() {
        try {
            $pdo = new PDO(
                    $GLOBALS['dsn'],
                    $GLOBALS['user'],
                    $GLOBALS['pass'],
                    $GLOBALS['options']);
        } catch (\PDOException $e) {
            throw new \PDOException($e->getMessage(), (int)$e->getCode());
        }
    }
}

应该可以解决问题,或者至少可以让您大致了解自己的路线从这里出发。还有许多其他方法可以完成相似但不需要过于复杂的事情。

nJoy!