Массивы в куки PHP - PullRequest
       3

Массивы в куки PHP

55 голосов
/ 27 января 2012

Как правильно хранить массив в куки? в PHP Пример кода:

$number_ticket=2;
$info[7][5]=1;
$info[8][5]=1;

Ответы [ 8 ]

96 голосов
/ 01 марта 2014

Чтобы сохранить значения массива в cookie, сначала нужно преобразовать их в строку, поэтому здесь есть несколько вариантов.

Хранение файлов cookie в формате JSON

Хранение кода

setcookie('your_cookie_name', json_encode($info), time()+3600);

Чтение кода

$data = json_decode($_COOKIE['your_cookie_name'], true);

JSON также может быть удачным выбором, если вам нужно прочитать cookie в интерфейсе JavaScript.

На самом деле вы можете использовать любую группу методов encrypt_array_to_string / decrypt_array_from_string, которая преобразует массив в строку и преобразует строку обратно в такой же массив. Например, вы также можете использовать explode / implode для массива целых чисел.

Предупреждение: не использовать сериализацию / десериализацию

Из PHP.net

enter image description here

Do not pass untrusted user input to unserialize(). - Все, что приходит по 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();
<b>Array
(   
    [my_array] => Array
        (
            [0] => value1
            [1] => value2
            [2] => value3
        )

)</b>

Это документированная функция 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.

66 голосов
/ 27 января 2012

Сериализация данных:

setcookie('cookie', serialize($info), time()+3600);

Затем десериализовать данные:

$data = unserialize($_COOKIE['cookie'], ["allowed_classes" => false]);

После данных $ info и $ data будут иметь одинаковое содержимое.

13 голосов
/ 05 ноября 2013

Использование сериализации и десериализации для файлов cookie представляет угрозу безопасности. Пользователи (или злоумышленники) могут изменять данные cookie, а затем, когда вы их не сериализуете, они могут запускать код PHP на вашем сервере. Данные cookie не должны быть доверенными. Вместо этого используйте JSON!

С PHP сайта :

Не передавайте ненадежные пользовательские данные в unserialize() независимо от значения options allow_classes . Несериализация может привести к загрузке и выполнению кода из-за создания объектов и автозагрузки, и злоумышленник может использовать это. Используйте безопасный стандартный формат обмена данными, такой как JSON (через json_decode() и json_encode()), если вам нужно передать сериализованные данные пользователю.

6 голосов
/ 27 января 2012

Попробуйте serialize().Он преобразует массив в строковый формат, затем вы можете использовать unserialize(), чтобы преобразовать его обратно в массив.Сценарии, подобные WordPress, используют это для сохранения нескольких значений в одном поле базы данных.

Вы также можете использовать json_encode(), как сказал Роб, что может быть полезно, если вы хотите прочитать cookie в javascript.

5 голосов
/ 27 января 2012

Cookies - это в основном текст, поэтому вы можете хранить массив, кодируя его как строку JSON (см. json_encode)Имейте в виду, что есть ограничение на длину строки, которую вы можете сохранить.

2 голосов
/ 27 января 2012

Вы также можете попытаться записать разные элементы в разные файлы cookie. Имена файлов cookie могут быть заданы как имена массивов и будут доступны для ваших сценариев PHP как массивы, но отдельные файлы cookie хранятся в системе пользователя. Рассмотрим explode (), чтобы установить один cookie с несколькими именами и значениями. Для этой цели не рекомендуется использовать serialize (), поскольку это может привести к дырам в безопасности. Посмотрите на setcookie PHP функцию для более подробной информации

0 голосов
/ 07 сентября 2018

Просто нашел нужную вещь. Теперь я могу хранить продукты, посещенные в файлах 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";
    }
}
0 голосов
/ 14 декабря 2015

недавно я создал этот код для своего клиента, в этом коде я использую массив для файлов 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>";
} 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...