PHP中的Foreach循环 - 全部或全部

时间:2016-07-03 04:18:52

标签: php foreach laravel-5.2 stripe-payments

在foreach循环中,假设我想执行以下操作

foreach($items as $item)
{

  // charge a user for purchasing an item - IS BEING DONE THROUGH AN API CALL WITH STRIPE
  // ie: \Stripe\Charge::create(...);

  // save some info to a database
  // using Laravel for this project so this is within a DB::transaction(...);


  // send a notification email to the buyer
  // Emails are being queued to avoid slowing down the request
  // ie: Mail::queue(...);
}

我想要一个全有或全无的情况发生。例如,如果在迭代期间发生错误,则不收取任何项目,不会将任何信息保存到数据库,并且买方不会收到通知电子邮件。但是,如果foreach循环成功遍历每个项目,则向用户收费,将信息保存到数据库,然后发送通知电子邮件。我该怎么做?

4 个答案:

答案 0 :(得分:1)

我建议使用交易并在最后通知买方。

Mysqli示例:

$dbConn->begin_transaction();

try{

    foreach($ítems as $item){
        //Whatever you are going to do
    }

    if($dbConn->commit()){

    //Notify buyer about all the transactions, the user doesn't receives the notification unless the commit was succesful

   }

catch(Exception ex){
    $dbConn->rollback();
}

另外你可以验证mysqli函数的返回值,我只想关注事务的使用。

答案 1 :(得分:0)

您可能需要根据@Terminus添加更多细节,以及是否/为什么要单独为每个项目收费。但是根据您的需要,您可以在循环期间构建db查询而不执行它直到循环结束。然后,您必须回滚任何费用(根据您的实施情况),然后根据需要发送一封或多封电子邮件。

答案 2 :(得分:0)

您可以计算数组中项目的数量,并进行一些更改以使其正常工作:

$result = count($items);
$c = 0;
foreach($items as $item)
{
// charge a user for purchasing an item -- instead add it to a buffer as total 
//amount.
// save some info to a database ---instead prepare your db statements here
// send a notification email to the buyer.--this could be sent out for all the 
//items in the order together outside the loop instead of inside the loop.
$c = $c + 1;
}
if($c == $cc)
{
//execute your prepared statements here..and also the other email and charging stuff.
}
else{
 //Error code. 
 }

答案 3 :(得分:0)

你有选择。

我能想到的最简单的方法是在阵列上循环两次;第一次检查条件和第二次只有第一次检查没有发现问题。

$isGoodToGo = true;
foreach($items as $item) {
  if (conditon met) {
    $isGoodToGo = false;
    break; // stop iterating over the array cause condition is met
  }
}

if ($isGoodToGo) {
  foreach($items as $item) {
    // charge a user for purchasing an item
    // save some info to a database
    // send a notification email to the buyer
  }
}