Page 1 sur 1

boucle sur une session

Posté : 06 sept. 2008, 17:18
par x@v
Bonjour,
je voudrai faire une boucle sur une session :
if (isset($_GET['idProduit']))
{
	if(isset($_GET['nombreProduit']))
	{
		$caddie['idProduit']=0;
		$caddie['idProduit']+=$_GET['nombreProduit'];
	}
	else
		$caddie['idProduit'] += $_GET['nombreProduit'];
	$_SESSION['caddie'] = $caddie['idProduit'];

echo 'id produit'.$_GET['idProduit'].'<br>';
echo 'nombre produit'.$_GET['nombreProduit'].'<br>';
echo 'session '.$_SESSION['caddie'].'<br>';
	
		foreach($_SESSION['caddie'] as $idSession => $nombre)
		{
				$quantiteTotal+=$nombre;
				echo $quantiteTotal;?> articles<?php
		}
	//header('Location:index.php?page=detailProduit&idProduit='.$_GET['idProduit']);
Sa me renvoie:

Code : Tout sélectionner

id produit6 nombre produit1 Warning: Invalid argument supplied for foreach() in C:\wamp\www\boutique\controleur.php on line 33
Je ne comprens pas pourquoi ?

Posté : 06 sept. 2008, 17:42
par luc@s
Ta session n'est pas un array (tableau) et foreach sert à parcourir un tableau, donc il en demande un en paramètre.

Posté : 06 sept. 2008, 17:49
par sadeq
Il faut remplacer :
$_SESSION['caddie'] = $caddie['idProduit'];

par :
$_SESSION['caddie'][] = $caddie['idProduit']; 
Par ailleurs, le test suivant ne sert à rien :
   if(isset($_GET['nombreProduit']))
    {
        $caddie['idProduit']=0;
        $caddie['idProduit']+=$_GET['nombreProduit'];
    }
    else
        $caddie['idProduit'] += $_GET['nombreProduit']; 
ou alors tu t'es trompé dans la condition, car il peut être simplifié comme ça:
 $caddie['idProduit'] += $_GET['nombreProduit'];
En suite, il y a quelques fautes dans la boucle de calcul du total. Voici le script final corrigé:
if (isset($_GET['idProduit']))
{
    $caddie['idProduit'] += $_GET['nombreProduit'];
    $_SESSION['caddie'][] = $caddie['idProduit'];

echo 'id produit'.$_GET['idProduit'].'<br>';
echo 'nombre produit'.$_GET['nombreProduit'].'<br>';
echo 'session '.$_SESSION['caddie'].'<br>';
    
        foreach($_SESSION['caddie'] as $index=> $nombre)
        {
                $quantiteTotal+=$nombre;
        } 
         echo $quantiteTotal . " articles"; //affichage du total après la boucle

....
Ceci dit, j'ai corrigé le code sans comprendre ta méthode pour traiter ton caddie. :lol:

Posté : 06 sept. 2008, 18:24
par x@v
à l'origine j'ai une classe ou j'ai fais comme ça
	// ajoute un formulaire avec le nom et nombre d'article comme variable, grenade comme le fruit ;)
	public function setFormulaireAjout($nombreGrenade, $grenade)
	{
		if (isset($_GET[$grenade]))
		{
			if(isset($_GET[$nombreGrenade]))
			{
				$this->caddie[$grenade]=0;
				$this->caddie[$grenade]+=$_GET[$nombreGrenade];
			}
			else
				$this->caddie[$grenade] += $_GET[$nombreGrenade];
			$_SESSION['caddie'] = $this->caddie;
		}?>
		<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="GET">
			<div><input type="hidden" name="page" value="detailProduit" /></div>
			<div><input type="hidden" name="idProduit" value="<?php echo $_GET['idProduit'];?>" /></div>
			<div><input type="hidden" name="categorie" value="<?php echo $_SESSION['categorie'];?>" /></div>
			<?php //echo 'Nombre de '.$grenade;?>
			<div>
      			<select name="<?php echo $nombreGrenade;?>">
      				<?php for($i=1; $i<=20; $i++)
      					echo '<option value="'.$i.'">'.$i.'</option>';?>
      			</select>
			</div>
			<div><input type="hidden" name="<?php echo $grenade;?>" value="<?php echo $grenade;?>" /></div>
			<div><input type="submit" value="ajouter" /></div>
		</form><?php
	}
ensuise je n'ai plus qu'a appellé ma méthode comme ça
$panier->setFormulaireAjout('nombre'.$id, $id);
je voudrai rediriger le résultat dans un controleur, mais je ne peux pas faire un header puis que il y a de l'affichage en amont, donc je vais faire un formulaire en dur

Code : Tout sélectionner

<form action="controleur.php" method="GET"> <div><input type="hidden" name="ajoutPanier" value="ok" /></div> <div><input type="hidden" name="idProduit" value="<?php echo $_GET['idProduit'];?>" /></div> <?php //echo 'Nombre de '.$grenade;?> <div> <select name="nombreProduit"> <?php for($i=1; $i<=20; $i++) echo '<option value="'.$i.'">'.$i.'</option>';?> </select> </div> <div><input type="submit" value="ajouter" /></div> </form>
puis dans mon controlleur je fais:
if (isset($_GET['idProduit']))
{
	if(isset($_GET['nombreProduit']))
	{
		$caddie['idProduit']=0;
		$caddie['idProduit']+=$_GET['nombreProduit'];
	}
	else
		$caddie['idProduit'] += $_GET['nombreProduit'];
	$_SESSION['caddie'] = $caddie['idProduit'];

	//header('Location:index.php?page=detailProduit&idProduit='.$_GET['idProduit']);
}
ta méthode m'écrase toutes les variables de session déjà ajouté.
if (isset($_GET['idProduit']))
{
   $_SESSION['caddie']=array();
    $caddie['idProduit'] += $_GET['nombreProduit'];
    $_SESSION['caddie'][] = $caddie['idProduit'];

echo 'id produit'.$_GET['idProduit'].'<br>';
echo 'nombre produit'.$_GET['nombreProduit'].'<br>';
echo 'session '.$_SESSION['caddie'].'<br>';
        foreach($_SESSION['caddie'] as $index=> $nombre)
        {
                $quantiteTotal+=$nombre;
        } 
         echo $quantiteTotal . " articles"; //affichage du total après la boucle
}
]

Posté : 06 sept. 2008, 22:17
par sadeq
Mais moi, je ne t'ai pas dit de mettre ça :
$_SESSION['caddie']=array();
Car effectivement cette instruction vide le caddie précédent. Et elle est incompatible avec l'instruction :
$_SESSION['caddie'][] = $caddie['idProduit'];
Qui, elle, incrémente (garde et ajoute une case) dans le caddie précédent.

Posté : 09 sept. 2008, 01:07
par x@v
oui effectivement mais...
je ne comprend pas mon propre panier, il fonctionne, mais dès que je veux l'implémenter sans méthode, sa casse ?
Ma class panier
<?php
#########################################################################################################
//////////////////////////////////				/************************************************/		#
//  	 #              #		//				/*     *****   class par ########## alias x@v */		#
//       #             ##		//				/*     *****   ***** ***** ***** ******************/		#
//       ###        #####		//				/*     *****   Ma première classe en php ********/		#
//       # ###    #######		//				/*     *****   cette classe permet d'avoir un ***/		#
//            ########  #		//				/*     *****   panier ou cadie pour un site *****/		#
//           #######			//				/*     *****   vous êtes conviés à laisser ******/		#
//       # #########			//				/*     *****   ce commentaire *******************/		#
//       ######     ### #		//				/*     *****  ***** ***** ***** *******************/		#
//       ###          ###		//				/*     *****   ***** ***** ***** *******************/		#
//       #              #		//				/*     *****   ***** ***** ***** *******************/		#
//          ###					//				/*     *****   ***** ***** ***** *******************/		#
//        #######    ##			//				/*     *****   ***** ***** ***** *******************/		#
//       #########  ####		//				/************************************************/		#
//       ##     ##   # ##		//																		#
//       #      ##      #		//																		#
//       ##     #      ##		//																		#
//       ###############		//																		#
//       ##############			//																		#
//       #						//																		#
//								//																		#
//                      #		//																		#
//                    ###		//																		#
//                #######		//																		#
//             ##########		//																		#
//        ##########			//																		#
//       ########				//																		#
//           ###				//																		#
//               ####   #		//																		#
//                   ####		//																		#
//                      #		//																		#
//////////////////////////////////																		#
#########################################################################################################
class Panier
{
	private $caddie;
	private $nomSession;
	private $connect;
	private $ttc; // total + tva
	private $controleur='index.php'; // page du controlleur
	
	public function __construct()
	{
		session_start();
		// chargement du caddie
		if (isset($_SESSION['caddie']))
			$this->caddie = $_SESSION['caddie'];
		else 
			$this->caddie = array();
		//parent::__construct();
	}
	
	public function extranet()
	{
		$this->nomSession = $_SESSION['nomSession'];
	}
	
	// ajoute un formulaire avec le nom et nombre d'article comme variable, grenade comme le fruit ;)
	public function setFormulaireAjout($nombreGrenade, $grenade)
	{
		if (isset($_GET[$grenade]))
		{
			if(isset($_GET[$nombreGrenade]))
			{
				$this->caddie[$grenade]=0;
				$this->caddie[$grenade]+=$_GET[$nombreGrenade];
			}
			else
				$this->caddie[$grenade] += $_GET[$nombreGrenade];
			$_SESSION['caddie'] = $this->caddie;
		}?>
		<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="GET">
			<div><input type="hidden" name="page" value="detailProduit" /></div>
			<div><input type="hidden" name="idProduit" value="<?php echo $_GET['idProduit'];?>" /></div>
			<div><input type="hidden" name="categorie" value="<?php echo $_SESSION['categorie'];?>" /></div>
			<?php //echo 'Nombre de '.$grenade;?>
			<div>
      			<select name="<?php echo $nombreGrenade;?>">
      				<?php for($i=1; $i<=20; $i++)
      					echo '<option value="'.$i.'">'.$i.'</option>';?>
      			</select>
			</div>
			<div><input type="hidden" name="<?php echo $grenade;?>" value="<?php echo $grenade;?>" /></div>
			<div><input type="submit" value="ajouter" /></div>
		</form><?php
	}
	
//////////////////////////////////////
	public function detruitPanier()
	{
		if ($_SESSION['caddie'] != '' && $_SESSION['caddie'] != 0)
			return true;
		else
			return false;
	}
	
	public function visionnePanier()
	{
		if ($_SESSION['caddie'] != '' || $_SESSION['caddie']>0)
		{
			foreach ($_SESSION['caddie'] as $key => $val)
			{
				echo '<p>'.$key.' '.$val.'</p>';
			}
		}
		else
			exit('Votre caddie est déserpérément vide !!!!');
	}

	public function getTtc($addition)
	{
		$this->ttc=round($addition*1.196, 2);
		return $this->ttc;
	}
	
	public function getTva($addition)
	{
		$this->ttc=$addition*1.196;
		$ht=$this->ttc/1.196;
		$tva=$this->ttc-$ht;
		return $tva;
	}
	
	// $nomClient === $_SESSION['nomClient']
	public function afficheSession($nomClient)
	{
		$connection= new Connection();
		if (isset($nomClient))
		{
			$nClient=$nomClient;
			$sql="select * from client where nom='$nClient'";
			$result= $connection->select($sql);
			foreach ($result as $row)
			{
				$civilite=$row['civilite'];
				$prenom=$row['prenom'];
			}
			echo '
			<span>
				<img src="../img/cle.png" alt="" />
				Bonjour :<strong>'.$civilite.' '.$prenom.' '.$nClient.'</strong><br></span>';
			echo '<a href="'.$this->controleur.'?nomClientSession=decon">Déconnection</a>';
		}
		else?>
			<span>
				<a href="./<?php echo $this->controleur;?>?page=espaceClient">
					Connectez-vous à votre compte
				</a>
			</span><?php
	}
	
	// affiche le contenu du panier pour tout le site
	public function getQuantitePanier()
	{
		if (isset($_SESSION['caddie']) || !empty($_SESSION['caddie']) || $_SESSION['caddie'] != 0)
		{?>
			Vous avez <?php
			foreach ($_SESSION['caddie'] as $idSession => $quantite)
				$quantiteTotal+=$quantite;
			if ($quantiteTotal > 1)
			{
				echo $quantiteTotal;?> articles<?php
			}
			else
			{
				echo $quantiteTotal;?> article<?php
			}
			return true;
		}
	}
	
	public function test()
	{
		if (isset($_SESSION['caddie']) || !empty($_SESSION['caddie']) || $_SESSION['caddie'] != 0)
		{?>
			<?php
			foreach ($_SESSION['caddie'] as $idSession => $quantite)
				$quantiteTotal+=$quantite;
			if ($quantiteTotal != 1)
				$quantiteTotal;
			else
				$quantiteTotal;
		return $quantiteTotal;
		}
		else
			return false;
	}
	
	// affiche le contenu du panier pour la page produit.php
	public function getQuantitePanierProduit()
	{
		if ($_GET['cat'] != O)
		{
			if (isset($_SESSION['caddie']) || !empty($_SESSION['caddie']) || $_SESSION['caddie'] != 0)
			{?>
				Vous avez <?php
				foreach ($_SESSION['caddie'] as $idSession => $quantite)
					$quantiteTotal+=$quantite;
				if ($quantiteTotal != 1)
				{
					echo $quantiteTotal;?>
					articles<br />
					<a href="./<?php echo $this->controleur;?>?detruitSessionProduit=destruction&cat=<?php echo $_SESSION['idCategorie'];?>">
						vider le panier
					</a><?php
				}
				else
				{
					echo $quantiteTotal;?>
					article<br />
					<a href="./<?php echo $this->controleur;?>?detruitSessionProduit=destruction&cat=<?php echo $_SESSION['idCategorie'];?>">
						vider le panier
					</a><?php
				}
			}
			else
				echo 'Panier vide';
		}
	}
}
?>
cette méthode concerné
    // ajoute un formulaire avec le nom et nombre d'article comme variable, grenade comme le fruit ;)
    public function setFormulaireAjout($nombreGrenade, $grenade)
    {
        if (isset($_GET[$grenade]))
        {
            if(isset($_GET[$nombreGrenade]))
            {
                $this->caddie[$grenade]=0;
                $this->caddie[$grenade]+=$_GET[$nombreGrenade];
            }
            else
                $this->caddie[$grenade] += $_GET[$nombreGrenade];
            $_SESSION['caddie'] = $this->caddie;
        }?>
        <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="GET">
            <div><input type="hidden" name="page" value="detailProduit" /></div>
            <div><input type="hidden" name="idProduit" value="<?php echo $_GET['idProduit'];?>" /></div>
            <div><input type="hidden" name="categorie" value="<?php echo $_SESSION['categorie'];?>" /></div>
            <?php //echo 'Nombre de '.$grenade;?>
            <div>
                  <select name="<?php echo $nombreGrenade;?>">
                      <?php for($i=1; $i<=20; $i++)
                          echo '<option value="'.$i.'">'.$i.'</option>';?>
                  </select>
            </div>
            <div><input type="hidden" name="<?php echo $grenade;?>" value="<?php echo $grenade;?>" /></div>
            <div><input type="submit" value="ajouter" /></div>
        </form><?php
    }