2014-01-30 28 views
0

我正在嘗試編寫一個函數,用於驗證與該事務相關的所有購買的銀行交易金額。可以將購買鏈接到多個交易,並將多個購買鏈接到相同的交易。當我從數據庫中選擇所有行時,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

所以我讀到的東西多一點事實證明,我想要一個持久連接,因爲它每次都是相同的連接。而不是打開一個新的它只會使用緩存的連接。

PDO::ATTR_PERSISTENT => true 
+0

太棒了!所以這解決了你的問題? –

+0

它確實!從那時起沒有任何問題,碰木頭。 – Adam

+0

不錯的一個! (Upvoted) –