1

ショッピング カートを作成し、Cookie を使用してカートの内容を JSON オブジェクトに保存しています。

各ページで Javascript を使用して、Cookie を取得し、JSON を解析して各行を反復処理し、説明されている商品をバスケットの概要に表示する必要があります。

各位置の指定の記録がある場合、なぜそれをクッキーに保存する必要があるので、配列でキーを使用しないことにしました。それは賢明な考えだと思いましたが、今ではすべての検索で、キーを使用するための提案が表示されます。

これは JSON のサンプルです。

{
   "9999.9999":["CentOS6",2,"0.5",150,"23.90"],
   "0002.0004":["Support5","","3",5,"12.99"],
   "9999.9999":["UbuntuServer12.04LTS",1,"1",220,"42.60"]
}

たとえば、次のように、2 番目のレコードの「価格」(各行の最後のフィールドにあります) にアクセスできると期待していました。

basket = JSON.parse(basket);
price = basket[1][4];

それはうまくいかないようです。

この質問には、実際には 2 つの部分があります。

  1. バスケットから直接値を選択する方法は?
  2. それを反復処理して、各行を順番に操作できるようにする方法は?

最初のフィールドについて疑問がある場合に備えて。それが商品のSKUです。「9999.9999」が 2 つある理由は、それが予約番号であり、製品が「カスタム」製品 (カタログ アイテムを直接参照していない) であることを示しているためです。

アップデート

以下の@Samerの回答に基づいて、次のように配列を使用するようにコードを更新しました。

JSON は次のようになります。

[
   ["9999.9999","CentOS6",2,"0.5",150,"23.90"],
   ["0002.0004","Support5","","3",5,"12.99"],
   ["9999.9999","UbuntuServer12.04LTS",1,"1",220,"42.60"]
]

私は今、次のようにクッキーからアクセスしようとしています:

var basket = readCookie('basket');
basket     = JSON.parse(basket);
alert( 'Price of item 2 =' + basket[1][5] );

ただ、「アイテム 2 の価格 = 12.99」という警告の代わりに、「アイテム 2 の価格 = 未定義」が表示されます。

私は何が間違っていたのだろうか?

更新 2

これにはまだ問題があります。データを Cookie に取り込む方法を説明する必要があるかもしれません。

Cookie の配列は、PHP (カスタム アイテムを追加する場合) を使用してサーバー上で更新するか、カタログ アイテムを追加する場合に Javascript を使用してクライアント側で更新できます。

現在、私はサーバーサイドで追加されたアイテムに集中しています。次のコードを使用して Cookie を追加しています。

<?
extract($_POST, EXTR_SKIP);

// Get contents of existing basket (if any) minus last ']'
// so that it's ready to be added to.

if (isset($_COOKIE['basket'])) {

    $basket = json_decode($_COOKIE['basket']);
    $chars = strlen($basket)-1;
    //echo "<pre>".var_dump($basket)."</pre>";

    $cookieVal = substr($basket, 0, $chars);

    $cookieVal .= ",
    [\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]";

    $cookieVal = json_encode($cookieVal);
    /*
     * Sample format
     * 
    [["9999.9999","CentOS6",2,"0.5",150,"23.90"],
    ["0002.0004","Support5","","3",5,"12.99"],
    ["9999.9999","UbuntuServer12.04LTS",1,"1",220,"42.60"]]
     * 
     */

} else {

    $cookieVal = json_encode("[[\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]");

}

$exp = time()+3600; // sets expiry to 1 hour;
setcookie ( 'basket' , $cookieVal, $exp, '/' );

次に、Cookieを読み取るためのクライアント側です。これは、ページが読み込まれたときに呼び出されます。

function initBasket() {

    var basket = readCookie('basket');

    if (isJSON(basket)) {

        // We'll populate the basket

        basket = JSON.parse(basket);
        alert(basket[1][5]);

    } else {

        $('#sList').html('Your basket is empty.');
        return;

    }

}

更新 3 ついに機能しました。ご協力いただきありがとうございます。

コードが他の人に役立つかもしれないので、以下に最終的なコードを含めました。

PHP:

if (isset($_COOKIE['basket'])) {

    $cookieVal      = json_decode($_COOKIE['basket']);
    $cookieVal[]    = array
                        (
                            "9999.9999",
                            $sltOS,
                            $vcpuPoints,
                            $ramPoints,
                            $storagePoints,
                            $baseServerCostMonthUSD
                        );
    $cookieVal      = json_encode($cookieVal);

} else {

    $cookieArr[]    = array
                        (
                            "9999.9999",
                            $sltOS,
                            $vcpuPoints,
                            $ramPoints,
                            $storagePoints,
                            $baseServerCostMonthUSD
                        );
    $cookieVal      = json_encode($cookieArr);

}

// Save VPS choice in basket cookie
$exp = time()+3600; // sets expiry to 1 hour;
setcookie ( 'basket' , $cookieVal, $exp, '/' );

Javascript:

function initBasket() {

    var basket = readCookie('basket');

    if (isJSON(basket)) {

        // We'll populate the basket
        basket = JSON.parse(basket);
        alert(basket[1][5]);

    } else {

        $('#sList').html('Your basket is empty.');
        return;

    }

}
4

3 に答える 3

0

問題は PHP にあります。配列を 2 回 json_encode します。

ここでは、一度手動でエンコードしました:

$cookieVal .= ", [\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]";

次に、ここでもう一度実行します。

$cookieVal = json_encode($cookieVal);

その結果、jsonをjavascriptで解析すると文字列が得られます。は文字列であり、文字であるため、明らかに、secondbasket[1][4]は未定義の値を返します。basketbasket[1]

firebug やその他のデバッグ ユーティリティを使用して、各ステップで取得したデータを確認すると役立ちます。

そう。PHP で配列の配列を作成し、それを (1 回) json_encode するだけで、js が機能するはずです。

于 2013-07-29T07:10:20.303 に答える