我有一个非常基本的购物车。问题是,除了列表中的第一个项目,所有其他项目都正常工作。 它的工作方式:
来自db的产品列表上各有一个按钮,它附加到JS函数中 然后,使用" load" jquery函数它连接到一个php脚本,将产品添加到会话[' basket']。我在JS函数中放了一个警告,第一个项目(有问题的那个)看起来很好。另外,回声一下#34;会话存在"如果在php页面中创建了一个会话。第一个Icon确实创建了一个会话,但没有显示产品名称等数据。
任何帮助将不胜感激。
产品列表:
<?php require_once('inc.php');
if ($prod->data != "") {
foreach ($prod->data as $p) {
if ($p['qty'] > 0) { ?>
<ul style="text-align: left">
<li><strong>Nome: </strong><?php echo $p['name']; ?> </li>
<li><strong>Categoria: </strong><?php echo($p['category']); ?> </li>
<li><strong>Preço: </strong>£<?php printf("%.2f", $p['priceUnit']); ?> </li>
<li><strong>Stock: </strong><?php echo($p['qty']); ?> </li>
<select id="<?php echo "prod_" . $p['id'] . "qty"; ?>" name="prodqty">
<?php
for ($i = 1; $i <= $p['qty']; $i++) {
echo '<option value="' . $i . '">' . $i . '</option>';
}
?>
</select> <br /><br />
</li>
<li><button class="button" onclick="addItem('<?php echo $p['id']; ?>', '<?php echo $p['name']; ?>', '<?php echo $p['category']; ?>',
'<?php echo $p['priceUnit']; ?>', '<?php echo "#prod_" . $p['id'] . "qty"; ?>');">Adicionar</button>
</li>
</ul>
<?php
}
}
}
输出
<div id="items">
<?php if(isset($_SESSION['basket'])) {
echo "SESSION EXISTS";
$total = "";
foreach ($_SESSION['basket'] as $item){ ?>
<table>
<tr>
<td><?php echo $item['name'];?></td>
<td>£<?php echo $item['price'];?></td>
<td> <?php echo $item['qty'];?></td>
<td><a href="<?php echo $_SERVER['PHP_SELF'];?>?id=<?php echo $item['id'];?>& action=remove">Eliminar</a></td>
<tr>
</table>
<?php $total+= $item['subtotal'];?>
<?php } ?>
<h3> Total a pagar: <span style="color:#000000">£<?php printf("%.2f", $total);?></span></h3>
<?php }
?>
</div>
<p class="output"></p>
JS:
function addItem(id,name,cat,price,qty){
alert('id: '+id+' name: '+name+' cat: '+cat+ ' price: '+price+' qty: '+$(qty).val());
var qty2 = $(qty).val();
var subtotal = price * qty2;
if($('.output').load('basket.php',{name:name,price:price,cat:cat,id:id,qty2:qty2})){
window.location.reload();
}
}
PHP SCRIPT basket.php
<?php require_once("inc.php");?>
<?php
$_id = CleanData($_POST['id']);
$_name = CleanData($_POST['name']);
$_price = CleanData($_POST['price']);
$_qty = CleanData($_POST['qty2']);
$_cat = CleanData($_POST['cat']);
$basket = new ShoppingBasket();
$basket->Add($_id,$_name, $_cat,$_price, $_qty);
?>
SHOPPING BASKET CLASS
<?php
class ShoppingBasket{
public function Add($id,$name,$cat,$price,$qty)
{
//1. Check if the session basket exists
if(!$_SESSION['basket']){
$item=array('id'=>$id,
'name'=>$name,
'cat'=>$cat,
'price'=>$price,
'qty'=>$qty,
'subtotal'=>$qty * $price);
//store the first item in the session
$_SESSION['basket'][$id]=$item;
//2. Check if the item exists in the basket session
} else if ($_SESSION['basket'][$id]) {
//update this item qty and subtotal
$_SESSION['basket'][$id]['qty']+=$qty;
$_SESSION['basket'][$id]['subtotal'] = $_SESSION['basket'][$id]['qty'] * $_SESSION['basket'][$id]['price'];
//3. Add new Item to existing basket
}else{
//group parameters to associative array
$item=array('id'=>$id,
'name'=>$name,
'cat'=>$cat,
'price'=>$price,
'qty'=>$qty,
'subtotal'=>$qty * $price);
//Add new item to existing basket
$_SESSION['basket'][$id]=$item;
}
}
}
?>
答案 0 :(得分:0)
尝试在add方法中合并条件的第一和第三种情况:
public function Add($id, $name, $cat, $price, $qty) {
//1. Check if the session basket exists or the item exists in basket
if (!$_SESSION['basket'] || !array_key_exist($id, $_SESSION["basket"])) {
$item = array('id' => $id,
'name' => $name,
'cat' => $cat,
'price' => $price,
'qty' => $qty,
'subtotal' => $qty * $price);
//store the item in the session
$_SESSION['basket'][$id] = $item;
} else {
//update this item qty and subtotal
$_SESSION['basket'][$id]['qty']+=$qty;
$_SESSION['basket'][$id]['subtotal'] = $_SESSION['basket'][$id]['qty'] * $_SESSION['basket'][$id]['price'];
}
}
另一件事。这真的很糟糕:
if(isset($_SESSION['basket'])) echo "SESSION EXISTS"; {
这意味着,如果$_SESSION["basket"]
存在,那么回应一些东西,这就是你的状况的结束。 (无论如何,现有代码会产生语法错误。)
您应该在if:
之后添加括号if(isset($_SESSION['basket'])) {
echo "SESSION EXISTS";
//.....
}
答案 1 :(得分:0)
我认为这是因为您使用来自db的产品ID索引篮子数组。
$_SESSION['basket'][$id]=$item;
如果您执行一些只是循环遍历数组的操作,这将无效:
foreach ($_SESSION['basket'] as $item){
//do something
}
因为您没有0作为ID的产品。循环从零开始,也许这就是问题。 我想也许你可以做这样的事情,但这不是优化的代码,我只是会尽快重新考虑解决方案。
foreach ($_SESSION['basket'] as $item){
if($item != array()){
//do something if the item is not an empty array
}
}
希望这有帮助
答案 2 :(得分:0)
删除了所有的javascript,只使用了普通的php。 jQuery load()函数一定存在问题,G Chrome我在另一个项目中有类似的东西会话会更新但不总是。它虽然很好用FF。