Portail PHP

Forum de discussion et d'aide au php

Vous n'êtes pas identifié.

Annonce

Regles d'utilisation des forums : pensez à toujours les respecter si vous désirez obtenir des réponses rapides.
FAQ : pensez à toujours chercher dedans si la réponse à votre question est dedans.
Proposez vos news : si vous avez un evenement à annoncer
le chat : venez discuter de php.
 

#1 01-04-2008 09:26:02

nico341
Membre
Date d'inscription: 01-04-2008
Messages: 17

Mémoire Session

Bonjour à tous,

Voila je suis en train de créer un site oscommerce, et je me suis fais une partie commande express.
C'est asser simple, les revendeur après identification peuvent avoir accès la partie commande express qui leur affiche la liste complète des produits par catégorie (j'ai une page destiné à la collection homme, une autre pour collection femme...).

Il peut donc selectionner ces produits à l'aide d'une checkbox et mettre les quantités.
Une fois son choix fais, il a le choix entre cliquer sur visionner sa commande envoyer la commande ou bien, aller sur la page d'une autre collection et choisir d'autre produits.

Mon problème est que j'aimerai garder en mémoire les produits déjà coché dans les différentes collection.
Par exemple:
  - Je choisis 2 produits dans la collection homme
  - Je clique sur visionner ma commande, mais je me rent compte que j'ai oublié quelque chose
  - Je clique sur retour et je rajoute 1 article de la collection homme toute en verifiant que les produits que j'ai déjà selectionnés sont bien cochés
  - Je vais également dans la collection femme pour choisir 2 articles
  - Je re-clique sur visionner ma commande et la j'ai mes 5 produits qui sont biens présents.

J'ai voulu utilisé la session, se qu ime parrait le mieu car pas d'accès à la base pour stocké les produits selectionnés.
J'arrive à récupéré les produits séléctionnés, à les mettre en mémoire session, mais mon soucis et au moment du retour sur la page du listing produits, je n'arrive à récupérer les produits coché ou bien ma liste s'affiche en double...

Voici la partie qui crée la liste produits et mon foreach qui récupère les variable stocké dans la session.
Cette solution qui me parait la mieu me crée un double de ma liste:

Code:

<?php
        $request = tep_db_query("SELECT c.parent_id, pd.products_id, pd.products_name, p.products_ref, p.products_price, s.specials_new_products_price, taille.products_options_values_id, couleur.products_options_values_id, couleur.products_options_values_name AS couleur, taille.products_options_values_name AS taille, pa.options_values_price, (
pa.options_values_price + p.products_price ) AS final_price, (pa.options_values_price + s.specials_new_products_price ) AS final_price_promo
FROM products_stock ps, products_description pd LEFT JOIN specials s USING(products_id), products_options_values couleur, products_options_values taille, products_attributes pa, products p, products_to_categories p2c, categories c
WHERE pd.products_id = ps.products_id
AND pd.products_id = pa.products_id
AND pd.products_id = p.products_id
AND p2c.products_id = pd.products_id
AND p2c.categories_id = c.categories_id
AND c.parent_id = 4
AND SUBSTRING( ps.products_stock_attributes FROM 3 FOR 2 ) = couleur.products_options_values_id
AND SUBSTRING( ps.products_stock_attributes FROM 8 FOR 2 ) = taille.products_options_values_id
AND pa.options_values_id = taille.products_options_values_id
ORDER BY pd.products_name, couleur.products_options_values_id, taille.products_options_values_id ");
                
