Problème avec session et array pour class panier

Eléphant du PHP | 451 Messages

02 déc. 2008, 22:02

Bonsoir,

Mon problème est que mon array de ma session panier ne fonctionne pas, quand j'ai un article dans mon panier et que je veux en ajouter un autre il me remplace le premier par le deuxième, donc en faites j'ai toujours q'un seul article dans mon panier.

Voici tous mes codes:

class.php
<?php

class Caddie
{

	var $caddie = array();
	var $number = 0;
	
	function getAdd($select)
	{
		$i = $this->number + 1;
		
		$this->caddie[$i] = $select;
		$this->number++;
	}

	function getList()
	{
		return $this->caddie;
	}
	
	function getPriceArticle($select)
	{
		$ret = $select["price"] * $select["qte"];
		
		return $ret;
	}
	
	function getCount()
	{
		return $this->number;
	}
	
	function getDelete()
	{
		$this->caddie = array();
	}
	
}

?>
ajout_panier.php
<?php
include_once 'class.php';



if (!isset($_SESSION['cart'])) {
	session_register("cart");
	$var = new Caddie();
} else {
	$var = unserialize($_SESSION['cart']);
	
	if ($var == "") $var = new Caddie();
}



$type = isset($_REQUEST["type"]) ? $_REQUEST["type"] : "";
$numserie = isset($_REQUEST["numserie"]) ? $_REQUEST["numserie"] : "";
$qte      = isset($_REQUEST["qte"])      ? $_REQUEST["qte"]      : 0;
$origine  = isset($_REQUEST["origine"])  ? $_REQUEST["origine"]  : "";
$prix     = isset($_REQUEST["prix"])     ? $_REQUEST["prix"]     : 0;



if($type == 'add')
{
	$var->getAdd(array("code" => $numserie, "qte" => $qte, "price" => $prix));

	$_SESSION["cart"] = serialize($var);
}
elseif($type == 'delete')
{
	$var->getDelete();

	$_SESSION["cart"] = serialize($var);
}

if ($origine) {
	Header("Location: $origine");
	exit;
}

?>
Et quand je fais ceci:
<pre>
<?php
var_dump($var->getList());
?>
</pre>
J'obtiens celà comme réponse:

Code : Tout sélectionner

array(1) { [1]=> array(3) { ["code"]=> string(10) "Reference4" ["qte"]=> string(1) "1" ["price"]=> string(6) "304.00" } }
Merci d'avance...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

02 déc. 2008, 23:01

Tu as oublié d'activer la session par session_start() au début de ton programme principal.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 451 Messages

02 déc. 2008, 23:12

Et m....e encore une erreur con. |*() |*() |*()

Ok je sors!!!!

Merci Sadeq

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 déc. 2008, 01:17

Puisque j'aime les caddies, j'ai eu le plaisir :boire9: de retoucher ton code pour obtenir ça :

Class.Caddie.php
<?php
class Caddie
{
    // propriétés privées et publiques
    public $content = array();
    
    // ajouter dans le caddie
    function add($select)
    { 
         // valider $select
         if (! is_array($select)) return 2; // Données vides!
         if (! isset($select["code"]) || trim($select["code"])=="") return 3; // Code manquant!
         if (! isset($select["price"]) || trim($select["price"])=="" || $select["price"] <=0 ) return 4; // Prix manquant ou incorrect!

         // correction automatique de la qte si absente ou <=0
         if (! isset($select["qte"]) ||  trim($select["qte"])=="" || $select["qte"] <=0 ) $select["qte"] = 1;

        // ajout : indexer le tableau content par le code du produit (clé primaire)
        $code = strtolower(trim($select["code"])); // permet de garder l'unicité de la ligne panier

        // ajouter le nouveau si n'existe pas déjà
        if (! isset($this->content[$code]))  {
                   // faire le dispatching des champs requis
                   $this->content[$code] = array("code"=>$code, "price"=>(float)$select["price"], "qte"=>(int)$select["qte"]);
                   return 1; // Ajout effectué
        }
        else return 0; // Existe déjà!
    }
    
	// retourner le contenu du caddie
    function getContent()
    {
        return $this->content;
    }
    
	// calculer le montant d'un produit du caddie
    function getPrice($code) // accès par clé primaire
    {
        if (isset($this->content[$code])){
               return ((float)$this->content[$code]["price"]) * ((int)$this->content[$code]["qte"]);
        }
		else return null;
    }
    
	// retourner le nombre de produits dans le caddie
    function getCount()
    {
        return count($this->content);
    }
    
	// supprimer un produit du caddie
    function delete($code) // accès par clé primaire
    {
        if (isset($this->content[$code])) {
		    // suuprime la case indexée par $code
			unset($this->content[$code]);
			return 1; // Suppression effectuée.
		}
		else return 0; // Le produit n'existe pas!
    }
    
