Jump to content

Stocker un tableau dans une variable de session


Recommended Posts

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. :)

Link to post
Share on other sites

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

Link to post
Share on other sites

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.

Link to post
Share on other sites

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.

Link to post
Share on other sites

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.

Link to post
Share on other sites
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

Link to post
Share on other sites

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.

Link to post
Share on other sites

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?

Link to post
Share on other sites

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 );

Link to post
Share on other sites

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.

Edited by v4np13
Link to post
Share on other sites

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 ;))

Link to post
Share on other sites

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.

Link to post
Share on other sites

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

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...