-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 や DB レコードの主キーなど、各製品に固有のものを使用します。

それでまとめて…

カートに商品を追加する:

$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)

もちろん、オフセットは厳密に数値であるため、その文字列には[何らかの文字列値]のオフセットはありません。

'$_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 に答える