在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循环成功遍历每个项目,则向用户收费,将信息保存到数据库,然后发送通知电子邮件。我该怎么做?
答案 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
}
}