php - 重用数据库连接对象

标签 php mysql pdo

我正在使用此函数在需要时连接到我的 MySQL 数据库,并在同一 php 脚本中重复使用相同的连接对象进行我可能需要的任何进一步查询。

function cnn() {
    static $pdo;
    if(!isset($pdo)) {
        try {
            $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
            $pdo->setAttribute(PDO::ATTR_TIMEOUT, 30);
            $pdo->setAttribute(PDO::ATTR_PERSISTENT, true);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
            return $pdo;
        } catch(PDOException $e) {
            http_response_code(503);
            echo $e->getCode.': '.$e->getMessage();
            die(); //or whatever error handler you use
        }
    } else {
        return $pdo;
    }
}

第一次查询(创建对象)

echo cnn()->query('SELECT firstname FROM user WHERE id=4;')->fetch(PDO::FETCH_COLUMN)

第二次查询(对象被重用)

echo cnn()->query('SELECT title FROM news WHERE id=516;')->fetch(PDO::FETCH_COLUMN)

您同意这种做法吗?你认为它可以优化吗?感谢您的意见。

最佳答案

我同意这种方法,尽管很多人会告诉你这种“单例”方法很糟糕,很糟糕。

但是,我不同意您的实现。应该是:

function cnn() {
    static $pdo;
    if(!$pdo) {
        $conf = array(PDO::ATTR_TIMEOUT => 30,
                  PDO::ATTR_PERSISTENT => true,
                  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
            );
        $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME;
        $pdo = new PDO($dsn, DB_USER, DB_PASS, $conf);
    } 
    return $pdo;
}

此外,将处理程序代码移至处理程序(并且当然而不无条件地回显错误看起来是明智的!)

function my_exceptionHandler($exception) {
    http_response_code(503);
    if (ini_get('display_errors')) {
        echo $e->getMessage().$e->getTrace();
    } else {
        log_error($e->getMessage().$e->getTrace());
    }
    die(); //or whatever error handler you use
}
set_exception_handler("my_exceptionHandler");

此外,我会扩展它以接受一个参数,从而使多个连接成为可能。

关于php - 重用数据库连接对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16889753/

相关文章:

MySQL - 如何使用地理位置数据加快搜索速度?

python - SQLAlchemy + MySQL 加入奇怪的行为

php - 如何让这些链接按钮在此 PHP 代码中正确显示?

php - 如何用键和值分解多维数组

javascript - Laravel,如何过滤 View 中的日期?

php - 如果它(www-data)无法访问所需的包,我如何让 PHP 编译 LaTeX 文档?

mysql - SQL 选择 -> 产品 -> 评论 -> 用户

php - 使用 PHP 创建购物篮

PHP - 将 PDO 与 IN 子句数组一起使用

php - fatal error : Call to a member function prepare() on a non-object PDO