配列をCookieに保存する適切な方法は? PHPコード例:
$number_ticket=2;
$info[7][5]=1;
$info[8][5]=1;
データのシリアル化:
setcookie('cookie', serialize($info), time()+3600);
次に、データのシリアル化を解除します。
$data = unserialize($_COOKIE['cookie'], ["allowed_classes" => false]);
データの後、$ infoと$ dataのコンテンツは同じになります。
配列値をcookieに保存するには、まずそれらを文字列に変換する必要があるため、いくつかのオプションがあります。
コードを保存する
setcookie('your_cookie_name', json_encode($info), time()+3600);
コードを読む
$data = json_decode($_COOKIE['your_cookie_name'], true);
JavaScriptを使用してフロントエンドでCookieを読み取る必要がある場合にも、JSONを選択することをお勧めします。
実際には、配列を文字列に変換し、文字列を元に戻すencrypt_array_to_string
/decrypt_array_from_string
メソッドグループを使用できます。 同じ アレイ。たとえば、整数の配列にexplode
/implode
を使用することもできます。
PHP.netから
Do not pass untrusted user input to unserialize().
-Cookieを含むHTTPで送信されるものは信頼できません。
セキュリティに関連する参考資料
setcookie('my_array[0]', 'value1' , time()+3600);
setcookie('my_array[1]', 'value2' , time()+3600);
setcookie('my_array[2]', 'value3' , time()+3600);
$_COOKIE
変数を出力すると、次のように表示されます
echo '<pre>';
print_r( $_COOKIE );
die();
Array ( [my_array] => Array ( [0] => value1 [1] => value2 [2] => value3 ) )
これはPHP機能として文書化されています。
PHP.netから
Cookies names can be set as array names and will be available to your PHP scripts as arrays but separate cookies are stored on the user's system.
Cookieでシリアライズおよびアンシリアライズを使用すると、セキュリティ上のリスクがあります。ユーザー(または攻撃者)はCookieデータを変更できます。Cookieデータを非シリアル化すると、サーバーでPHPコードが実行される可能性があります。 Cookieデータは信頼できません。代わりにJSONを使用してください!
PHPのサイト から:
allowed_classesの
options
値に関係なく、信頼できないユーザー入力をunserialize()
に渡さないでください。シリアル化を解除すると、オブジェクトのインスタンス化と自動読み込みによりコードが読み込まれて実行される可能性があり、悪意のあるユーザーがこれを悪用する可能性があります。シリアル化されたデータをユーザーに渡す必要がある場合は、JSONなどの安全な標準データ交換形式(json_decode()
およびjson_encode()
を使用)を使用します。
Cookieは基本的にテキストであるため、JSON文字列としてエンコードして配列を保存できます(json_encode
を参照)。ただし、保存できる文字列の長さに制限があることに注意してください。
serialize()
を試してください。配列を文字列形式に変換します。その後、 unserialize()
を使用して配列に戻すことができます。 WordPressなどのスクリプトは、これを使用して複数の値を単一のデータベースフィールドに保存します。
Robが言ったようにjson_encode()
を使用することもできます。これは、JavaScriptでCookieを読みたい場合に役立つかもしれません。
異なるCookieに異なる要素を書き込むこともできます。 Cookie名は配列名として設定でき、PHPスクリプトで配列として使用できますが、ユーザーのシステムには別のCookieが保存されます。 explode()を検討して、1つのCookieに複数の名前と値を設定します。この目的でserialize()を使用することはお勧めしません。セキュリティホールが発生する可能性があるためです。詳細については、 setcookie PHP関数をご覧ください
必要なものが見つかりました。これで、訪問した製品をCookieに保存し、後でサイトに戻ったときに表示することができます。
// set the cookies
setcookie("product[cookiethree]", "cookiethree");
setcookie("product[cookietwo]", "cookietwo");
setcookie("product[cookieone]", "cookieone");
// after the page reloads, print them out
if (isset($_COOKIE['product'])) {
foreach ($_COOKIE['product'] as $name => $value) {
$name = htmlspecialchars($name);
$value = htmlspecialchars($value);
echo "$name : $value <br />\n";
}
}
最近、クライアント用にこのコードを作成しました。このコードでCookieに配列を使用しています。実際、このコードは、Cookieを使用してユーザーが最近閲覧したページを取得します。
function curPageURL() { // get url
return 'http' . ((
!empty($_SERVER['HTTPS']) &&
$_SERVER['HTTPS'] !== 'off' ||
$_SERVER['SERVER_PORT'] == 443
) ? 's' : '') . '://' . $_SERVER['SERVER_NAME'] . (
$_SERVER['SERVER_PORT'] == 80 ? '' : $_SERVER['SERVER_PORT']
) . $_SERVER['REQUEST_URI'];
}
$currentPage = curPageURL(); // call function
$counter = $_COOKIE['_counter']; // set counter variable
if(!$_COOKIE['_PAGES']){ // if _Pages cookie
$default = 1; // set default value to 1
setcookie("_counter",$default,time()+7200); // set counter cookie
setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie
}
else{ // if ! _Pages cookie
$default = $counter+1; // set default value to +1
setcookie("_counter",$default,time()+7200); // set counter cookie
}
if(@in_array($currentPage, @$_COOKIE['_PAGES'])){ // if same url found
}
else{ // if new url found
setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie
}
if($_COOKIE['_PAGES']){
foreach ($_COOKIE['_PAGES'] as $value){
echo "<a href='{$value}'>{$value}</a>";
}
}