Joomla サイトの管理者にレポート コンポーネントがあります。ユーザーは、使用可能なレポート タイプのドロップダウン リストから選択できます。これにより、関数が呼び出されてクエリが実行され、CSV ファイルが出力されます。ほとんどの場合、これでうまくいきます。ただし、あるレポートでは、mySQL でクエリを直接実行した場合とは異なる数の結果が Joomla 関数を通じて得られます。何が起こっているのかを確認するために error_log を追加しましたが、クエリが 2 回実行されているように見えます。(多分。)
関数を呼び出すコードは次のとおりです。
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§ion=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§ion=reports
そのように; 次々と。それを出力する行がループ内にないことを考えると、なぜそのセクションを2回実行しているのかわかりません。
何か案は?