2013-11-21 3 views
0

Я в состоянии, когда я не вижу возможности избежать запроса SELECT внутри цикла for, поэтому я прошу здесь.Избегание запроса в конкретном контуре случае

Ситуация такова: Я создаю систему электронной коммерции и реализует систему корзины Paypal. После того, как пользователь платит, ответ IPN выглядит примерно так (укороченный):

Array 
(
    [mc_gross] => 8.98 
    [address_status] => confirmed 
    [item_number1] => item_49 
    [tax] => 0.00 
    [item_number2] => item_16 
    [num_cart_items] => 2 
    [address_state] => CA 
    [item_name1] => Tractor 
    [item_name2] => Elegy 
    [quantity1] => 1 
    [quantity2] => 1 
    [txn_type] => cart 
    [mc_gross_1] => 5.99 
    [mc_currency] => USD 
    [mc_gross_2] => 2.99 
    [residence_country] => US 
    [test_ipn] => 1 
    [payment_gross] => 8.98 
) 

Как вы видите, есть некоторые ключи говорят somethingN. Здесь начинается проблема.

Я использую num_cart_items как число итераций я должен сделать, как:

for ($i = 1; $i <= $_POST['cart_num_items']; $i++) 
{ 
    // Do something 
} 

Ну, очевидно, теперь в этом цикле, я был бы в состоянии получить доступ к каждой корзине элемента, который имеет N на конец его. И мне нужно проверить проданные продукты против мошенничества.

Мне нужно выбрать цену с номера артикула от item_numberN от моя база данных и сравните ее с ценой, полученной от ответа Paypal.

Этот оператор выбора должен произойти внутри этого цикла, насколько я вижу.

Есть ли способ избежать этого?

+0

Я не силен в PHP, но не могли бы вы просто сделать запрос в SQL, как SELECT, FROM ITEM_PRICE продуктов WHERE ID = item_number1 ИЛИ ID = item_number2 .... ИЛИ ID = item_numberX, и т.д? Это, по крайней мере, даст вам один SQL-запрос вместо массивного цикла. –

+0

Что делать, если кто-то купил 120 предметов? – Aborted

+0

Нет причин, чтобы он не работал для 120 предметов. Это гораздо эффективнее, чем: 1) Открытие подключения к БД 2) Отправка очень маленький запрос 3) В ожидании ответа 4) Получение данных для малого запроса 5) Закрыть соединение раз X120 –

ответ

0

Чтобы избежать запроса в цикле for, вы должны собрать все item_numbers из ответа ipn. Затем используйте эти item_numbers для генерации запроса с помощью оператора IN. Например:

SELECT * FROM `items` WHERE `item_number` IN ('item_49', 'item_16') 
+0

Спасибо за удивительное напоминание! Это то, что вы получаете, когда делаете перерывы в программировании. – Aborted

Смежные вопросы