加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 重用数据库连接对象

发布时间:2020-12-13 16:51:03 所属栏目:PHP教程 来源:网络整理
导读:我正在使用此函数在需要时连接到我的 MySQL数据库,并且还可以在同一个php脚本中重新使用相同的连接对象进行我可能需要的任何进一步查询. function cnn() { static $pdo; if(!isset($pdo)) { try { $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,
我正在使用此函数在需要时连接到我的 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_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");

此外,我将它扩展为接受一个参数,以使多个连接成为可能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读