web-dev-qa-db-fra.com

Tableaux dans les cookies PHP

Comment est la bonne façon de stocker un tableau dans un cookie? en PHP Exemple de code:

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

Sérialiser les données:

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

Puis désérialiser les données:

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

Après data, $ info et $ data auront le même contenu.

67
Narcis Radu

Pour stocker les valeurs du tableau dans un cookie, vous devez d’abord les convertir en chaîne. Voici quelques options.

Stockage des cookies en JSON

Code de stockage

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

Code de lecture

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

JSON peut être utile aussi si vous avez besoin de lire un cookie avec JavaScript.

En fait, vous pouvez utiliser n’importe quel groupe de méthodes encrypt_array_to_stringdecrypt_array_from_string qui convertira un tableau en chaîne et reconvertira chaîne en même array . Par exemple, vous pouvez également utiliser explode/implode pour un tableau d'entiers.

Attention: ne pas utiliser sérialiser/désérialiser

De PHP.net

 enter image description here

Do not pass untrusted user input to unserialize(). - Tout ce qui arrive par HTTP, y compris les cookies, n'est pas fiable! 

_/Références relatives à la sécurité

Comme solution alternative, vous pouvez également le faire sans convertir un tableau en chaîne.

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

Et après, si vous imprimez la variable $_COOKIE, vous verrez ce qui suit

echo '<pre>';
print_r( $_COOKIE );
die();
Tableau 
 (
 [My_array] => Tableau 
 (
 [0] => valeur1 
 [1] => valeur2 
 [2] => valeur3 
)

)

Ceci est documenté PHP.

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

84
Marty Aghajanyan

L'utilisation de la sérialisation et de la désérialisation sur les cookies constitue un risque pour la sécurité. Les utilisateurs (ou les attaquants) peuvent modifier les données des cookies. Lorsque vous les désérialisez, ils peuvent exécuter du code PHP sur votre serveur. Les données des cookies ne doivent pas être approuvées. Utilisez JSON à la place!

Du site PHP ...

Ne transmettez pas les entrées utilisateur non fiables à unserialize (). La désérialisation peut entraîner le chargement et l'exécution du code en raison de l'instanciation et du chargement automatique des objets. Un utilisateur malveillant peut alors l'exploiter. Utilisez un format d'échange de données standard sûr, tel que JSON (via json_decode () et json_encode ()) si vous devez transmettre des données sérialisées à l'utilisateur.

13
Nathan

Essayez serialize() . Il convertit un tableau en format chaîne, vous pouvez ensuite utiliser unserialize() pour le reconvertir en tableau. Les scripts tels que WordPress utilisent cela pour enregistrer plusieurs valeurs dans un seul champ de base de données.

Vous pouvez également utiliser json_encode() comme Rob l'a dit, ce qui peut être utile si vous voulez lire le cookie en javascript.

6
Dunhamzzz

Les cookies sont essentiellement du texte, vous pouvez donc stocker un tableau en l'encodant sous forme de chaîne JSON (voir json_encode). Sachez qu'il existe une limite à la longueur de la chaîne que vous pouvez stocker. 

5
Rob Agar

Vous pouvez également essayer d'écrire différents éléments dans différents cookies. Les noms de cookies peuvent être définis en tant que noms de tableaux et seront disponibles pour vos scripts PHP en tant que tableaux, mais des cookies distincts sont stockés sur le système de l'utilisateur. Explodez () pour définir un cookie avec plusieurs noms et valeurs. Il n'est pas recommandé d'utiliser serialize () à cette fin, car cela peut entraîner des failles de sécurité. Regardez la fonction setcookie PHP pour plus de détails.

2
Elzo Valugi

récemment, j'ai créé ce code pour mon client, j'utilise un tableau pour les cookies dans ce code. En fait, ce code reçoit les pages récemment consultées par l'utilisateur à l'aide de cookies. J'espère que cela vous aidera ...!

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
Shakeel Memon

Je viens de trouver la chose nécessaire. Maintenant, je peux stocker les produits visités dans des cookies et les montrer plus tard lorsqu'ils reviennent sur le site.

// 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
Võ Minh