2016-07-03 4 views
0

В цикле Еогеаспа, сказать, что я хотел бы сделать следующийForeach Циклы в PHP - Все или ничего

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(...); 
} 

Я хотел бы произойти все или ничего ситуация. Например, если во время итерации возникает ошибка, тогда NAME из этих предметов заряжается, информация не сохраняется в базе данных, и покупатель не получает уведомление по электронной почте. Однако, если цикл foreach успешно выполняет итерацию по каждому элементу, затем заряжайте пользователя, сохраняйте информацию в базе данных и отправляйте уведомление по электронной почте. Как мне это сделать?

+0

Будете ли вы получать уведомления обо всех товарах? – Terminus

+0

Какие СУБД вы используете? –

+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, я просто хотел, чтобы сосредоточиться на использовании транзакций.

+0

Приятно поднимать транзакции, но что вы скажете об уведомлении по электронной почте? – Terminus

+0

Проверьте результат '$ dbConn-> commit()' –

+0

Правильно, но, скажем, второй коммит не выполняется, OP не хочет, чтобы первое электронное письмо выходило наружу. Я думаю, что с транзакцией вы фиксируете то, что OP нуждается в лучшем, чем мой ответ, но вам нужно учесть электронную почту. – Terminus

0

Возможно, вам потребуется добавить более подробную информацию в соответствии с @Terminus, а также, если/почему вы заряжаете каждый товар отдельно. Но в зависимости от ваших потребностей вы можете построить запрос db во время цикла, не выполняя его до конца цикла. Затем вам придется откатить все расходы (согласно вашей реализации), а затем отправить по электронной почте один или несколько писем. не

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. 
} 
+0

Я предполагаю, что элементы в цикле принадлежат одному и тому же покупателю. – Siddhesh

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 
    } 
} 
Смежные вопросы