Запрос Joomla, очевидно, выполняется более одного раза - PullRequest
1 голос
/ 19 октября 2010

У меня есть компонент отчетности в администраторе сайта Joomla.Пользователь может выбрать из выпадающего списка доступных типов отчетов, который затем вызывает функцию для запуска запроса и вывода файла CSV.По большей части это работает.Однако для одного отчета я получаю другое количество результатов с помощью функции Joomla, чем если бы я выполнял запрос непосредственно в mySQL.Я добавил error_log, чтобы увидеть, что происходит, и похоже, что запрос выполняется дважды.(Возможно.)

Вот код, который вызывает функцию:

function getFullRedeemActivity($start, $end){

    return getReportFullRedeemActivityByDate("v.UpdateDT", strtotime($start),strtotime($end));

}

$ start и $ end передаются;нет проблем там.Проблема заключается в функции getReportFullRedeemActivityByDate.Вот код для этого:

function getReportFullRedeemActivityByDate($start, $end, $limitStart=null, $limitRows=null){
    //open db
    $db =& JFactory::getDBO();
    $where = ($low && $high) ? " and v.UpdateDT between ".$db->quote($low)." and ".$db->quote($high) : "";
     $sort = "v.UpdateDT";
     $limit = (is_int($limitStart) && is_int($limitRows)) ? " limit ".$db->quote($limitstart).", ".$db->quote($limitRows) : "";

    //set query
    $query = "select    r.RedeemAmt,
            v.VoucherNbr, v.BalanceInit, v.UpdateDT, v.BalanceCurrent, 
    m.SkuAbbr, m.MerchantNm,
    a.name,  a.email, a.company, a.address1, a.address2, a.city, a.state, a.zip, a.phone

            from arrc_RedeemActivity r
            left outer join arrc_Voucher v on v.VoucherID = r.VoucherID
            left outer join arrc_Merchant m on m.MerchantID = r.MerchantID
            left outer join jos_customers_addresses a on a.id = r.AcctID
           {$where} 
            order by {$sort} {$limit}";

    $db->setQuery($query);
    if (!$db->query()) error_log($db->stderr());

    if (!$db->getNumRows()){
        JError::raiseWarning( 100, 'No records returned' );
        return false;
    }
    else{
        error_log("there are ". $db->getNumRows()." rows");
    }

    //loop out records into array
    foreach ($db->loadAssocList() as $row){
        $data[$row['BalanceCurrent']] = $row;
        return $data;
    }
}

Когда я смотрю на свой error_log, я вижу следующее:

[Tue Oct 19 09:37:30 2010] [error] [client xxx.xx.xx.xxx] there are 5 rows, referer: http://mysite.com/administrator/index.php?option=com_arrcard&section=reports
[Tue Oct 19 09:37:30 2010] [error] [client xxx.xx.xx.xxx] there are 2 rows, referer: http://mysite.com/administrator/index.php?option=com_arrcard&section=reports

Просто так;один за другим.Учитывая, что строка, которая выводит это, не внутри цикла, я не могу понять, почему он, по-видимому, проходит через этот раздел дважды.

Есть идеи?

1 Ответ

0 голосов
/ 19 октября 2010

Оказывается, что не все возвращаемые записи имели значение в столбце BalanceCurrent, поэтому, когда foreach достигает этой строки:

 $data[$row['BalanceCurrent']] = $row;

это не создавало строки для этих записей. Я переключил имя поля на один из столбцов идентификатора, который определенно есть во всех строках, и все в порядке.

...