我试图更新添加到购物车会话的数量,但下面的代码只会增加第一项添加两次的数量,然后每当添加任何其他项目两次时执行合并,小孩帮助< / p>
$('.add-to-cart-mt').on('click', function(e){
e.preventDefault();
var id =$(this).attr('id');
$('#add-to-cat-dialog').dialog({
autoOpen:false,
modal:true,
hide:"pluff",
show:"slide",
height:200,
open: function() { $(".ui-dialog-titlebar-close").hide(); },
buttons:{
"Add":function (){
$('#add-to-cat-dialog').dialog("close");
$.ajax({
url: 'add_to_cart.php',
data: { productId : id },
success: function (data) {
$('.top-cart-contain').empty();
$('.top-cart-contain').load("header_cart_summary.php");
},
error :function (data, textStatus, jqXHR) { }
});
},
"Cancel":function (){
$(this).dialog("close");
}
}
});
$('#add-to-cat-dialog').dialog("open");
});
session_start();
require './database.php';
if(!empty($_GET["productId"])) {
$id=$_GET["productId"];
$productById = $connection->query("SELECT * FROM products WHERE productId='$id';");
if($productById && (mysqli_num_rows($productById)>0)){
echo 'query ok';
$productDetail= mysqli_fetch_assoc($productById);
$itemArray = array(
$productDetail["productId"]=>array(
'name'=>$productDetail["productName"],
'id'=>$productDetail["productId"],
'quantity'=>1,
'price'=>$productDetail["productPrice"],
'image'=>$productDetail["productsImage1"]
)
);
if(!empty($_SESSION["cart_item"])) {
if(in_array($productDetail["productId"],array_keys($_SESSION["cart_item"]))) {
foreach($_SESSION["cart_item"] as $k => $v) {
if($productDetail["productId"] == $k) {
if(empty($_SESSION["cart_item"][$k]["quantity"])) {
$_SESSION["cart_item"][$k]["quantity"] = 0;
}
$_SESSION["cart_item"][$k]["quantity"] += 1;
}
}
} else {
$_SESSION["cart_item"] = array_merge($_SESSION["cart_item"],$itemArray);
}
} else {
$_SESSION["cart_item"] = $itemArray;
}
//set product count in the bag
if(!empty($_SESSION['cart_volume'])){
$_SESSION['cart_volume'] += 1;
} else {
$_SESSION['cart_volume'] = 1;
}
}else {echo ''. mysqli_error($connection);}
} else {
echo 'no item';
}
[enter image description here][1]<li class="item col-lg-4 col-md-4 col-sm-6 col-xs-6 ">
<div class="product-item">
<div class="item-inner">
<div class="product-thumb has-hover-img">
<figure> <a title="Ipsums Dolors Untra" href="single_product.html"> <img class="first-img" src="./productImages/<?php echo $item['productsImage1']; ?>" style="height: 250px;" alt=""> <img class="hover-img" src="../images/products/img05.jpg" alt=""> </a></figure>
<div class="pr-info-area animated animate2"><a href="quick_view.html" class="quick-view"><i class="fa fa-search"><span>Quick view</span></i></a> <a href="wishlist.html" class="wishlist"><i class="fa fa-heart"><span>Wishlist</span></i></a> <a href="compare.html" class="compare"><i class="fa fa-exchange"><span>Compare</span></i></a> </div>
</div>
<div class="item-info">
<div class="info-inner">
<div class="item-title"> <h4><a title="Ipsums Dolors Untra" href="single_product.html"><?php echo $item['productName']; ?></a></h4> </div>
<div class="item-content">
<div class="rating"> <i class="fa fa-star-o"></i> <i class="fa fa-star-o"></i> <i class="fa fa-star-o"></i> <i class="fa fa-star-o"></i> <i class="fa fa-star-o"></i> </div>
<div class="item-price">
<div class="price-box">
<p class="special-price"> <span class="price-label">Special Price</span> <span class="price">Ksh. <?php echo number_format($item['productPrice'], 2) ; ?></span> </p>
<!--<p class="old-price"> <span class="price-label">Regular Price:</span> <span class="price"> $567.00 </span> </p>-->
</div>
</div>
<div class="pro-action">
<button type="button" class="add-to-cart-mt" id="<?php echo $item['productId']; ?>"> <i class="fa fa-shopping-cart"></i><span> Add to Cart</span> </button>
</div>
</div>
</div>
</div>
</div>
</div>
</li>
答案 0 :(得分:1)
查看PHP手册:PHP Manual - array_merge()
相关部分:
如果输入数组具有相同的字符串键,则后面的值 该密钥将覆盖前一个密钥。 但是,如果是数组 包含数字键,后面的值不会覆盖原始值 值,但会被追加。
带有数字键的输入数组中的值将重新编号 在结果数组中从零开始递增键。
可能您正在使用数字ID。如果是,则将此ID转换为与您需要的ID(productIDs)
不匹配的数字序列$itemArray = array(
$productDetail["productId"]=>array(
'name'=>$productDetail["productName"],
'id'=>$productDetail["productId"],
'quantity'=>1,
'price'=>$productDetail["productPrice"],
'image'=>$productDetail["productsImage1"]
)
);
在本地查看此代码:
$a = array('6' => array('name'=>'john','id'=>'6','quantity'=>1));
$b = array('7' => array('name'=>'bill','id'=>'7','quantity'=>1));
$c = array('8' => array('name'=>'mike','id'=>'8','quantity'=>1));
$d = array('6' => array('name'=>'lucy','id'=>'6','quantity'=>1));
$_SESSION["cart_item"] = array_merge($a, $b, $c, $d);
var_dump($_SESSION["cart_item"]);
unset($_SESSION["cart_item"]);
$a = array('six' => array('name'=>'john','id'=>'6','quantity'=>1));
$b = array('seven' => array('name'=>'bill','id'=>'7','quantity'=>1));
$c = array('eight' => array('name'=>'mike','id'=>'8','quantity'=>1));
$d = array('six' => array('name'=>'lucy','id'=>'6','quantity'=>1));
$_SESSION["cart_item"] = array_merge($a, $b, $c, $d);
var_dump($_SESSION["cart_item"]);
我的结果是:
/am.php:13:
array(4) {
[0] =>
array(3) {
'name' =>
string(4) "john"
'id' =>
string(1) "6"
'quantity' =>
int(1)
}
[1] =>
array(3) {
'name' =>
string(4) "bill"
'id' =>
string(1) "7"
'quantity' =>
int(1)
}
[2] =>
array(3) {
'name' =>
string(4) "mike"
'id' =>
string(1) "8"
'quantity' =>
int(1)
}
[3] =>
array(3) {
'name' =>
string(4) "lucy"
'id' =>
string(1) "6"
'quantity' =>
int(1)
}
}
/am.php:26:
array(3) {
'six' =>
array(3) {
'name' =>
string(4) "lucy"
'id' =>
string(1) "6"
'quantity' =>
int(1)
}
'seven' =>
array(3) {
'name' =>
string(4) "bill"
'id' =>
string(1) "7"
'quantity' =>
int(1)
}
'eight' =>
array(3) {
'name' =>
string(4) "mike"
'id' =>
string(1) "8"
'quantity' =>
int(1)
}
}
这显示了array_merge如何处理数字索引(至少使用PHP 7)。正如您所看到的,即使键入字符串的数字索引也会像数字一样处理,从而丢失了productIDs参考。
另一件事:你的代码容易受到SQL注入攻击:
$id=$_GET["productId"];
$productById = $connection->query("SELECT * FROM products WHERE productId='$id';");
在此处详细了解:PHP Manual - SQL Injection
答案 1 :(得分:0)
以下代码可以正常工作。感谢-Saleiro的投入。
[
if(!empty($_GET["productId"])) {
$id=intval($_GET["productId"]);
$productById = $connection->query("SELECT * FROM products WHERE productId='$id' ");
if($productById && (mysqli_num_rows($productById)>0)){
$productDetail= mysqli_fetch_assoc($productById);
$itemArray = array(intval($productDetail["productId"])=>array('name'=>$productDetail["productName"], 'id'=>intval($productDetail["productId"]), 'quantity'=>1, 'price'=>$productDetail["productPrice"]));
$found = false;
if(!empty($_SESSION["cart_item"])) {
foreach($_SESSION["cart_item"] as $k => $v) {
if($productDetail["productId"] == $v['id']) {
$found= true;
if(empty($_SESSION["cart_item"][$k]["quantity"])) {
$_SESSION["cart_item"][$k]["quantity"] = 0;
}
$_SESSION["cart_item"][$k]["quantity"] += 1;
break;
}
}
if(!$found) {
$_SESSION["cart_item"] = array_merge($_SESSION["cart_item"],$itemArray);
}
} else {
$_SESSION["cart_item"] = $itemArray;
}
}else {echo ''. mysqli_error($connection);}
if(!empty($_SESSION['cart_volume'])){
$_SESSION['cart_volume'] += 1;
} else {
$_SESSION['cart_volume'] = 1;
}
} else {
echo 'no item';
}