Problème Session et array

Résolu
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 - 16 mars 2009 à 14:52
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009 - 18 mars 2009 à 14:54
Bonjour à tous,

J'essaye de créer un panier d'achat. J'en suis au stade expérimental et pour ne pas me casser la tête, à ce stade je "remplis" mon panier à travers un formulaire.
Pour faire plus simple, je vous écris et vous commente mon code:

<?php
session_start();                                //démarrage de la session


$ref = $_POST['item'];    //Je recupère les données de mon formulaire
$qte = $_POST['qte'];


//Création du caddie
if (!empty($_SESSION['panier'])){}     //Si le 'panier' n'est pas vide, ne rien faire
else               //Par contre, si le 'panier' n'existe pas, je le crée
{
  $_SESSION['panier']=array(
  'refProduit' => $ref,
  'qteProduit' => $qte);
}


//je cherche dans le 'panier' si le produit est déjà dedans
$positionProduit = array_search($ref, $_SESSION['panier']);


//On reagarde si l'article existe déjà si oui on augmente sa qantité dans le panier
if ($positionProduit !== false){
$_SESSION['panier'][$positionProduit] += $qteProduit ;
}
//sinon on l'ajoute
else {
array_push( $_SESSION['panier']['refProduit'],$ref);
array_push( $_SESSION['panier']['qteProduit'],$qte);
}

//je visualise mon panier pour vérifier que mon code marche
  echo '';
  print_r($_SESSION['panier']);
  echo '

';
 
//J'ai une petite sortie pour voir ce que j'ai envoyé
echo $ref. ' j\'en veux '. $qte; 
?>

A ce stade, voilà que j'ai deux problèmes:
1. print_r  m'affiche refProduit=>0 (quand ça devrait être toute autre chose) et ce, même si je mets un simple $ref ='Un test';
2. Si je renvois mon formulaire, la dernière ligne m'envoie bien ce que j'ai posté, mais print_r ne m'affiche que la 1e entrée Donc, je crois que ça n'enregistre rien dans mon array.

Pouvez-vous m'aider, svp?

Merci à tous de votre aide!

25 réponses

cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
16 mars 2009 à 16:44
Alors je pense qu'il y a confusion entre les array et les valeur ... Deja pour commencer tu peux enlever le name ="qte" sur les options de ton select ... ça fait conflit avec le select actuellement.

Ensuite, ici :

if (!empty($_SESSION['panier'])){}     //Si le 'panier' n'est pas vide, ne rien faire
else               //Par contre, si le 'panier' n'existe pas, je le crée
{
  $_SESSION['panier']=array(
  'refProduit' => $ref,
  'qteProduit' => $qte);
}

$_SESSION['panier']['refProduit'] est une string ... et plus loin dans ton code tu fais ça :

array_push( $_SESSION['panier']['refProduit'],$ref);
ce qui signifierait que ton $_SESSION['panier']['refproduit'] est un array ... Il y a donc un conflit dans les données ...
De plus, quand tu fais ça :
$positionProduit = array_search($ref, $_SESSION['panier']);

