-1

我有一个用于预订产品的预订车,在某些时候,用户可以从他们的购物车中删除特定产品。

我需要帮助从会话数组中删除产品,因为我在尝试删除产品时不断收到错误消息“致命错误:无法取消设置字符串偏移”。

这是删除的代码

    <?php

if(isset($_GET['inh_arr_key']) && isset($_GET['c_id'])) {

$inh_arr_key = $_GET['inh_arr_key'];
$del_c_id = $_GET['c_id'];

unset($_SESSION['inh_cart'][$inh_arr_key]);


$inh_cart = $_SESSION['inh_cart'];

// Parse the cart session variable
$inh_arr = explode(',',$inh_cart);  

if (array_key_exists($inh_arr_key, $inh_arr)) {
    echo '<p class="err_msg">Unable to delete selected course from your In-house course booking cart.</p>';
}
else{

$del_inh_query_course_info = @mysql_query("select * from inhouse_prod where id='".$del_c_id."'");
$del_inh_course_det = @mysql_fetch_assoc($del_inh_query_course_info);   
$del_inh_course_title = $del_inh_course_det['title'];

    echo '<p class="ok_msg"><strong>'.$ex_inh_course_title.'</strong> has been deleted from your In-house course booking cart.</p>';    
}

}



?>

我已经获取并附加了每个产品数组键和值。所以这是由 $_GET 检索的,它们在这些变量中

$inh_arr_key = $_GET['inh_arr_key'];
$del_c_id = $_GET['c_id'];

只是为了提供有关该问题的更多详细信息,这里是将产品添加到购物车的代码,它工作正常

<?php



$c_id = $_GET['c_id'];

session_name("inh_cart");

session_start();

$inh_cart = $_SESSION['inh_cart'];
if ($inh_cart) {

$get_inh_arr = explode(',',$inh_cart);

if(in_array($c_id, $get_inh_arr)){ 
$inh_cart = $inh_cart;

?>
    <script language="javascript">
    window.location = "user_allc_booking.php?ex_inh_cid=<?php echo $c_id; ?>";
    </script>
<?php

}
else {
$inh_cart .= ','.$c_id;
}


} else {
$inh_cart = $c_id;
}
$_SESSION['inh_cart'] = $inh_cart;


?>
    <script language="javascript">
    window.location = "user_allc_booking.php";
    </script>
<?php



$inh_query_course_info = @mysql_query("select * from inhouse_courses where id='".$c_id."'");
$inh_course_det = array();
$inh_course_det = @mysql_fetch_assoc($inh_query_course_info);   
$inh_course_title = $inh_course_det['title'];




?>

如果例如购物车包含 3 个产品,如果我执行 var_dump($_SESSION['inh_cart']);

输出将是:

string(8) "20,48,24"

真的需要删除产品的代码有什么问题。需要帮助。谢谢!

4

3 回答 3

2

由于某种原因,此时它似乎$_SESSION['inh_cart']是一个字符串,因此它试图取消设置$inh_arr_key不允许的字符串索引处的字符。

看起来你把它作为一个逗号分隔的列表......所以为了做你的 unset,你需要在调用 unset 之前爆炸它。

但这是一种不好的方法。在混淆索引方面,你留下了很大的错误空间。你应该把它变成一个数组,让 php 序列化/反序列化它作为正常会话行为的一部分。此外,不要对键使用通用的有序数字索引,而是使用每个产品独有的东西,例如 SKU 或数据库记录中的主键。

所以把它放在一起...

将东西添加到购物车:

$c_id = $_GET['c_id'];

session_name("inh_cart");

session_start();

if(!isset($_SESSION['inh_cart']) {
  // if we dont have a cart - initialize it as an array
  $_SESSION['inh_cart'] = array();
}

$inh_cart &= $_SESSION['inh_cart'];

if(in_array($c_id, $inh_cart)): ?> 
    <script language="javascript">
       window.location = "user_allc_booking.php?ex_inh_cid=<?php echo $c_id; ?>";
    </script>
<?php else: 

   // just append the item to the array 
   $inh_cart[] = .$c_id;

endif; ?>

<script language="javascript">
    window.location = "user_allc_booking.php";
</script>

<?php

// not sure what youre trying to do here but ok...
$inh_query_course_info = @mysql_query("select * from inhouse_courses where id='".$c_id."'");
$inh_course_det = array();
$inh_course_det = @mysql_fetch_assoc($inh_query_course_info);   
$inh_course_title = $inh_course_det['title'];

?>

然后从购物车中删除:

<?php
// all processing at the top - easier to read -
// use the $error variable to tell what message to display
$error = false;

if(!isset($_GET['c_id'])) {
  $error = true;
} else {

  $del_c_id = $_GET['c_id'];
  $del_key = array_search($del_c_id, $_SESSION['inh_cart']);


  if($del_key) {
      unset($_SESSION['inh_cart'][$delkey]);

      // get the course info
      $del_inh_query_course_info = @mysql_query("select * from inhouse_prod where id='".$del_c_id."'");
      $del_inh_course_det = @mysql_fetch_assoc($del_inh_query_course_info);   
      $del_inh_course_title = $del_inh_course_det['title'];
  } else {
     $error = true;
  }
}
?>

<?php if($error): ?>
    <p class="err_msg">Unable to delete selected course from your In-house course booking cart.</p>
<?php else: ?>
    <p class="ok_msg"><strong> <?php echo $ex_inh_course_title ?></strong> has been deleted from your In-house course booking cart.</p>
<?php endif; ?>
于 2012-12-14T17:42:26.153 回答
1

我的猜测是你的错误在这里:

unset($_SESSION['inh_cart'][$inh_arr_key]);

您似乎有一个逗号分隔的值作为$_SESSION['inh_cart']. 它是一个字符串,而不是一个数组。因此,您[]在字符串上使用语法本质上是在执行以下操作:

unset `$_SESSION['inh_cart']` at position starting at [some string value] ($inh_arr_key)

当然,该字符串没有 [some string value] 的偏移量,因为它的偏移量是严格的数字。

您需要使用 '$_SESSION['inh_cart']` 作为数组。

此外,您可能不想通过$_GET. 这是一个非常糟糕的主意,因为当有人使用前进/后退按钮浏览您的网站时,他们会(在他们的脑海中随机地)看到他们的购物车发生了变化。

于 2012-12-14T17:48:53.043 回答
0

您可以尝试确保密钥存在。

if (array_key_exists($inh_arr_key, $_SESSION['inh_cart'])) {
    unset($_SESSION['inh_cart'][$inh_arr_key]);
}

根据@prodigitalson 确保$_SESSION['inh_cart']数组不是字符串。

于 2012-12-14T17:41:55.093 回答