我有一个Joomla网站,我已经写了一个定制的购物车组件的。用户基本上是购买代码我们存储在我们的数据库 - 这些都与印刷奖励卡相关联。当用户检查出来,我需要从数据库(然而,许多自己购买),然后通过代码列表循环抢码的块和更新其他表,在我的车信息。推车被存储为阵列的在会话变量的阵列,如下所示:

$cart = Array ( 
[0] => Array ( [TypeFlag] => S [qty] => 25 [denom] => 50  [totalPrice] =>  100 )
[1] => Array ( [TypeFlag] => V [qty] => 10 [denom] => 25  [totalPrice] => 25 ) 
[2] => Array ( [TypeFlag] => C [qty] => 100 [denom] => 25  [totalPrice] => 25 ) 
) 

,其中每个内部数组是在车一个订单项。这是这是导致问题的数量;当他们低有正在运行的所有循环内的插入和更新查询没有问题。然而,当数量元素都很高,我开始越来越内存分配错误。这是可以理解的,因为它基本上运行多个查询几百倍。问题是,用户可以在同一时间有可能订购一千卡或以上(这是公司激励计划),所以我需要能够获得插入和更新的所有记录,不管数量有多大。

下面是有关的代码:

首先,在循环:

//loop through vouchers to create purchase records, update voucher records, create certificates
$rightNow = date("YmdHis");
foreach($vouchers as $voucher) {
    $VoucherID = $voucher['VoucherID'];
    $VoucherIDList .= $VoucherIDList ."," . $voucher['VoucherNbr'];
    //create purchase record            
    $purchData = array("CcAuthCode"=>$ccAuthCode,"VoucherID"=>$VoucherID,"PurchAmt"=>$realFinalTotal, "ShipHandFee"=>number_format($shippingCharge,2),  "PurchDT"=>$rightNow,  "AcctID"=>$accountIDs['UserAcctID'], "ShipAddrID"=>$accountIDs['MailingAcctID']);
    $purchID = $model->createPurchaseRecord($purchData);    

    //update voucher
    $model->updateVoucherInfo($VoucherID,$accountIDs['BillingAcctID'], $denom, $purchID,$message);
}

实际的查询是该模型中的createPurchaseRecord和updateVoucherInfo函数中:

function createPurchaseRecord($data){    
    $db =& JFactory::getDBO();
    $insFields = "";
    $valFields = "";

    foreach ($data as $f => $v){
        $insFields .= "," . $f;
        $valFields .= "," . $db->quote($v);
    }

    $insFields = substr($insFields,1);
    $valFields = substr($valFields,1);

    $query = "insert into arrc_PurchaseActivity ({$insFields}) values ({$valFields})";
    $db->setQuery($query);
    if (!$db->query()) error_log($db->stderr());

    return $db->insertid();
}

function updateVoucherInfo($voucherID,$billingAcctId, $balanceInit, $purchID, $certMessage) {
    //set ActivatedDT, BalanceInit
    $rightNow = date("YmdHis");
    $db =& JFactory::getDBO();
    $query = "UPDATE arrc_Voucher 
        set ActivatedDT=".$db->quote($rightNow).", BalanceInit=".$db->quote($balanceInit) . ", BalanceCurrent=".$db->quote($balanceInit).
    ", AcctID=".$db->quote($billingAcctId).", PurchActvtyID=".$db->quote($purchID) . ", certMessage=".$db->quote($certMessage)
    . " WHERE VoucherID=".$db->quote($voucherID);

    $db->setQuery($query);
    if (!$db->query()) error_log($db->stderr()); 
    $certificateNumber = $voucherID;
    return $certificateNumber;

}

谁能帮助我吗?必须有一种方法,使这种更快捷;现在它抛出一个内存错误,当我尝试做任何超过30个左右的的时间;鉴于需求为1000 +,这是一个大问题。这是错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71303153 bytes) in /var/www/html/mysite.com/components/com_arrcard/controllers/checkout.php on line 110

线110是这样的线从上面的环:

   $VoucherIDList .= $VoucherIDList ."," . $voucher['VoucherNbr'];
有帮助吗?

解决方案

$VoucherIDList .= $VoucherIDList ."," . $voucher['VoucherNbr'];

您这样做是错误的。您连接列表以本身导致可变呈指数增长。

正确方式:

$VoucherIDList .= "," . $voucher['VoucherNbr'];

$VoucherIDList = $VoucherIDList ."," . $voucher['VoucherNbr'];

此致 阿林

其他提示

为使你的代码少许清洁剂,消除不必要的调用。

代替

foreach ($data as $f => $v){
    $insFields .= "," . $f;
    $valFields .= "," . $db->quote($v);
}

使用

$valFields = implode(',', $data);
$insFields = implode(',', array_keys($data));

提高内存的使用在php.ini

如果您使用PHP 5,松&

而不是通过数组的数组循环的。负载$vouchers作为对象的阵列中,目的是通过参考而不是由值来传递。

foreach($vouchers as $voucher) {

$VoucherIDList .= $VoucherIDList ."," . $voucher['VoucherNbr'];

使用你正在做$VoucherIDList的级联到其自身。=运算符。

通过上面的,你再还再次添加$VoucherIDList到列表中的声明。

像阿林上面所说的,每次添加的变量本身呈指数循环运行。

我猜这就是为什么你所得到的误差问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top