2

セッションを開始してその変数を作成するこの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']たが、値を取得するたびにシリアル化を解除するのは非常に面倒です。

誰か助けてもらえますか?

4

1 に答える 1

0

ForeachでDoStuffHere部分を処理しているときに問題があると思います。処理中に、これを確認できます。

foreach ($cart as $key => $data)
{
if(is_array($data)){}
}
于 2012-12-28T20:06:59.967 に答える