	// modifier les données d'un produit du caddie
    function update($select) // accès par clé primaire
    { 
	    $code = $select["code"]; // le code n'est pas modifiable car c'est une clé d'accès
        if (isset($this->content[$code])){ 
		    // trouver les champs à modifier
	        if (isset($select["price"]) && trim($select["price"])!="" && $select["price"] >0 ) $this->content[$code]["price"] = (float)$select["price"];
	        if (isset($select["qte"]) && trim($select["qte"])!="" && $select["qte"] >0 ) $this->content[$code]["qte"] = (int)$select["qte"];
			//
			return 1; // Modification effectuée.
		}
		else return 0; // Le produit n'existe pas!
    }
	
	// gestion des messages
	function getMessage($action, $msgNumber, $msgLang="fr"){
		// retourne le texte du message selon une action --> numéro du message --> langue (par défaut fr)
		if (isset($this->messages[$action][$msgNumber][$msgLang])) return $this->messages[$action][$msgNumber][$msgLang];
		else return $this->messages["unknown"][$msgLang];
	}
	
	// tableau des erreurs organisé par : action source de l'erreur --> code erreur --> langue --> texte de l'erreur
	public $messages = array (
	        //-- Unknown Error --//
			"unknown" => array(
					"fr" => "Erreur inconnue!",
					"en" => "Unknown Error!",
				),
				
			//-- action add --//
			"add" => array(
				"0" => array(
					"fr" => "Le produit existe déjà!",
					"en" => "Product Already Exists!",
				),
				"1" => array(
					"fr" => "Ajout effectué.",
					"en" => "Product Added Successfully.",
				),	
				"2" => array(
					"fr" => "Données vides!",
					"en" => "No Data Given!",
				),
				"3" => array(
					"fr" => "Code manquant!",
					"en" => "Product Id Required!",
				),
				"4" => array(
					"fr" => "Prix manquant ou incorrect!",
					"en" => "Correct Price Required!",
				),
			),
			//-- action delete --//
			"delete" => array(
				"0" => array(
					"fr" => "Le produit n'existe pas!",
					"en" => "Product Doesn't Exist!",
				),
				"1" => array(
					"fr" => "Suppression effectuée.",
					"en" => "Product Deleted Successfully.",
				),	
			),
			//-- action update --//
			"update" => array(
				"0" => array(
					"fr" => "Le produit n'existe pas!",
					"en" => "Product Doesn't Exist!",
				),
				"1" => array(
					"fr" => "Modification effectuée.",
					"en" => "Product Updated Successfully.",
				),	
			),
	);
}
?>
Main.Caddie.php
<?php
// activer la session
session_start();

// modèle de classe
require_once 'Class.Caddie.php';

// construction session
if (!isset($_SESSION['cart'])) {
    // nouveau caddie
    session_register("cart");
    $var = new Caddie();
} else {
    // caddie existant
    $var = unserialize($_SESSION['cart']);
    if ($var == "") $var = new Caddie();
}

// données de l'interface utilisateur
$type 	  = isset($_REQUEST["type"]) 	 ? $_REQUEST["type"] 	 : "";
$numserie = isset($_REQUEST["numserie"]) ? $_REQUEST["numserie"] : "";
$qte      = isset($_REQUEST["qte"])      ? $_REQUEST["qte"]      : 0;
$origine  = isset($_REQUEST["origine"])  ? $_REQUEST["origine"]  : "";
$prix     = isset($_REQUEST["prix"])     ? $_REQUEST["prix"]     : 0;
$lang 	  = isset($_REQUEST["lang"])     ? $_REQUEST["lang"]     : "fr";

// actions
if($type == 'add')
{
    $ret = $var->add(array("code" => $numserie, "qte" => $qte, "price" => $prix));
	//	
 	echo $var->getMessage("add", $ret, $lang);
	//
    $_SESSION["cart"] = serialize($var);
}
elseif($type == 'delete')
{
    $ret = $var->delete($numserie);
	//	
 	echo $var->getMessage("delete", $ret, $lang);
    //
    $_SESSION["cart"] = serialize($var);
}
elseif($type == 'update')
{
    $ret = $var->update(array("code" => $numserie, "qte" => $qte, "price" => $prix));
	//	
 	echo $var->getMessage("update", $ret, $lang);
	//
    $_SESSION["cart"] = serialize($var);
}
elseif($type == 'display')
{
    echo "<pre>"; print_r($var->getContent()); echo "</pre>";
}

// redirection vers l'origine
if ($origine) {
    Header("Location: $origine");
    exit;
}
?>
ps: J'ai intégré dans la classe un gestionnaire de messages multi-langues.
Modifié en dernier par sadeq le 03 déc. 2008, 22:07, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 451 Messages

03 déc. 2008, 20:32

Merci beaucoup sadeq c'est très gentil je vais la remplacer toute suite.

++