第一个项目未添加到会话中


First Item not being added to the session

我有一个非常基本的购物车。问题是除了列表中的第一项外,所有其他项目都工作正常。工作方式:

来自 db 的产品列表上都有一个按钮,该按钮附加到一个 JS 函数上,该按钮然后,使用"load"jQuery函数,它连接到一个PHP脚本,该脚本将产品添加到session['篮子']。我在JS函数中放置了一个警报,第一项(有问题的那一项)看起来不错。此外,如果在 php 页面中创建会话,则放置一个回显"会话存在"。第一个图标确实会创建一个会话,但不显示产品名称等数据。

任何帮助将不胜感激。

产品列表:

<?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>&pound;<?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>&pound;<?php echo $item['price'];?></td>
                              <td> <?php echo $item['qty'];?></td>
                              <td><a href="<?php echo $_SERVER['PHP_SELF'];?>?id=<?php echo $item['id'];?>&amp; action=remove">Eliminar</a></td>
                          <tr>
                      </table>
                         <?php $total+= $item['subtotal'];?>
                      <?php  } ?>
                    <h3> Total a pagar: <span style="color:#000000">&pound;<?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 脚本篮.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);
?>

购物篮类

<?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;
       }
    }
  }
?>

尝试在 add 方法中组合条件的第 1 种和第 3 种情况:

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";
    //.....
}
我认为

这是因为您使用来自数据库的产品 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
    }
}

希望这有帮助

删除了所有的javascript,只使用纯php。jQuery load() 函数和 G Chrome 一定有问题,我在另一个项目中也有类似的东西,会话会更新,但并非总是如此。不过它工作正常。