2013-11-21 79 views
0

我处于一个我看不到在for循环内避免SELECT查询的可能性的位置,因此我在这里问。回避特定情况下的查询

情况是这样的:我正在创建一个电子商务系统,它实现了贝宝购物车系统。一个用户支付后,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的反应得到的价格。

这个select语句必须发生在这个循环内部,据我所知。

有没有办法避免这种情况?

+0

我不擅长PHP,但是不能仅仅在SELECT中执行查询SELECT item_price FROM WHERE id = item_number1 OR id = item_number2 .... OR id = item_numberX,等等?这至少会给你一个SQL查询,而不是一个巨大的for循环。 –

+0

如果有人购买了120件物品会怎么样? – Aborted

+0

没有理由不适合120个项目。它比更有效: 1)打开连接到DB 2)发送很小查询 3)等待响应 4)接收的数据为小型查询 5)关闭连接 X120倍 –

回答

0

要避免for循环中的查询,您必须从ipn响应中收集所有item_numbers。然后,使用这些item_numbers生成带有IN语句的查询。例如:

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

感谢真棒提醒!这是您从编程中休息时得到的。 – Aborted