while($data = mysql_fetch_assoc($request)) 
  { 
            if ($data['final_price_promo'] == '') {
                $final_price = $data['final_price'];
            } else { 
                $final_price = $data['final_price_promo'];
            }
            
            foreach ($_SESSION["select"] AS  $value ){
   $data_table = explode("-", $value);
    
    if(($data_table[1] == $data['products_name']) && ($data_table[3] == $data['couleur']) && ($data_table[2] == $data['taille'])) {
     $check = ' checked="checked"';
     $quantite = 'value="' . $_SESSION[$data_table[0]] . '" ';
    } else {
     $check = '';
     $quantite = '';
    }

            
            
            echo '<tr>
            <td class="directbuy" width="90" align="center"><input type="checkbox" name="select[]" value="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '-' . $data['products_name'] . '-' . $data['taille'] . '-' . $data['couleur'] . '-' . $final_price . '"' . $check . ' /></td>
            <td class="directbuy_ref" width="50">' . $data['products_ref'] . '</td>
            <td class="directbuy_nom" width="260">' . $data['products_name'] . '</td>
            <td class="directbuy" width="130" align="center">' . $data['couleur'] . '</td>
            <td class="directbuy" width="90" align="center">' .$data['taille'] . '</td>
            <td class="directbuy_check" width="100" align="center"><input class="quantite" type="text" name="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '" ' . $quantite . ' /></td>
            </tr>';

    }
            
?>

Voici la page visionner ma commande qui récupère les produits coché et donne un apercu:

Code:

<?php
$prix_total=0;
foreach ( $_POST["select"] AS  $value ){
    $data = explode("-", $value);    
    if ((!empty($_POST[$data[0]])) && ($_POST[$data[0]] != 0)) {
        
        $prix= $data[4] * $_POST[$data[0]];
        $prix_total += $prix;
        $prix_unitaire= sprintf("%01.2f", $data[4]);
        echo '<tr>
                  <td class="main">
                    <table border="0" cellpadding="0" cellspacing="0">
                      <tr><td class="main" height="10" width="100%"></td></tr>
                      <tr><td class="main_bold" width="720">' . tep_draw_separator('pixel_trans.gif', '10', '1') . '-&nbsp;' . $data[1] . '<input type="hidden" name="select[]" value="'. $data[1] . '-' . $_POST[$data[0]] . '-' . $data[3] . '-' . $data[2] . '-' . $prix_unitaire . '-' . $prix . '-' . $prix_total . '" /></td></tr>
                      <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Quantité : ' . $_POST[$data[0]] . '</td></tr>
                      <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Couleur : ' . $data[3] . '</td></tr>
                      <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Taille : ' . $data[2] . '</td></tr>
                      <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Prix unitaire : ' . $prix_unitaire . ' Euros</td></tr>
                      <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Sous-total : ' . $prix . ' Euros</td></tr>
                    </table>
                  </td>
                </tr>';
        
        //mise en memoire session
        $_SESSION["select"] = $_POST["select"];
  

    } 
}    
    echo '<tr><td class="main" height="10"></td></tr>
          <tr>
            <td>' . tep_draw_separator("pixel_trans.gif", "100%", "3") . '</td>
          </tr>';    
    
    if ((!empty($_POST[$data[0]])) && ($_POST[$data[0]] != 0)) {
        //montant total de la commande
          echo '<tr><td class="main_bold" height="20">Total de la commande : ' . $prix_total . ' Euros</td></tr>'; 
    
    } else {
        echo '<td height="30" class="main">&nbsp;' . TEXT_PROBLEM . '</td>
              <tr>
                <td>' . tep_draw_separator("pixel_trans.gif", "100%", "3") . '</td>
              </tr>
              <tr><td class="main_bold" height="20">Total de la commande :</td></tr>';
    }
?>

Voila si quelque peut me donner une solution se serai vraiment cool je suis coincé sur cette commande express depuis un petit moment
et ca devient urgent que je la finisse hmm .

Dernière modification par nico341 (01-04-2008 09:26:17)

Hors ligne

 

#2 01-04-2008 17:37:04

Asherah
Membre
Date d'inscription: 15-11-2007
Messages: 161
Site web

Re: Mémoire Session

Compliqué a cette heure-ci ton code,

est tu sur de cette ligne *et celles qui suivent*?

foreach ( $_POST["select"] AS  $value ){
    $data = explode("-", $value);   
    if ((!empty($_POST[$data[0]])) && ($_POST[$data[0]] != 0)) {

car là je voit des prenthéses en trop (ou pas assé) * c'est d'ailleurs bizzare que tu n est pas une erreur*, ** mais plus en trop que pas assé** ,***puis des ] en trop eux aussi ***.

regarde et corrige moi tout ça et dit moi ce qu 'il en est ensuite (le copier coller de ligne ca a du bon sur un long code mais ca repete aussi les erreurs smile ).

Dernière modification par Asherah (01-04-2008 17:59:33)

Hors ligne

 

#3 02-04-2008 09:31:38

nico341
Membre
Date d'inscription: 01-04-2008
Messages: 17

Re: Mémoire Session

Humm j'ai vérifier non il ya pas d'erreur, si je détails:

donc 1er ligne pas de souci.
2eme pareil normalement c'est bon.
au niveau du if (je l'avoue dur a lire lol):

1er partie du if:  (!empty  ($_POST  [$data  [0] ] ) )
2eme partie apres &&: ($_POST  [$data  [0] ]  !=  0 )
plus les parenthèse du if non c'est correct. Enfin je pense en tout cas.

Hors ligne

 

#4 03-04-2008 04:51:33

nico341
Membre
Date d'inscription: 01-04-2008
Messages: 17

Re: Mémoire Session

J'ai essayer plusieurs autre méthode toujours pas de résultat, je suis en train de devenir fou personne aurait une idée??
Je vais mettre un schema du fonctionnement pour que se soit plus facilement comprehensible

Hors ligne

 

#5 03-04-2008 05:38:14

nico341
Membre
Date d'inscription: 01-04-2008
Messages: 17

Re: Mémoire Session

Voila un schema qui represente la partie commande express de mon site :

http://img177.imageshack.us/img177/3789/schemacommandeexpresses7.gif

Les collections représentent l'affichage des listes de produits pour chacune.
On voit qu'elles sont toutes reliées entre elles comme je l'ai dis plus haut on doit pouvoir choisir dans une collection, puis cliquer sur une autre pour choisir d'autre produits puis revenir dans la 1er.
Enfin chaque collection à un lien vers visionner la commande et la tous les produits selectionnés dans toutes les collections doivent petre pris en compte.
De plus dans viosionner la commande on a le bouton retour qui permet de revenir sur la page collection femme (page par defaut que j'ai mis), on devra retrouver tous les produits déjà cochés dans toutes les collections.

Voila j'espère que c'est un peu plus clair, j'ai un peu de mal à donner les explication, mais il me faudrais vraiment de l'aide.

Hors ligne

 

#6 04-04-2008 07:08:30

Asherah
Membre
Date d'inscription: 15-11-2007
Messages: 161
Site web

Re: Mémoire Session

il te reste encore des erreurs

Code:

<?php
$prix_total=0;
foreach ( $_POST["select"] AS  $value ){
    $data = explode("-", $value);    
    if ((!empty($_POST[$data[0]])) && ($_POST[$data[0]] != 0)) {
        
        $prix= $data[4] * $_POST[$data[0]];

Code:

((!empty($_POST[$data[0]]))

Dernière modification par Asherah (04-04-2008 07:17:52)

Hors ligne

 

#7 05-04-2008 07:10:19

nico341
Membre
Date d'inscription: 01-04-2008
Messages: 17

Re: Mémoire Session

hummm pourrais tu être plus précis? je ne vois pas l'erreur.
Pourtant cette partie de code fonctionne bien, c'est le foreach

Code:

foreach ($_SESSION["select"] AS  $value ){
   $data_table = explode("-", $value);
...

qui me pose problème.

J'ai essayer une alternative qui peut être interressante mais j'ai le même problème de doublons à l'arrivée, mais je pense que cette solution peut être moin lourde.

Donc pour la mise en session j'ai pensé à ca:

Code:

//mise en memoire session
$_SESSION['panier'][] = array('nom'=>$data[1], 'couleur'=>$data[3], 'taille'=>$data[2], 'quantite'=>$_POST[$data[0]]);

Et pour cocher les produits mis en session :

Code:

for($i=0;$i<count($_SESSION['panier']);$i++) {
                if(($_SESSION['panier'][$i]['nom'] == $data['products_name']) && ($_SESSION['panier'][$i]['couleur'] == $data['couleur']) && ($_SESSION['panier'][$i]['taille'] == $data['taille'])) {
                  $check = ' checked="checked"';
                  $quantite = 'value="' . $_SESSION['panier'][$i]['quantite'] . '" ';
                } else {
                  $check = '';
                  $quantite = '';
                }
            }

Ce for je l'ai mis de le while qui construit ma liste de produit.
Si mon for entoure la construction d'une ligne j'ai le doublon qui se crée

Code:

for($i=0;$i<count($_SESSION['panier']);$i++) {
                if(($_SESSION['panier'][$i]['nom'] == $data['products_name']) && ($_SESSION['panier'][$i]['couleur'] == $data['couleur']) && ($_SESSION['panier'][$i]['taille'] == $data['taille'])) {
                  $check = ' checked="checked"';
                  $quantite = 'value="' . $_SESSION['panier'][$i]['quantite'] . '" ';
                } else {
                  $check = '';
                  $quantite = '';
                }
            
            
            echo '<tr>
            <td class="directbuy" width="90" align="center"><input type="checkbox" name="select[]" value="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '-' . $data['products_name'] . '-' . $data['taille'] . '-' . $data['couleur'] . '-' . $final_price . '"' . $check . ' /></td>
            <td class="directbuy_ref" width="50">' . $data['products_ref'] . '</td>
            <td class="directbuy_nom" width="260">' . $data['products_name'] . '</td>
            <td class="directbuy" width="130" align="center">' . $data['couleur'] . '</td>
            <td class="directbuy" width="90" align="center">' .$data['taille'] . '</td>
            <td class="directbuy_check" width="100" align="center"><input class="quantite" type="text" name="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '" ' . $quantite . ' /></td>
            </tr>';
            }

Si je le laisse comme au dessu, qu'il boucle tout seul, il va me cocher que le dernier produits qui est en mémoire.
Comment je peux faire pour résoudre ce problème quoi que je fasse, je retombe toujours sur le même problème.

Hors ligne

 

#8 05-04-2008 08:03:05

Asherah
Membre
Date d'inscription: 15-11-2007
Messages: 161
Site web

Re: Mémoire Session

tu peut m'expliquer pourquoi tu met ]]? si tu avait un truc du genre $tableau[$machin[$i]], je comprendrait, mais là...
un seul suffit.
sinon tu ferme un tableau qui n'existe pas.

Hors ligne

 

#9 05-04-2008 08:25:59

nico341
Membre
Date d'inscription: 01-04-2008
Messages: 17

Re: Mémoire Session

Ben i lne s'agit pas de ca?? j'ai

Code:

((!empty($_POST[$data[0]]))

$_POST[] est un tableau et $data[] en est un autre qui se trouve dans $_POST[] donc $_POST[$data[]], enfin moi je le vois comme ca, peut etre je me trompe, je ne suis qu'un novice.

Le code qui renvoie ces tableau est le suivant:

Code:

echo '<tr>
            <td class="directbuy" width="90" align="center"><input type="checkbox" name="select[]" value="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '-' . $data['products_name'] . '-' . $data['taille'] . '-' . $data['couleur'] . '-' . $final_price . '"' . $check . ' /></td>
            <td class="directbuy_ref" width="50">' . $data['products_ref'] . '</td>
            <td class="directbuy_nom" width="260">' . $data['products_name'] . '</td>
            <td class="directbuy" width="130" align="center">' . $data['couleur'] . '</td>
            <td class="directbuy" width="90" align="center">' .$data['taille'] . '</td>
            <td class="directbuy_check" width="100" align="center"><input class="quantite" type="text" name="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '" ' . $quantite . ' /></td>
            </tr>';

$_POST[] représente la checkbox "select[]", $data[] représente le champ quantité.
Quantité et récupéré dans $_POST[], c'est la 1er valeur récupéré.

Hors ligne

 

#10 05-04-2008 08:38:13

Asherah
Membre
Date d'inscription: 15-11-2007
Messages: 161
Site web

Re: Mémoire Session

pardon c'est bon, j differencie mal les ([ ])

mais du coup :

Code:

if ((!empty($_POST[$data[0]])) && ($_POST[$data[0]] != 0))

ici t'as une fermeture ) en trop

et là

Code:

((!empty($_POST[$data[0]]))

il t'en manque une

Hors ligne

 

#11 05-04-2008 08:58:39

nico341
Membre
Date d'inscription: 01-04-2008
Messages: 17

Re: Mémoire Session

Je ne pense pas regarde j'ai numéroté les parenthèses, je les ouvre ainsi "(1" et les referme comme ca "/1)"

Code:

if (1 (2 !empty(3 $_POST[$data[0]] /3) /2) && (4 $_POST[$data[0]] != 0 /4) /1)

Hors ligne

 

#12 05-04-2008 09:11:55

Asherah
Membre
Date d'inscription: 15-11-2007
Messages: 161
Site web

Re: Mémoire Session

pfff je m'y perd bon ok.

mais fait plutot:

if (!empty($_POST[$data[0]]) && ($_POST[$data[0]] != 0))

ca seras plus clair et moins lourd.

Hors ligne

 

#13 05-04-2008 09:16:19

nico341
Membre
Date d'inscription: 01-04-2008
Messages: 17

Re: Mémoire Session

ok merci pour l'amélioration.

Pour vérifier quels produits sont à cocher, j'ai également pensé à comparer les variables de 2 tableaux avec la fonction array_intersect(), il faut que les tableaux soit formés de la même manière??

Je pense à cette fonction car elle m'eviterai de faire une nouvelle boucle et donc d'avoir mon problème actuel qu'en penses-tu??

Hors ligne

 

#14 05-04-2008 09:42:47

Asherah
Membre
Date d'inscription: 15-11-2007
Messages: 161
Site web

Re: Mémoire Session

y a un truc qui me titille, c'est que tu fait ton foreach sans verifier si la session select existe, ensuite tu parcourt ton tableau data_table en comparant si il est identique a tes occurences BDD donc si ta session select ne contient rien tu va parcourir ta table dans le vide pour rien....
a moins que tu soit sur avant que ta session existe.

Ton echo des produits se trouve soit dans ta boucle for ou foreach, donc a chaque passage il va creer un nouveau echo donc une nouveau tableau html de tes produit ou alors rien si ta session n'existe pas.

A mon avis le probleme viens de là.

faudrait que tu re-stock ton resultat de ta boucle dans un tableau, pour ensuite le ré-intégrer a ton tableau html de commande afin de sortir de la boucle

Dernière modification par Asherah (05-04-2008 09:52:57)

Hors ligne

 

#15 05-04-2008 12:09:23

nico341
Membre
Date d'inscription: 01-04-2008
Messages: 17

Re: Mémoire Session

En faite si, tout en haut de ma page je me suis mis un

Code:

print_r($_SESSION['panier']);

et donc oui j'ai bien un résultat.

Donc pour toi, on est bien d'accord, il faut que je re-stock le résultat de cette boucle??:

Code:

for($i=0;$i<count($_SESSION['panier']);$i++) {
                if(($_SESSION['panier'][$i]['nom'] == $data['products_name']) && ($_SESSION['panier'][$i]['couleur'] == $data['couleur']) && ($_SESSION['panier'][$i]['taille'] == $data['taille'])) {
                  $check = ' checked="checked"';
                  $quantite = 'value="' . $_SESSION['panier'][$i]['quantite'] . '" ';
                } else {
                  $check = '';
                  $quantite = '';
                }
            }

Peux-tu me rappeler comment restocker le résultat??

Hors ligne