2015-05-02 62 views
4

我在做某件事时遇到问题。
我有这样的代码段产品添加到购物车:自动增加SESSION密钥ID

$product_id = isset($_GET['product_id']) ? $_GET['product_id'] : ""; 
$product_name = isset($_GET['product_name']) ? $_GET['product_name'] : ""; 

$sql = "SELECT * FROM products WHERE product_id LIKE '{$product_id}' AND product_name LIKE '{$product_name}' LIMIT 1"; 
$stmt = $connection->prepare($sql); 
$stmt->execute(); 

$num = $stmt->rowCount(); 

if($num == 1) 
{ 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
    { 
     extract($row); 
     if(!isset($_SESSION['cart'])) 
     { 
      $product_id_session = 1; 
     } 
     else 
     { 
      $count = count($_SESSION['cart']); 
      $product_id_session = $count++; 
     } 

     $columns = array 
     (
      'product_id_session' => $product_id_session, 
      'product_id' => $product_id, 
      'product_name' => $product_name, 
      'product_price' => $product_price   
     ); 
     $_SESSION['cart'][$product_id_session] = $columns;  
     redirect_to('products.php?&message=added&product_name='. $_SESSION['cart'][$product_id_session]['product_name']); 
    } 
} 

正如你可以看到,如果创建会话cart,我给你变$product_id_session与SESSION阵列加一的计数。否则,变量$product_id_session设置为1。在购物车页面我有一个链接删除所选产品:

foreach($_SESSION['cart'] as $product) 
{ 
    echo "<button onClick=\"location.href='remove.php?product_id_session={$product['product_id_session']}'\"> 
    Remove from cart 
    </button>"; 
} 

然后,在remove.php文件,我有这样的处理来自查询字符串的数据,并从车中移除产品:

$product_id_session = isset($_GET['product_id_session']) ? $_GET['product_id_session'] : ""; 
unset($_SESSION['cart'][$product_id_session]); 

我面临的问题是:例如,我在购物车中添加了两个产品。然后,我删除了第一个产品,并将另一个产品添加到购物车。新产品,而不是被添加,只是将取代以前在购物车中添加的产品,并且$product_id_session将始终具有相同的价值。我做错了什么?如何为SESSION指定一个ID?

+0

没有多大意义准备你的语句,如果你要直接在查询中注入用户提供的值,就像是一样:你有一个sql注入问题。 – jeroen

+0

@jeroen我只在数据库中匹配时才插入值。 – Dyan

回答

1

您可以添加新的项目到车只是:

$_SESSION['cart'][] = $columns; 

然后,它会被追加到结束的数组。

,并从阵列中删除项目后,你可以(但不是必要的)通过

$_SESSION['cart'] = array_values($_SESSION['cart']); 

当打印出来的车,您只需更新foreach循环抓住关键重新建立索引值转换成一些变量,即$ index。区别在于$ index => $ product部分。

foreach($_SESSION['cart'] as $index=>$product) 
{ 
    echo "<button onClick=\"location.href='remove.php?product_id_session={$index}'\"> 
    Remove from cart 
    </button>"; 
} 

Remove.php保持基本相同,我只是更新它更好的可读性:

if (isset($_GET['product_id_session']) and $_GET['product_id_session']) { 
    $product_id_session = $_GET['product_id_session']; 
    unset($_SESSION['cart'][$product_id_session]); 
} 
+0

感谢您的回答,但我需要使用'$ _SESSION ['cart'] [$ product_id_session]'因为我需要指定要删除哪个产品ID并取消设置*** remove.php中相应的SESSION数组***文件。 – Dyan

+0

我明白这一点。不过我不认为你需要将$ product_id_session保存在单独的字段中 - 该值已经存储为数组中的值的索引(键),您不需要在$ product_id_session中复制该数字。尝试在** remove.php **中使用'foreach($ _ SESSION ['cart'] as $ product_id_session => $ product)',并且您也会得到该结果。 –

+0

但没有这个我将如何取消设置相应的SESSION数组? – Dyan

0

而不是试图创建一个额外的ID来管理你的车,你应该仅仅依靠独特的产品ID已经存储在数据库中:

if($num == 1) { 
    $row = $stmt->fetch(PDO::FETCH_ASSOC); // no need for the loop as you only have 1 result 
    extract($row); 
    if(!isset($_SESSION['cart'])) { 
     $_SESSION['cart'] = array(); 
    } 
    // keep track of the added product for the time being 
    if (!isset($_SESSION['cart'][$product_id])) { 
     $columns = array(
      'product_id_session' => $product_id_session, 
      'product_id' => $product_id, 
      'product_name' => $product_name, 
      'product_price' => $product_price, 
      'amount' => 0, //just add last comma as good practise here 
     ); 
     $_SESSION['cart'][$product_id] = $columns; 
    } 
    //raise the amount 
    $_SESSION['cart'][$product_id]['amount']++; 
    redirect_to('products.php?&message=added&product_name='. $_SESSION['cart'][$product_id_session]['product_name']); 
} 

并相应地更改删除:

foreach($_SESSION['cart'] as $product) { 
    echo "<button onClick=\"location.href='remove.php?product_id={$product['product_id']}'\">Remove from cart</button>"; 
} 

编辑:

保持一个“独一无二”的ID,你不应该使用count计算ID 只需使用一个额外的变量来跟踪最后ID:

if(!isset($_SESSION['cart'])) 
    { 
     $_SESSION['cart'] = array(); 
     $_SERVER['cart_product_id'] = 1; 
    } 
    else 
    { 
     $_SERVER['cart_product_id']++; 
     $product_id_session = $_SERVER['cart_product_id']; 
    } 
+0

感谢您的答案。我正在做一个在线订购系统,所以用户可以多次添加相同的产品,因为我有一个添加系统。我需要通过指定该SESSION数组的ID来完成此操作。 – Dyan

+0

这就是为什么我在数组中添加'amount'以跟踪同一产品的multipe订单 – DarkBee

+0

我不能将'product_id'作为ID来删除产品,因为我可以有多个购物车页面中的产品具有相同的ID。 – Dyan