第一项未添加到会话中

时间:2014-12-03 13:52:34

标签: php jquery session

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

来自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>&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 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;

       }

    }
  }
?>

3 个答案:

答案 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。