php - 当我从数据库中选择所有行时,PDO 'too many connections'

标签 php mysql pdo

我正在尝试编写一个函数,根据与该交易相关的所有购买来验证银行交易金额。可以将一笔购买链接到多笔交易,也可以将多笔购买链接到同一笔交易。

该函数的工作原理是对相关交易进行总计,然后运行数据库查询来选择所有购买,然后检查每个购买以查看它是否引用了任何相关交易。然后,它会计算与任何交易相关的所有购买金额的总计,并通过检查两个总计是否相加来进行核对。

我的问题是,当我从数据库获取所有购买时,我总是收到“连接过多”错误。如果我限制搜索也没关系,但我需要所有这些才能使该功能正常工作。

我要么需要以某种方式解决连接过载问题,要么编写查询以仅搜索包含这些交易的购买 - 但我不确定如何做到这一点。

交易在购买条目的一列中以逗号分隔。

有趣的是,如果通过 AJAX 调用购买列表,则效果很好。但是,如果页面(包括其他先前的连接)是静态加载的 - 它就不起作用。我假设因为 AJAX 正在加载一件事,所以该实例中没有先前的连接。

这是一个相当复杂的系统,因此它本身可能没有多大帮助:

public static function verify($ids, $return = NULL) {

    // Transaction total
    $transactions = explode(",",$ids);
    $transTotal = 0;
    foreach($transactions as $transaction) {
        $transTotal = $transTotal + self::get($transaction,"amount");
    }

    // Expense/item total
    $accounts = AccItem::getAll("all");
    $itemTotal = 0;
    foreach($accounts as $item) {
        $translink = explode(",",$item->transaction_ids);
        if(array_intersect($transactions, $translink)) {
            $itemTotal = $itemTotal + AccItem::calculate($item->id,"total") + AccItem::calculate($item->id,"tax");
        }
    }
    unset($accounts);

    if($transTotal == $itemTotal or $transTotal + $itemTotal == 0) {
        if($return) return 'check';
        if(!$return) echo '<abbr title="Transaction verified."><i class="fa fa-check-circle"></i></abbr>';
    } else {
        if(!$return) echo '<abbr title="Transaction amount mismatch!"><i class="fa fa-exclamation-circle"></i></abbr>';
    }

}

这是 getAll 函数:

public static function getAll($chart_id, $date_from = 0, $date_to = 9999999999999) {
    $db = new Data;
    if($chart_id == "all") {
        $sql = $db->query("SELECT * FROM mc_account_items WHERE date_incurred >= :date_from AND date_incurred <= :date_to ORDER BY date_incurred DESC");
    } else {
        $sql = $db->query("SELECT * FROM mc_account_items WHERE chart_id = :chart_id AND date_incurred >= :date_from AND date_incurred <= :date_to ORDER BY date_incurred DESC");
        $sql->bindParam(":chart_id", $chart_id);
    }
    $sql->bindParam(":date_from", $date_from);
    $sql->bindParam(":date_to", $date_to);
    $sql->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,'AccItem');
    $sql->execute();
    return $sql->fetchAll();
    //unset($db);
}

最佳答案

所以我进一步了解了一些内容,结果发现我想要一个持久的连接,因为每次都是相同的连接。它不会打开一个新连接,而是仅使用缓存的连接。

PDO::ATTR_PERSISTENT => true

关于php - 当我从数据库中选择所有行时,PDO 'too many connections',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21459017/

相关文章:

php - 使用php上传图像并将表单数据保存到Mysql数据库中

MySQL 数据库,带有用户创建的带有自定义列号的表

php - 启用 PDO 后 - 错误 2002 getaddrinfo 失败 : Name or service not known

PHP - IF 语句为假,仍然运行

php - 修复未索引的数据库 MySQL

php - 如何在sql中一起使用like和between?

php - 为什么某些属性没有保存在我的数据库中?

php - &lt;textarea&gt; 中的文本自动被插入

php - if 结构中的函数

php - MySQL PDO UNION 查询,查找结果来自的表