1

この方法で複数の値を cookie に設定できることを知っています。

If you want to write more than one value to the cookie at a time,
    you can pass an array:

$this->Cookie->write('User',
    array('name' => 'Larry', 'role' => 'Lead')
);

いくつかの設計上の問題により、コントローラー アクションのさまざまな部分で Cookie 値を設定する必要があります。しかし、この最小化されたコードは機能しないようです:

public function myfunction() {
    $text = "";
    // to be sure that this cookie doesn't exist
    $this->Cookie->delete('mycookie');
    // getting data from cookie, result is NULL
    $data = $this->Cookie->read('mycookie');
    $text .= "data 1 type: ".gettype($data)."<br>";
    $key="mike";
    $value=12;
    // adding key-value to cookie
    $data[$key] = $value;
    // serializing and writing cookie
    $dataS = json_encode($data);
    $this->Cookie->write('mycookie', $dataS, FALSE, '10 days');

    // reading cookie again, but this time result is
    // string {"mike":12} not an array
    $data = $this->Cookie->read('mycookie');
    $text .= "data 2 type: ".gettype($data)."<br>";
    $key="john";
    $value=20;
    // Illegal string offset error for the line below
    $data[$key] = $value;
    $dataS = json_encode($data);
    $this->Cookie->write('mycookie', $dataS, FALSE, '10 days');

    echo $text;

}

ページ出力:

Warning (2): Illegal string offset 'john' [APP/Controller/MyController.php, line 2320]  
data 1 type: NULL   
data 2 type: string  

上記のコードから、「Mike 12」が正常に Cookie に設定されます。しかし、Cookie データを 2 回目に読み取ると、次のような文字列が得られます{"mike":12}。配列ではありません。

「データ2」を作成するgettypeと、出力は「文字列」になります。
したがって、文字列ではなく配列であるため、作成する$data["john"]=20と取得できます。Illegal string offset error$data

アクションで同じ Cookie を 1 つずつ設定することはできませんか?

編集: データ配列を作成すると、その配列を json_encode し、その内容を Cookie に書き込みます。次に、別のコントローラーで、そのCookieの内容を読み取って変数に割り当てると、自動的に配列に変換されます。

4

1 に答える 1