この方法で複数の値を 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の内容を読み取って変数に割り当てると、自動的に配列に変換されます。