我有一个购物车,我从Matthew Pennell(购物车教程)获得,在他的购物车脚本中我想实现paypal。但是我遇到了一个我无法解决的问题。因为在他的代码中他正在做一个foreach循环,因此我的paypal“item_name_”和“amount_”必须是可变的。我需要计算一个数组中有多少个数组。我尝试使用count($ content),它确实给了我数组的数量,但结果是我的购物车中的每一行都增加了。 I.E
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>
答案 0 :(得分: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循环内部,因此如果循环两次,则回显计数($ contents);跑两次,你得到22。
答案 1 :(得分: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;
答案 2 :(得分: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
}
}
?>