[PHP - SESSION] Tableau en session / PANIER

Fermé
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 20 juil. 2007 à 21:16
 renolipus - 21 juil. 2007 à 14:46
Bonsoir,

Je m'adresse à vous car j'ai un gros problème sur un site.
Dans un de mes scripts PHP je manipule un tableau stocké en session afin d'y ajouter / retirer des éléments.

Voici le code permettant d'ajouter un élément s'il n'est pas présent encore dans ce tableau :

$offerList = null;

// --- Retrieve list of offers already in session
if ( isset($_SESSION['offerList']) && !empty($_SESSION['offerList']) ){
	$offerList = $_SESSION['offerList'];
}

// --- Check if current offer is not already in session
$found = false;
$i = 0;
$sizeList = sizeof($offerList);

while ( $found == false && $i < $sizeList ){
	if ( $offerList[$i] == $no_asp )
		$found = true;
	// --- Increase counter
	$i++;
}

// --- If no_asp found, advise the user
if ( $found == true ){
	echo "alert('L\'offre est deja dans votre panier.');";
	exit;
}
else {
	
	//echo "alert('Ajout de l offre ".$no_asp." a la place ".sizeof($offerList)."');";

	// --- Add current offer to current session
	$offerList[sizeof($offerList)] = $no_asp;
	$_SESSION['offerList'] = $offerList;

	echo "alert('Votre offre est dans le panier');";
	
}


En local (j'utilise EasyPhp), tout se passe bien pour ce script comme les autres, mais lorsque je met mes script sur un serveur (ce n'est pas le mien donc je ne connais pas trop la config, j'ai demandé aux admins du site de me la donner), j'ai l'erreur suivante qui se produit :

Lorsque je clic sur mon lien, le script ci-dessus est appelé afin d'ajouter une référence dans le tableau en session. L'ajout est correctement effectué la premiere fois, seulement si je reclic sur le meme lien, alors qu'en local le script détecte bien que l'offre est déjà présente en session, ici rien n'y fait. De meme si je tente d'ajouter d'autres offres --> OK mais au lieu d'avoir toutes mes offres sélectionnées, je n'ai a chaque fois que la dernière sélectionnée.

Bref, j'ai l'impression que le tableau est mal géré dans la session, et que ce dernier n'est justement pas géré en tant que tableau mais simplement comme une chaine de caractère (écrasée à chaque fois donc).

Quelqun saurait-il d'ou cela peut venir ? Je n'ai vraiment aucune idée pour le moment et ca fait un certain que je patauge ^^

Un grand merci à celui qui me tirera de ce mauvais pas :)
A voir également:

4 réponses

Je ne sais pas trop ce que tu veux faire, je pense que ce doit-être ça, mais pas sûr.
if ( !empty($_SESSION['offerList']) )
{
      if( in_array($no_asp, $_SESSION['offerList']) ) 
      {
          $index = array_search($no_asp, $_SESSION['offerList']);
          unset($_SESSION['offerList'][$index]);
      }
}
Egalement, foreach est plus pratique qu'un simple for ou while pour parcourir tous les éléments d'un tableau ;)
2
Je comprend pas trop la logique de ton code, surtout pourquoi tu parcours tout le tableau pour voir si une valeur y est présente.

Cette modification ne ferait pas ce que tu veux ?
if ( !empty($_SESSION['offerList']) )
{
   if( in_array($no_asp, $_SESSION['offerList'] )
   {
      echo "alert('L\'offre est deja dans votre panier.');";
   }
   else
   {
   	$_SESSION['offerList'][] = $no_asp;
   	echo "alert('Votre offre est dans le panier');";
   }
}
1
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
21 juil. 2007 à 12:00
Ca fait un moment que j'ai pas fais de PHP de la sorte, donc j'ai oublié pas mal de chose ^^

Je ne connaissais pas la fonction in_array, tres pratique, un grand merci pour le coup de pouce :)

(Ca fonctionne impec)

Pour le coup, j'ai la même erreur pour ce qui est de la suppression d'un élément du tableau en session, voici mon code :

$offerList = array();

// --- Retrieve list of offers already in session
if ( isset($_SESSION['offerList']) && !empty($_SESSION['offerList']) ){
	$offerList = $_SESSION['offerList'];
}

// --- Check if current offer is not already in session
$found = false;
$i = 0;
$sizeList = sizeof($offerList);
$newList = null;

for ( $i=0; $i<$sizeList; $i++ ){
	if ( $offerList[$i] != $no_asp ){
		$newList[sizeof($newList)] = $offerList[$i];
	}
}

// --- Replace in session last list by the new one
$_SESSION['offerList'] = $newList;



J'imagine qu'il y a une fonction analogue à in_array pour supprimer un élément du tableau ?

0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
21 juil. 2007 à 12:26
J'ai tenté de remplacer mon code par celui-ci :
if ( !empty($_SESSION['offerList']) ){

	for ( $i=0; $i<sizeof($_SESSION['offerList']); $i++ ){
		if ( $_SESSION['offerList'][$i] == $no_asp ){
			unset($_SESSION['offerList'][$i]);
			break;
		}
	}
}


Mais j'ai l'impression que la fonction "unset" ne supprimer pas correctement la valeur, mais la remplacer par une valeur "batarde". Car lorsque je parcours mon tableau pour l'afficher, j'ai une erreur d'offset sur l'ancien indice ou se situait l'offre que j'ai supprimé.

Quelqun saurait-il me dire comment supprimer correctement une valeur d'un tableau ?

0