当我从DB中选择所有行时,PDO“连接太多”

时间:2014-01-30 14:22:24

标签: 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);
}

1 个答案:

答案 0 :(得分:1)

所以我读了一些东西,结果我想要一个持久连接,因为它每次都是相同的连接。它不会打开一个新的,而只会使用缓存的连接。

PDO::ATTR_PERSISTENT => true