Il ne me semble pas que le array_serach est récursif (c'est à dire qu'il n'ira pas regarder dans chacun de tes array contenu dans ta session panier .. IL ne lira que dans le panier et non pas dans panier => refProduit et panier => qteProduit).

Je te suggère donc de revoir la déclaration de tes variables de session lors de la création de ton 'caddie'
3
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
17 mars 2009 à 10:26
C'est parce que $_SESSION['panier']['refProduit'] n'est pas un array :D

Cela vient surement du fait que ton test d'initialisation de ton panier n'est pas bon ... Essai de remplacer :
if (!empty($_SESSION['panier'])){}
else
{
  $_SESSION['panier']=array();
  $_SESSION['panier']['refProduit']=array();
  $_SESSION['panier']['qteProduit']=array();
}

par

if (isset($_SESSION['panier'] && isset($_SESSION['panier']['refProduit']) && isset($_SESSION['panier']['qteProduit']) && !empty($_SESSION['panier']['refProduit'])){}
else
{
  $_SESSION['panier']=array();
  $_SESSION['panier']['refProduit']=array();
  $_SESSION['panier']['qteProduit']=array();
}
3
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
17 mars 2009 à 12:02
ok,  tu à ça ...

array(2) {
    ["refProduit"]=> array(3)
    {
        [0]=> string(18) "Objet1"
        [1]=> string(14) "Objet2"
        [2]=> string(15) "Objet3"
    }
    ["qteProduit"]=> array(3)
    {
        [0]=> int(2)
        [1]=> string(1) "1"
        [2]=> int(44)
    }
}

Si tu penses t'en sortir comme ça tu peux rester dans cette optique mais je trouve ceci pas très "parlant". J'aurais plutôt fait comme un truc comme ça :

array(2) {
    [0] => array(2)
    {
        ["refProduit"]=> string(18) "Objet1"
        ["qteProduit"]=> int(2)
    }
    [1] => array(2)
    {
        ["refProduit"]=> string(18) "Objet2"
        ["qteProduit"]=> int(44)
    }
    [2] => array(2)
    {
        ["refProduit"]=> string(18) "Objet3"
        ["qteProduit"]=> int(12)
    }
}

Disons que comme ça tu accède à toutes les infos de ton produit en passant par un seul tableau ... Parce que fais comme tu la fais, tu doit récupérer la position pour accéder aux infos dans 2 tableaux différents ... Je sais pas si je me fais bien comprendre
3
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
17 mars 2009 à 12:31
Oui ça va modifier un peu ton code. Tu va avoir un truc dans le style :

au lieu de récupérer dans des variables tes posts ... tu y récupère dans un tableau :
$tmp = array();
$tmp['qteProduit'] = $_POST['qteProduit'];
$tmp['refProduit'] = $_POST['item'];Et ensuite ton array_push se fera de la sorte :
array_push($_SESSION['panier'],$tmp);
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
17 mars 2009 à 15:34
Il faut juste utiliser un array_search récursif ... Utilise cette fonction :function search_in_array ($needle, $haystack, $inverse false, $limit 1) {
     # Settings
    $path = array ();
    $count = 0;
  
    # Check if inverse
    if ($inverse == true)
        $haystack = array_reverse ($haystack, true);
      
    # Loop
    foreach ($haystack as $key => $value) {

        # Check for return
        if ($count > 0 && $count == $limit)  
            return $path;
      
        # Check for val
        if ($value === $needle) {
          
            # Add to path
            $path[] = $key;
          
            # Count
            $count++;
          
        } else if (is_array ($value)) {
          
            # Fetch subs
            $sub = search_in_array ($needle, $value, $inverse, $limit);
          
            # Check if there are subs
            if (count ($sub) > 0) {
              
                # Add to path
                $path[$key] = $sub;
              
                # Add to count
                $count += count ($sub);
            }
        }
    }
  
    return $path;
}

Pour ton cas si tu fais par exemple :
search_in_array("objet2", $_SESSION['panier'])

et bien ça va te retouner ceci :
array(1) {
[1]=> //ici la position
array(1) {
[0]=>
string(3) "refProduit" //et ici l'endroit dans lequel est stocké ta valeur
}
}
3
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
17 mars 2009 à 16:36
ton print_r est correct ... simplement, au lieu d'utiliser le
array_search que tu utilisais et bien utilise la fonction que je t'ai
mis ...Elle te retourne un tableau (comme je te l'ai mis) qui contient
la position ainsi que l'endroit dans lequel est stocké ta valeur
recherchée ...



Tu doit donc faire un truc comme ça :



$positionProduit = key(search_in_array("objet2", $_SESSION['panier'])) //sa te retourne un chiffre ou false

La fontion key te retourne la clé d'un tableau ... Ici la fonction search_in_array te retourne un tableau contenant toute les infos dont tu as besoins.


et ensuite pour incrémenter ta valeur tu fais :


$_SESSION['panier'][$positionProduit] += $tmp['qteProduit'] ;

La je crois que je vais difficilement pouvoir plus t'aider j'tai tout donné :D ... A mois que mes explication soit trop flou
3
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
16 mars 2009 à 16:22
ton $_POST['item'] est un tableau ou pas ? Comment est-il généré depuis l'html ? Fais voir ton code html pour voir ...
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
16 mars 2009 à 16:31
Merci de ta réponse.

Voici mon code html:

    $reponse = mysql_query("SELECT * FROM favors WHERE id='.$id.') or die(mysql_error());
    while ($donnees = mysql_fetch_array($reponse) )
     {
 $name=$donnees[name];
};

echo '<form action="ajoutcaddie.html" method="post" id="formulaire">';
echo '<select name="qte">',"\n";
  for($i=1; $i<=50; $i++)  {
  echo '<option name ="qte" value="' .$i. '">' .$i. '</option>';
  }
  echo '</select>',"\n";


echo '';
echo '[javascript:document.getElementById(\'formulaire\').submit() ajouter au panier]</form>';

J'ai mon catalogue dans une bdd "favors" où je choisis une réf ("$id")
Bref, pour l'instant c'est sommaire mais je suis de l'avis d'y aller pas à pas et que si ça marche à ce stade ça marcher plus tard.
Ce que je ne comprends pas c'est que la dernière ligne de mon code php (echo $ref et $qte j'obtiens bien ce que j'avais rentré mais visiblement ça ne s'enregistre pas dans mon array. :(
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
16 mars 2009 à 17:15
Merci bcp pour tes conseils!

J'ai modifié mon formulaire comme suit:
echo '<form action="ajoutcaddie.html" method="post" id="formulaire">';
echo '<select name="qteProduit">',"\n";
  for($i=1; $i<=50; $i++)  {
  echo '<option name ="qte" value="' .$i. '">' .$i. '</option>';
  }
  echo '</select>',"\n";


echo '';
echo '[javascript:document.getElementById(\'formulaire\').submit()
ajouter au panier]</form>';

Je pense qu'il n'y a plus de conflit.

et ma page php:
<?php
session_start();                                //démarrage de la session


$ref = $_POST['item'];
$qte = $_POST['qteProduit'];


//Création du caddie
if (!empty($_SESSION['panier'])){}
else
{
  $_SESSION['panier']=array();
  $_SESSION['panier']['refProduit']=array();
  $_SESSION['panier']['qteProduit']=array();
}
//A présent, je crois que ce sont des arrays


//Je cherche dans le tableau session si le produit existe déjà
$positionProduit = array_search($ref, $_SESSION['panier']);
//Si je mets $_SESSION['panier']['refProduit'] ça me donne une erreur "wrong data type for second argument"


//On reagarde si l'article existe déjà si oui on augmente sa qantité dans le panier
if ($positionProduit !== false){
$_SESSION['panier'][$positionProduit] += $qteProduit ;
}
//sinon on l'ajoute
else { //array_push() empile un ou plusieur éléments à la fin d'un tableau
array_push( $_SESSION['panier']['refProduit'],$ref);
array_push( $_SESSION['panier']['qteProduit'],$qte);
}
//Dans les deux cas, j'obtiens un message: First argument should be an array (je croyais que c'était fait plus haut (!)


  echo '';
  print_r($_SESSION['panier']);
  echo '

';
 
echo $ref. ' j\'en veux '. $qte;
?>

Bref, après avoir jetté un coup d'oeil au manuel, je me demande si avec un if(in_array) ce ne serait pas plus simple...
Qu'en penses-tu?

Merci encore de tes conseils!
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
16 mars 2009 à 17:32
J'ai modifié mon code comme ça:
if (in_array ($ref, $_SESSION['panier']['refProduit']{
$_SESSION['panier']['qteProduit'] += $qte
}
else {
 array_push($_SESSION['panier']['refProduit'],$ref);
 array_push($_SESSION['panier']['qteProduit'],$qte);
 }

J'ai supprimé le array_search et ce qui venait par la suite.

En revanche, j'ai un message unexpected T_ELSE
Une petite idée d'où cela peut venir?

Merci encore de votre aide!
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
16 mars 2009 à 17:39
Bref, je n'ai rien dit, je n'avais pas fermé les accolades

if (in_array ($ref, $_SESSION['panier']['refProduit'])){
$_SESSION['panier']['qteProduit'] += $qte;
}
else {
 array_push($_SESSION['panier']['refProduit'],$ref);
 array_push($_SESSION['panier']['qteProduit'],$qte);
 }

Cela dit, j'ai jrs le message array_push (...) First argument should in an array

Des idées?

Merci bcp
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
17 mars 2009 à 10:59
Mike1310, Merci bcp de ta réponse. J'avais modifié mon code comme suit:

<?php
session_start();                                //démarrage de la session


$ref = $_POST['item'];     //récupération des données postées
$qte = $_POST['qteProduit'];


//Création du caddie
if (!empty($_SESSION['panier'])){}
else
{
  $_SESSION['panier']=array();
  $_SESSION['panier']['refProduit']=array();
  $_SESSION['panier']['qteProduit']=array();
}


//Ajout nouveau produit
if (in_array ($ref, $_SESSION['panier']['refProduit'])){     //Si l' produit existe déjà => augmenter la quantité
$_SESSION['panier']['refProduit'][$ref] += $qte;
}
else {     //S'il n'existe pas => ajouter la nouvelle entrée
 array_push($_SESSION['panier']['refProduit'],$ref);
 array_push($_SESSION['panier']['qteProduit'],$qte);
 }


  echo '';     //On visualise le tableau
  print_r($_SESSION['panier']);
  echo '

';
?>

Cela a l'air de bien marcher dans le cas d'un nouvel ajout mais pas dans le cas de vouloir rajouter des indices à un produit déjà existent.

Je pense que là je commence quand même la phase 2, à savoir, pouvoir modifier et/ou supprimer un article. Je crois que ce n'est plus qu'un problème de arrays à présent. ça a peut être l'air facile pour certains, mais vu que c'est des tableaux à 2 dimensions, je galère un peu (dsl, je suis debutant)

Cependant ton array isset me plait bien aussi (c'est à dire, si ça existe ok, sinon, crée-le)

Encore merci de m'éclairer avec ton avis. C'est tjrs sympa d'avoir une 2e opinion et une autre façon de voir les choses.
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
17 mars 2009 à 11:15
Bon, mon code avance!

Je n'arrivais pas à ajouter une qté à un article déjà existant. J'ai fait ceci:

//Ajout nouveau produit
$positionProduit = array_search($ref, $_SESSION['panier']['refProduit']);
if (in_array ($ref, $_SESSION['panier']['refProduit'])){     //Si l' produit existe déjà => augmenter la quantité
$_SESSION['panier']['qteProduit'][$positionProduit] += $qte;
}
else {     //S'il n'existe pas => ajouter la nouvelle entrée
 array_push($_SESSION['panier']['refProduit'],$ref);
 array_push($_SESSION['panier']['qteProduit'],$qte);
 }

et à prsent ça marche!!

Bref, passons à la "phase 2" (supprimer ou modifier des quantités)
0
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
17 mars 2009 à 11:28
Est ce que tu peux me montrer ce que t'affiche ton var_dump de ta Session panier please ... parce qu'a mon avis tu risques d'avoir plsu tard des problèmes de compréhension et surtout d'organisation
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
17 mars 2009 à 11:37
Une fois de plus, merci de ton avis!

Voici ce que var_dump($_SESSION['panier']); affiche:

array(2) { ["refProduit"]=> array(3) { [0]=> string(18) "Objet1" [1]=> string(14) "Objet2" [2]=> string(15) "Objet3" } ["qteProduit"]=> array(3) { [0]=> int(2) [1]=> string(1) "1" [2]=> int(44) } }

Est-ce que ce que tu esperais voir?

Merci encore pour tes avis éclairés!
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
17 mars 2009 à 12:11
Ah oui, je comprends tout à fait! ça me semble mieux et  plus facile.
Par contre, comment faire??? Est-ce que ça va changer qqch aux opérations que j'ai jusqu'à maintenant?
Est-ce que si je fais un simple $_SESSION['panier'][$i]  (un truc dans le genre) ça ne marchera pas?
Car là, je sèche complètement!
De plus, je crois que je vais rajouter une 3e variable à mon tableau: le prix!
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
17 mars 2009 à 14:36
Merci Mike1310!!! Excellente méthode!
Je vois que je dois modifier un peu mon code mais j'espère y arriver facilement.

Avec le print_r je vois que c'est plus clair et j'ai compris le pourquoi de cette modif.

Encore mreci pour ton aide!
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
17 mars 2009 à 15:09
Merci Mike1310!!! Excellente méthode!
Je vois que je dois modifier un peu mon code mais j'espère y arriver facilement.

Avec le print_r je vois que c'est plus clair et j'ai compris le pourquoi de cette modif.

Encore mreci pour ton aide!
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
17 mars 2009 à 15:16
En fait, je suis emmerdé avec mon array_search... et (logiquement) pour augmenter la qté si le produit existe déjà
0
taxitat Messages postés 38 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 18 mars 2009 1
17 mars 2009 à 15:44
[Humour ON]
Tu fournis aussi les aspirines??
OFF

Je vais étudier tout ça!

Jusqu'à présent, j'utilisais $positionProduit pour savoir dans quel array se trouvait ce que je cherchais et pouvoir l'appeller facilement. Il renvoyait un chiffre ou bien false s'il n'avait pas trouvé. D'où je sortais $_SESSION['panier'][$positionProduit] J'espère que je m'explique clairement...

Bref, je pense que d'ici ce soir tu auras un nouveau message de moi (LOL) que soit soit pour pleurer que je ne me'n sors pas ou bien pour dire que c'est résolu!
0
Rejoignez-nous