セッションを開始してその変数を作成するこのPHPスクリプトがあります。コードスニペットは次のとおりです。
<?php
session_start();
if (!is_array($_SESSION['cart'])) $_SESSION['cart'] = array();
$id = 10;
$_SESSION['cart'][$id] = array( 'cod' => 'ABC', 'price' => '80', 'status' => 'active' );
header('Location: http://www.example.com/checkout.php');
?>
print_rを使用して$_SESSION配列を出力すると、次のようになります。
Array (
[cart] => Array (
[136] => Array (
[cod] => ABC
[price] => 80
[status] => active
)
)
)
これはうまく機能します。ユーザーセッションが作成され、そのすべての変数が適切に設定され、その後、ユーザーはキューチェックアウトページにリダイレクトされます。
ただし、問題があります。ユーザーがqueチェックアウトページに到達すると、すべてが正常に表示されます。コードスニペットを参照してください。
<?php
session_start();
print_r($_SESSION);
?>
上記のprint_rの出力は、これまでに見たものとまったく同じです。配列は他の配列で埋められています。素晴らしい!しかし、ここから奇妙な部分が始まります。任意のセッション変数を使用して別の変数の値として設定すると、セッションデータが失われます。見てみな:
<?php
session_start();
print_r($_SESSION);
$cart = $_SESSION['cart'];
foreach ($cart as $key => $data) : // if I use foreach($_SESSION['cart'] as $key => $data) will be the same thing
/*** Do stuff here ***/
endforeach;
?>
上記のprint_rの出力は次のとおりです。
Array (
[cart] => Array (
[cod] => ABC
[price] => 80
[status] => active
)
)
実際、スクリプトで変数値を使用せずに出力するだけであれば、すべて問題ありません。しかし、スクリプトのどこかで変数を使用すると(print_rスニペットを配置した後でも)、セッション変数はそのデータの一部を失いました。
変数をシリアル化しようとしまし$_SESSION['cart']
たが、値を取得するたびにシリアル化を解除するのは非常に面倒です。
誰か助けてもらえますか?