Tablice w plikach cookie PHP

Jak prawidłowo przechowywać tablicę w pliku cookie? w PHP Przykład kodu:

$number_ticket=2;
$info[7][5]=1;
$info[8][5]=1;
Author: Marty Aghajanyan, 2012-01-27

8 answers

Serializacja danych:

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

Następnie unserialize danych:

$data = unserialize($_COOKIE['cookie']);

Po danych, $info i $ data będą miały tę samą zawartość.

 65
Author: Narcis Radu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-02 18:31:58

Aby zapisać wartości tablicy w pliku cookie, najpierw musisz przekonwertować je na ciąg znaków, więc oto kilka opcji.

Zapisywanie plików cookie jako JSON

Zapisywanie kodu

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

Odczyt kodu

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

JSON może być dobry, wybierz również, jeśli potrzebujesz czytać cookie z przodu z JavaScript.

Właściwie możesz użyć dowolnego encrypt_array_to_string/decrypt_array_from_string grupa metod, które przekonwertują tablicę na łańcuch i konwertują łańcuch z powrotem na tę samą tablicę. Na przykład możesz również użyć explode/implode dla tablicy liczb całkowitych.

Uwaga: nie używaj serialize / unserialize

Od PHP.net

Tutaj wpisz opis obrazka

Do not pass untrusted user input to unserialize(). - wszystko, co przychodzi przez HTTP, w tym pliki cookie, jest niezaufane!

Referencje związane z alternatywnym rozwiązaniem, można to zrobić również bez konwersji tablicy na ciąg znaków.

setcookie('my_array[0]', 'value1' , time()+3600);
setcookie('my_array[1]', 'value2' , time()+3600);
setcookie('my_array[2]', 'value3' , time()+3600);

I po wyświetleniu zmiennej $_COOKIE zobaczysz następujący

echo '<pre>';
print_r( $_COOKIE );
die();
Array
(   
    [my_array] => Array
        (
            [0] => value1
            [1] => value2
            [2] => value3
        )

)

Jest to udokumentowana funkcja PHP.

Od 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.

 81
Author: Marty Aghajanyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 13:14:46

Używanie serialize i unserialize na plikach cookie stanowi zagrożenie bezpieczeństwa. Użytkownicy (lub atakujący) mogą zmieniać dane cookie, a gdy je anulujesz, może uruchomić kod PHP na twoim serwerze. Dane Cookie nie powinny być zaufane. Użyj JSON zamiast!

Ze strony PHPs...

Nie przekazuje niezaufanych danych użytkownika do unserialize (). Unserializacja może spowodować załadowanie i wykonanie kodu z powodu tworzenia instancji obiektu i automatycznego ładowania, a szkodliwy użytkownik może być w stanie to wykorzystać. Użyj sejfu, standardowy format wymiany danych, taki jak JSON (poprzez json_decode () i json_encode ()), jeśli chcesz przekazać serializowane dane użytkownikowi.

 13
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-05 15:44:07

Spróbuj serialize(). Konwertuje tablicę do formatu string, można wtedy użyć unserialize() Aby przekonwertować go z powrotem do tablicy. Skrypty takie jak WordPress używają tego do zapisywania wielu wartości w jednym polu bazy danych.

Możesz również użyć json_encode(), Jak powiedział Rob, co może być przydatne, jeśli chcesz przeczytać plik cookie w javascript.

 6
Author: Dunhamzzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-27 10:40:25

Pliki cookie są w zasadzie tekstowe, więc możesz zapisać tablicę, kodując ją jako łańcuch JSON(zobacz json_encode). Należy jednak pamiętać, że istnieje ograniczenie długości łańcucha, który można przechowywać.

 5
Author: Rob Agar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-27 10:39:51

Możesz również spróbować zapisać różne elementy w różnych plikach cookie. Nazwy plików cookie mogą być ustawione jako nazwy tablic i będą dostępne dla skryptów PHP jako tablice, ale oddzielne pliki cookie są przechowywane w systemie użytkownika. Rozważ explode (), aby ustawić jeden plik cookie z wieloma nazwami i wartościami. Nie zaleca się używania w tym celu metody serialize (), ponieważ może to spowodować powstanie luk w zabezpieczeniach. Zobacz setcookie funkcja PHP po więcej szczegółów

 2
Author: Elzo Valugi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 18:23:38

Ostatnio stworzyłem ten kod dla mojego klienta, używam array for cookie w tym kodzie, właściwie ten kod pobiera Ostatnio oglądane strony przez Użytkownika za pomocą Plików cookie, mam nadzieję, że ci pomoże...!

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>";
} 
}
 1
Author: Shakeel Memon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-14 20:10:55

Właśnie znalazłem coś potrzebnego. Teraz mogę przechowywać produkty odwiedzane na plikach cookie i pokazywać je później, gdy wrócą na stronę.

// 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
Author: Võ Minh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 15:13:01