I have a shopping cart which I got from Matthew Pennell(shopping cart tutorial), in his shopping cart script I would like to implement paypal. However I encounter a problem which I cant really solve. Since in his code he is doing a foreach loop , hence my paypal "item_name_" and "amount_" have to be variable. I need to count how many array is within an array . I tried it using count($content), it does give me number of array however , the result is increasing for every other row in my cart. I.E
1 object return 1
2 object return 2 , 2
3 object return 3, 3 ,3
I'm wondering if I've missed out on other function, or is there a way to get only 1 result even if the actual return data is 3,3,3 .
Lastly for paypal_quantity is there such variable for add to cart?
<?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>
开发者_StackOverflow社区 <?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>
That is because these lines
<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>
are inside the foreach loop and so if you loop twice, echo count($contents); runs twice and you get 22.
Cant believe im so stupid. Here have to say thanks alot for your all time and help. But i manage to solve this myself real easy.
foreach ($contents as $id => $qty) {
$rowid++;
$sql = 'SELECT * FROM books WHERE id = ' . $id;
$result = $db->query($sql);
$row = $result->fetch();
extract($row);
echo $rowid;
I've looked at your code and made some suggested improvements. It looked like there was a bit of duplicated work going on, hopefully you can understand what I've done to help. It looks like this will probably work well to fix your issue at a minimum.
<?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
}
}
?>
精彩评论