2011-07-09 172 views
1

我有一个购物车,我从马修彭内尔(购物车教程),在他的购物车脚本我想实现贝宝。但是我遇到了一个我无法真正解决的问题。由于在他的代码中他正在做一个foreach循环,因此我的paypal“item_name_”和“amount_”必须是可变的。我需要计算一个数组中有多少个数组。我尝试使用count($ content),但它给了我数组的数量,但结果是增加了我的购物车中的每一行。 即计数帮助,来计算数组中的数字

1 object return 1 
2 object return 2 , 2 
3 object return 3, 3 ,3 

我想知道如果我在其他功能错过了,还是有办法让即使实际返回的数据是3,3,3仅1条结果。

最后为paypal_quantity有这样的变量添加到购物车?

<?php 
    $i = 1; 
    function checkout() { 
     global $db; 
     $cart = $_SESSION['cart']; 
     if ($cart) { 
      $items = explode(',', $cart); 
      $contents = array(); 
      foreach ($items as $item) { 
       $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1; 
      } 
    ?> 

      <form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"> 
       <input type="hidden" name="cmd" value="_cart"></input> 
       <input type="hidden" name="upload" value="1"></input> 
       <input type="hidden" name="business" value="my_email.com"></input> 
     <?php 


      foreach ($contents as $id => $qty) { 

       echo $contents; 

       $sql = 'SELECT * FROM books WHERE id = ' . $id; 
       $result = $db->query($sql); 
       $row = $result->fetch(); 
       extract($row); 
     ?> 
       <input type="hidden" name="item_name_<?php echo count($contents); ?>" value="<?php echo $title; ?>"></input> 
       <input type="hidden" name="amount_<?php echo count($contents); ?>" value="<?php echo $price; ?>"></input> 
       <input type="hidden" name="quantity" value="<?php echo $qty; ?>"></input> 
     <?php 
      } 
     ?> 
      <input type="submit" value="PayPal"></input> 

     </form> 

回答

1

这是因为这些线路

  <input type="hidden" name="item_name_<?php echo count($contents); ?>" value="<?php echo $title; ?>"></input> 
      <input type="hidden" name="amount_<?php echo count($contents); ?>" value="<?php echo $price; ?>"></input> 

是foreach循环内,所以如果你循环两次,回声计数($内容);运行两次,你得到22.

+0

雅,我通过回应美元内容/ $计数(内容)。在这个函数中,变量$ content似乎只是我购物车上出现的行数的唯一关键。然而,我不知道如何通过只显示一次来解决它。想知道如果我可以做IF($ content ==?){variable $ i = 1;并让它$ i ++}? – 3cross

0

我看了你的代码,并提出了一些建议的改进。看起来好像有一些重复的工作正在进行,希望你能理解我已经做了什么来帮助。看起来这可能会很好地解决您的问题至少。

<?php 
    $i = 1; // not used in the below function. 
    function checkout() { 
     global $db; 
     // check for isset, it is more defensive and PHP is less inclined to issue a warning. 
     if(isset($_SESSION['cart']) && $_SESSION['cart']) { 
      $items = explode(',', $_SESSION['cart']); 
      // array_count_values is pretty cool. 
      // it does exactly what your first for loop did. 
      $contents = array_count_values($items);     
    ?> 
      <form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"> 
       <input type="hidden" name="cmd" value="_cart"></input> 
       <input type="hidden" name="upload" value="1"></input> 
       <input type="hidden" name="business" value="my_email.com"></input> 
     <?php 

      foreach ($contents as $id => $qty) { 
       // echo $contents; <!-- this should echo 'Array' continually 
       $sql = 'SELECT * FROM books WHERE id = ' . $id; 
       $result = $db->query($sql); 
       $row = $result->fetch(); 
       // extract is normally not the best practice, frequently it leads to accidental replacement of 
       // important variables -- if `books` had a `contents` column or quantity, that would be no good. 
       // so I've replaced it with what I expect are the keys to the array. 
     ?> 
       <?php 
        /* 
        A caution about hidden inputs. They can be modified by the client, so if you were to, say, 
        trust the price listed below and your client had no scruples, your client could simply set 
        that value to, say, $0.01. Or worse, free! 
        */ 
        /* 
        I've changed up your input naming convention just slightly (it is easy to fix, but hear me 
        out first). You've used something which will render <name-1>_1, <name-1>_2... which means 
        that your $_POST (If you're buying something with this form, $_POST really is your better 
        bet) will have $_POST[<name-1>_1], $_POST[<name-1>_2]... In order to get all of the different 
        products grouped properly, you'll actually need to parse the $_POST indexes... it will get 
        messy. It's doable, but it will be annoying. 

        Instead, I put the naming convention <name-1>[1], <name-2>[2]. This means that $_POST will 
        have an array for each of the <names>. This means that you can do this: 

        $quantity = ""; 
        $ammount = ""; 
        foreach($_POST[ 'item_name' ] as $key => $item) 
        { 
         $quantity = $_POST[ 'quantity' ][ $key ]; 
         $ammount = $_POST[ 'ammount' ][ $key ]; 
         // you now have all three quickly and easily with no string parsing! Set it and forget it! 
        } 
        */ 
       ?> 
       <input type="hidden" name="item_name[<?php 
         // before you were using count($contents) here. That would mean that everything would have 
         // the same name and you'd only get one value back in $_REQUEST. I think you meant ID. 
         echo $id; 
       ?>]" value="<?php echo $row['title']; ?>"></input> 
       <input type="hidden" name="amount[<?php echo $id; ?>" value="<?php 
         // ammount may not be your best choice of input name for something that refers to price. 
         // I know that when I look at it, I expect that to refer to quantity and not to cost 
         // and your first job as a developer is writing code which is as obvious as possible. 
         // But that is more stylistic than not so feel free to disregard 
         echo $row['price']; 
       ?>]"></input> 
       <input type="hidden" name="quantity[<?php 
         // I took the liberty of adding id to this input as well -- otherwise you'd only have one 
         // quantity 
         echo $id; 
       ?>]" value="<?php echo $qty; ?>"></input> 
     <?php 
      } 
     ?> 
      <input type="submit" value="PayPal"></input> 
     </form> 
<?php 
     } 
    } 
?> 
+0

感谢您的建议! Ima现在会试用它,但不知道它是否会起作用,因为这是我从其他人那里得到的脚本,并对它进行编辑工作。 – 3cross

+0

嗯,试过你的方法。我相信我的表单名称是用于贝宝命名约定?无论如何,贝宝无法检测到购物车中的任何物品,以前当使用回声计数($ content)即时获取我的购物车中的行数时,我可以使用不同的input_name_“number”生成多个输入。 – 3cross

1

不能相信即时通讯如此愚蠢。这里不得不说非常感谢你的所有时间和帮助。但我设法解决这个问题真的很简单。

foreach ($contents as $id => $qty) { 
       $rowid++; 
       $sql = 'SELECT * FROM books WHERE id = ' . $id; 
       $result = $db->query($sql); 
       $row = $result->fetch(); 
       extract($row); 
       echo $rowid;