【问题标题】:Joomla query apparently running more than onceJoomla 查询显然不止一次运行
【发布时间】:2010-10-19 14:43:49
【问题描述】:

我在 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

就这样;一个接一个地。鉴于打印出来的行不在循环内,我无法弄清楚为什么它显然会两次通过该部分。

有什么想法吗?

【问题讨论】:

  • 您可以尝试将_SERVER["REQUEST_TIME"] 添加到错误日志中,以查看两个查询发出的请求是否相同,或者资源是否被调用了两次
  • 如果是两个不同的请求:最常见的原因是某事被调用两次是对资源的空引用,例如<img src=""> 将尝试将当前页面加载到图像中
  • 好的,我发现在添加请求时间后部分问题出在哪里:它在两个不同的地方打印出该行 - 一个在运行查询的实际函数中,一次在查询数据返回到的函数。因此,显然是导致问题的 foreach 行,因为在此之前我得到了正确的 rownum,但是作为 $data 返回的数组没有正确数量的元素。

标签: php joomla joomla-extensions


【解决方案1】:

事实证明,并非所有返回的记录在 BalanceCurrent 列中都有值,所以当 foreach 命中这一行时:

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

它没有为这些记录创建一行。我将字段名称切换到所有行肯定具有的 id 列之一,一切都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2014-05-16
    相关资源
    最近更新 更多