如何避免多个数据库连接?

时间:2014-12-17 20:05:07

标签: php pdo

我已移至PDO并为我的所有查询(SELECT/DELETE/INSERT/UPDATE)编写了一个小函数:

function pdo_query($query, $parameter)
{

    try {
        $db=new PDO("mysql:host=localhost;dbname=...","root","");
    } catch (PDOException $e) {
        die("DB-Error!");
    }
    $stmt = $db->prepare($query);
    $stmt->execute($parameter);
    if (substr($query,0,6)=="SELECT") {
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } else {
        return $stmt->rowCount();
    }

}

我在某些页面上多次使用此功能,因此会产生多个数据库连接/对象。

是否可以将连接置于查询函数之外?

我认为这可行,但它没有:

global $db;

try {
    $db=new PDO("mysql:host=localhost;dbname=...","root","");
} catch (PDOException $e) {
    die("DB-Error!");
}

function pdo_query($query, $parameter)
{
    $stmt = $db->prepare($query);
    $stmt->execute($parameter);
    if (substr($query,0,6)=="SELECT") {
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } else {
        return $stmt->rowCount();
    }
}

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

你也必须在你的功能中使用global $db;。但是当你开始做这样的事情时,问问自己,“为什么我不写OO代码”?编写一个类,将$db定义为该类的静态成员,并在构造函数中初始化它。

更好的是,在基类中执行此操作,然后为需要查询的各种表扩展该类。你会在路上...

答案 1 :(得分:0)

global关键字用于函数级别,并告诉函数查找并使用全局范围中的变量。要做到这一点,请执行:

function pdo_query($query, $parameter)
{
    global $db;
    $stmt = $db->prepare($query);
    ...

并删除最初的全局声明,因为它不再需要:

global $db;

最后,考虑将所有这些封装在一个类中,以实现真正的面向对象编程。

答案 2 :(得分:0)

没有必要使用全局。无论您的函数是类方法还是函数,它都可以接受数据库连接作为参数。因此,您可以创建一次连接,并将其传递给任何需要它的函数。

function pdo_query ($connection, $query, $parameter) {
    $stmt = $connection->prepare($query);
    $stmt->execute($parameter);
    if (substr($query, 0, 6) == "SELECT") {
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } else {
        return $stmt->rowCount();
    }
}

try {
    $db=new PDO("mysql:host=localhost;dbname=...","root","");
} catch (PDOException $e) {
    die("DB-Error!");
}

$result = pdo_query($db, $the_query, $the_params);

答案 3 :(得分:0)

出于同样的考虑,我选择了以下解决方案:
- 创建一个" Dbwrapper"具有pdo DB作为成员的类 - 构造函数使用有用信息($this->host->user->password->db等)初始化成员,并将布尔变量$this->isconnected设置为false。构造函数不会打开连接(*) - connect()方法检查$this->isconnected的值:如果未连接,则实际打开连接(实例化pdo成员),如果成功,则将$this->isconnected设置为true - 查询方法都以调用connect()开始,这只是...如果已经连接则没有任何内容,否则连接。

因此,我现在只需要实例化一个新的Dbwrapper对象,并在每次执行查询时调用其查询方法,而不必打开数据库,只有在需要时才能透明地完成它。 / p>

请注意,我选择在pdo对象周围定义一个包装类。您还可以考虑从pdo派生自己的类来添加此功能。

(*)因为构造函数只是做了一些变量初始化并且没有打开任何连接,我通常在init.php文件(包括其他网站范围的变量定义)中为所有实例化它一次在网站的每个脚本中。