Aller au contenu

Stocker un tableau dans une variable de session


Sujets conseillés

Posté

Bonjour à tous,

Je dois réaliser un mini site e-commerce pour mon projet de fin d'année et on m'impose certaines contraintes. L'une d'elles est de mémoriser le panier du visiteur dans une variable de type session. On nous explique vaguement comment ça fonctionne.

Ce code pour créer un tableau dans une variable session:

if (!isset($_SESSION["produit"])){
session_register("produit");
$_SESSION["produit"] = array();
}

La partie ci-dessus me semble cohérente par contre ce qui suit l'est moins à mes yeux. Pour savoir combien d'éléments on a dans le tableau, on devrait utiliser la fonction count(). Et pour ajouter un produit dans le tableau, on ferait comme ceci:

$i = count($_SESSION["produit"]);
$_SESSION["produit"][$i] = $monProduit;

J'ai essayé de faire de plusieurs façons, mais le contenu du tableau produit apparaît toujours vide quand je fais:

print_r($_SESSION);

J'ai regardé dans diverses documentation concernant les variable session, et je ne trouve rien de semblable. C'est pour cela que je viens me joindre à vous pour un petit coup de pouce.

D'où pourrait venir le problème?

Merci par avance pour votre aide. :)

Posté

plutôt que d'essayer de stocker un tableau dans une variable de session, fais des recherches sur la fonction serialize, elle devrait t'aider

Posté

Je connais le principe de la sérialisation (Java) mais je ne vois pas trop comment ça pourrait m'aider... En fait, j'utilise deux tableaux: un pour les produits et un autre pour stocker la quantité. Et en passant, je suis obligé de passer par les sessions.

Posté

Une autre manière (plus simple) de voir la chose :

Ton panier est enregistré dans une base de données (2 tables : 1 table panier et 1 table panier_articles). Chaque panier aura donc un identifiant (ex : basketId). Tu gère ton identifiant comme tu veux, mais prenons un auto-increment pour faire simple.

Au premier ajout au panier (si ton panier contient au moins 1 article), tu crée une ligne dans ta table panier et autant de ligne s que d'articles dans ta table panier_articles. Tu récupère le basketId ainsi créé.

Ensuite tu stocke basketId dans un cookie.

Posté

A la base, je pensais faire comme cela. Mais en y réfléchissant, ça va en faire des requêtes SQL, ça ne serait pas mieux de stocker le tout dans un cookie en attendant la confirmation du visiteur? Donc attendre le moment où il passe la commande en se loguant ou créant un nouveau compte?

Le fait d'enregistrer la moindre modification dans la base de données dès le départ aura un impact sur la vitesse d'exécution (minime peut-être mais quand même) et sur l'encombrement de la DB.

Posté
plutôt que d'essayer de stocker un tableau dans une variable de session, fais des recherches sur la fonction serialize, elle devrait t'aider

+1

A condition que ta variable soit bien renseignée:

$_SESSION['produit'] = serialize($tontableau);

puis

$tontableau = unserialize($_SESSION['produit']);

Sans connaître ton code, le principe est globalement celui-ci-dessus (français, ça ?)

xpatval

Posté

Je viens de mettre en place le serialize/unserialize dans mon code comme expliqué. Mais ça n'améliore pas la situation, la taille apparaît toujours comme vide (0 élément dans les 2 tableaux malgré l'ajout d'éléments).

Avant la sérialisation, il m'affiche bien la taille du tableau égale à 1 quand je fais un ajout. Mais une fois sérialisé/désérialisé, le tableau est soit-disant vide.

Posté

J'ai fais un test :

sessions1.php

<?php
$produits = array("prod1", "prod2", "prod3", "prod4");

$ser_produits = serialize($produits);

session_start();
session_register("produit");
$_SESSION["produit"] = $ser_produits;
?>
<p><a href="sessions2.php">Page 2</a></p>

Et sessions2.php

<?php
session_start();
$produits = unserialize($_SESSION["produit"]);

print_r($produits);
?>

je récupère bien mon tableau de l'autre coté

quel est ton code précis?

Posté

Hello !

Le gestionnaire de session de PHP y va déjà à coup de serialize/unserialize, et gère évidement parfaitement les tableaux. Pourquoi diable vouloir refaire le serialize()/unserialize() ?

Commence par supprimer le session_register() (comme conseillé depuis PHP 4.1...) ; et utilises ton tableau directement comme tu le souhaites.

Exemple, ce bout de code utilises un tableau "gonflant" à chaque actualisation :

session_start();
if(!isset( $_SESSION['test'] ) )
$_SESSION['test'] = array();
$_SESSION['test'][] = time();
print_r( $_SESSION );

Posté

A bah oui il n'y a pas besoin de sérialiser, j'étais persuadé que c'était nécessaire

Posté (modifié)

J'ai différents fichiers (j'ai remodifié comme Kioob le disait):

  • session.php où j'initialise la session s'il le faut, ce fichier est en entête de toutes mes pages

<? session_start();
/* initialisation de la session */
if (!isset($_SESSION["produit"])){
echo "vider"; /* le mot vider apparaît qu'une seule fois lors de la créations des cookies de session */
/*session_register("produit");
session_register("quantite");*/
$_SESSION["produit"] = array();
$_SESSION["quantite"] = array();
}?>

  • panier.php, la page où je récupère un nom d'article et une quantité, je fais mes différents tests (quantité numérique et positive,...) et si tout est OK, je rajoute dans mes tableaux.

<?
$i = sizeof($_SESSION["produit"]);
$_SESSION["produit"][$i] = $newProduit;
$_SESSION["quantite"][$i] = $newQuantite;
...
header("Refresh: 1; url=catalogue.php");
?>

  • catalogue.php, une fois les opérations ci-dessus effectuées, je reviens automatiquement sur la page catalogue.php via un header et sur cette page, j'essaye d'afficher la taille du tableau.

echo sizeof($_SESSION["produit"]);
print_r( $_SESSION );

Mais il affiche toujours 0 et un tableau vide...

Edit: j'ai trouvé l'origine du problème :blushing: J'avais oublié l'include session.php dans panier.php......... :wacko: Désolé pour le dérangement et merci pour votre aide.

Modifié par v4np13
Posté
Pourquoi tu utilises deux variables de sessions si tu utilises les tableaux???

Je ne comprends pas bien la question? Je pourrais tout stocker dans un seul et unique tableau?

Posté

Ben oui par exemple

$produits = array(
array("ref1", "nom1", 5, 13.50),
array("ref2", "nom2", 3, 22.23),
array("ref3", "nom3", 8, 10.52),
);

Comme cela pour chaque produit tu as la ref, le nom, la quantité, et le prix Unitaire (enfin la ref et la quantité suffisait ;))

Posté

Mouais, mais dans ce cas, c'est plus compliqué d'aller modifier la valeur de la quantité du produit ref3, non? :unsure:

Dans le cas de l'utilisation de deux tableaux, le problème c'est qu'il faut s'assurer qu'on travaille bien en parallèle dans les deux.

Posté

Oui et non, c'est pas spécialement compliqué de modifier les valeurs d'un tableau multidimensionnel

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...