1

Matthew Pennell (ショッピング カートのチュートリアル) から入手したショッピング カートがあります。彼のショッピング カート スクリプトでは、paypal を実装したいと考えています。しかし、私は本当に解決できない問題に遭遇します。彼のコードでは foreach loop を実行しているため、私のペイパルの「item_name_」と「amount_」は可変でなければなりません。array 内にいくつの array があるかを数える必要があります。count($content) を使用して試してみましたが、配列の数が表示されますが、カート内の 1 行おきに結果が増加しています。IE

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>

4

3 に答える 3

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 ループ内にあるため、2 回ループすると、echo count($contents); 2 回実行すると 22 になります。

于 2011-07-09T10:34:20.177 に答える
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;
于 2011-07-10T12:00:09.420 に答える
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
        }
    }
?>
于 2011-07-09T11:16:23.950 に答える