8768 sujets

Développement web côté serveur, CMS

Bonjour,
je gère un genre de magasin pour un club sportif où les membres peuvent louer du matériel (skis). Chaque membre peut réserver du matériel pour lui-même, mais aussi pour plusieurs membres de sa famille par exemple. J'utilise une boucle foreach pour enregistrer les différents choix successifs. Je voudrais finaliser la "commande" par un mail récapitulatif. Je n'y arrive pas, car je ne retrouve que les valeurs de mes variables de la dernière ligne, les précédentes ayant été écrasées par les suivantes. Je voudrais donc enregistrer dans un tableau ces différentes valeurs à chaque fois qu'un membre recommence l'opération pour réserver autre chose. Mes explications sont-elles claires? Si oui, quelqu'un pourrait-il (elle) me mettre sur la voie de la solution. Merci pour votre aide.
Bonjour.

Vos explications ne sont pas claires et votre code serait le bienvenu...

Vous êtes en train de dire que vous avez perdu des commandes ? Smiley sweatdrop

Smiley smile
Rebonjour, je vais essayer d'être plus clair:
Etape 1: fichier choix.php > l'utilisateur choisit du matériel dans les champs proposés, par exemple skis adultes, longueur 165 cm, chaussures adultes, pointure 28
Ensuite il clique le bouton récapitulatif
Etape 2: fichier recap.php > l'utilisateur voit sur une ligne son choix de l'étape 1. Là, il peut soit retourner vers le fichier choix.php, soit confirmer sa réservation.
Etape 3: il retourne sur choix.php >et fait un second choix, par exemple skis enfant, longueur 110 cm, chaussures enfant, pointure 20 et il clique le bouton récapitulatif.
Etape 4: fichier recap.php > il voit maintenant 2 lignes qui correspondent à ses 2 choix. Il peut indéfiniment retourner sur choix.php pour faire des choix supplémentaires et à chaque choix une nouvelle ligne sera ajoutée dans le récapitulatif.
Etape 5: fichier confirm.php > l'utilisateur a terminé et confirme sa commande. A ce niveau là il doit ajouter son nom et d'autres données personnelles. Ici je génère un e-mail qui doit reprendre toute sa commande + ses données personnelles.
Et c'est ici que ça coince. Je ne parviens pas à récupérer les données des différents choix, mais seulement le dernier choix fait. Je cherche à créer un tableau choix[1], choix[2], etc, mais je n'y arrive pas. Comment faire ? Merci pour votre aide.
Bonjour.

C'est une situation assez classique dans le e-commerce et probablement que d'autres personnes auront leur mot à dire sur la question...

Il y a quelques années, j'avais fait un exo sur une situation de ce type. J'avais utilisé la variable $_SESSION qui permet de sauvegarder les informations durant la session et qui peuvent passer les informations d'une page à une autre.

Si l'utilisation de cette variable vous intéresse, je vous conseille de bien vous renseigner : il y a des subtilités... Est-ce que plusieurs personnes pourraient se connecter en même temps ?

Smiley smile
Merci Zelena, j'utilise déjà $_$ESSION pour transférer les valeurs de mes variables entre mes fichiers choix.php et recap.php et ceci fonctionne à merveille. Comme il s'agit d'une boucle, les valeurs des variables sont écrasées par une nouvelle requête. J'ai donc besoin de garder quelque part ces valeurs dans un nouveau tableau. C'est l'objet de ma question.
Modérateur
Ce que je ne comprend pas, c'est que si tu as une page de récapitulation avec l'ensemble des données, c'est que tu les as ces données, qu'est-ce qui t'empêche de les mettre dans un e-mail?
Kustolovic et BZH. Merci pour vos remarques. Mes lignes successives sont générées par une boucle foreach. Moi non plus je ne comprends pas comment j'arrive à lister toutes les lignes, sans réussir à garder les valeurs, sauf celles de la dernière ligne. Je ne veux pas publier tout mon code, mais je vais faire un résumé exactement comme je l'explique plus haut et peut être que quelqu'un pourra voir où se situe l'erreur.
Moi, j'aimerais voir comment vous avez organisé $_SESSION... C'est un tableau et il n'y a pas de raison pour que vous n'ayez pas accès à toutes les lignes de commandes.

Je suppose que vous avez mis 'session_start();' avant tout affichage et enregistré toutes les pages en UTF8-sans-BOM..

Je suppose aussi qu'à la page 'récapitulation' les données sont enregistrées dans une base de données avec pour chaque ligne de commande l'identifiant du client... (ou alors l'identifiant de la commande répertorié dans une base avec l'identifiant du client)

Si vous avez fait tout ça... je ne vois pas...

Smiley sweatdrop
Bonsoir Eric,
Il faudrait que tu postes ici les lignes du code qui s'occupe d'enregistrer les données choisies sur la page choix.php en session (dans la variable $_SESSION) et la partie de code qui s'occupe de la récupération des données stockées dans $_SESSION (depuis la page recap.php).

Ton souci est bien le fait que dans ton récap il ne s'affiche que le dernier choix effectué même si tu as choisi plusieurs produits, c'est bien ça ?

Sinon, une autre solution, peut-être de stocker ton panier en base de données avec un identifiant de session.
Merci à tous pour vos réponses. Je suis un bénévole qui travaille pour un club sportif et je "bosse" sur mon problème après mes heures. Je ne suis donc pas toujours réactif au quart de tour. Je vais analyser vos réponses et je reviens vers vous plus tard.
Bonjour, je reviens à mon problème ci-dessus.
Je récapitule:
1/ ouvrir le fichier "choix.php" et choisir quelque chose dans les champs
2/ cliquer sur "Récapitulatif", la ligne de choix est visible
3/ retourner vers "choix.php" pour refaire une autre commande et alors une seconde ligne s'ajoutera, ou bien "finaliser"
Toutes les lignes peuvent être supprimées avec le lien "Supprimer"
Et c'est ici que ça se corse!!! Dès que je clique sur "Finaliser", la dernière ligne de mon choix vient s'ajouter à toutes les autres, sans que je ne demande quoi que ce soit Smiley fache
Pourquoi? Dans ma boucle
foreach
, j'ai ajouté l'instruction
unset()
à différents endroits et avec différentes variables, mais rien ne change. J'ai aussi essayé sans l'instruction
unset()

Voici le code de mes fichiers. ATTENTION: ce code est épuré, il n'y a aucun contrôle. Ceci pour ne pas surcharger ce message
Merci beaucoup pour votre aide (je n'ai plus de cheveux, tellement que je me les arrache Smiley lol )

Fichier 1 - "choix.php"

<?php session_start(); ?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Choix matériel</title>
</head>
<body id="haut">
          <?php process_si_contact_form();
                if (isset($_SESSION['ctform']['error']) &&  $_SESSION['ctform']['error'] == true): 
                elseif (isset($_SESSION['ctform']['success']) && $_SESSION['ctform']['success'] == true): endif; ?>                
          <form method="post" action="#haut" id="contact_form" />
            <input type="hidden" name="do" value="contact" enctype="text/plain" />
            <table class="table" align="center" border="0" cellspacing="0" cellpadding="0">
              <tr valign="middle">
                <td align="left"><label>&nbsp;Matériel</label></td>
                <td><select name="ct_ski" readonly="readonly" value=""/>
                  <?php	$ski = isset($_REQUEST['ct_ski']) ? $_REQUEST['ct_ski'] : NULL; ?>
                  <?php $attr = 'selected="selected"'; ?>
                  <option value="1" <?php echo $ski == 1 ? $attr : ''; ?> >Skis adulte</option>
                  <option value="2" <?php echo $ski == 2 ? $attr : ''; ?> >Skis junior</option>
                  <option value="3" <?php echo $ski == 3 ? $attr : ''; ?> >Skis enfant</option>
                  </select>
                </td>    
                <td align="left"><label>Chaussures</label></td>
                <td><select name="ct_boots" readonly="readonly" value=""/>
                  <?php	$boots = isset($_REQUEST['ct_boots']) ? $_REQUEST['ct_boots'] : NULL; ?>
                  <?php $attr = 'selected="selected"'; ?>
                  <option value="1" <?php echo $boots == 1 ? $attr : ''; ?> >Adulte</option>
                  <option value="2" <?php echo $boots == 2 ? $attr : ''; ?> >Junior</option>
                  <option value="3" <?php echo $boots == 3 ? $attr : ''; ?> >Enfant</option>
                  </select>
                  </td>    
                </tr>
              <tr valign="middle">
                <td align="left"><label>&nbsp;Longueur du ski</label></td>
                <td><select name="ct_longski" readonly="readonly" value=""/>
                  <?php	$longski = isset($_REQUEST['ct_longski']) ? $_REQUEST['ct_longski'] : NULL; ?>
                  <?php $attr = 'selected="selected"'; ?>
                  <option value="1" <?php echo $longski == 1 ? $attr : ''; ?> >75 cm</option>
                  <option value="2" <?php echo $longski == 2 ? $attr : ''; ?> >120 cm</option>
                  <option value="3" <?php echo $longski == 3 ? $attr : ''; ?> >165 cm</option>
                  </select>
                </td>
                <td align="left"><label>Pointure</label></td>
                <td><select name="ct_pointure" readonly="readonly" value=""/>
                  <?php $pointure = isset($_REQUEST['ct_pointure']) ? $_REQUEST['ct_pointure'] : NULL; ?>
                  <?php $attr = 'selected="selected"'; ?>
                  <option value="1" <?php echo $pointure == 1 ? $attr : ''; ?> >20,0</option>
                  <option value="2" <?php echo $pointure == 2 ? $attr : ''; ?> >25,0</option>
                  <option value="3" <?php echo $pointure == 3 ? $attr : ''; ?> >30,0</option>
                  </select>
                  </td>
                </tr>
</table>
            <br /><center><input type="submit" value="Récapitulatif" /></center></form>
</body>
</html>
<?php
 function process_si_contact_form()
{
$_SESSION['ctform'] = array(); 
  if ($_SERVER['REQUEST_METHOD'] == 'POST' && @$_POST['do'] == 'contact') {
    foreach($_POST as $key => $value) {
      if (!is_array($key)) {
        if ($key != 'ct_message') $value = strip_tags($value);
        $_POST[$key] = htmlspecialchars(stripslashes(trim($value)));
      }
    } 
	$ski      = @$_POST['ct_ski'];
	$boots    = @$_POST['ct_boots'];
	$longski  = @$_POST['ct_longski'];
	$pointure = @$_POST['ct_pointure'];
     $errors = array();
    if (isset($GLOBALS['DEBUG_MODE']) && $GLOBALS['DEBUG_MODE'] == false) {  
	}   
$skilist = array("Skis adulte" => 1, "Skis junior" => 2, "Skis enfant" => 3);
$skimail = array_search($ski, $skilist);  
$bootslist = array("Adulte" => 1, "Junior" => 2, "Enfant" => 3);
$bootsmail = array_search($boots, $bootslist);  
$longskilist = array("75 cm" => 1, "120 cm" => 2, "165 cm" => 3);
$longskimail = array_search($longski, $longskilist);
$pointurelist = array("20,0" => 1, "25,0" => 2, "30,0" => 3);
$pointuremail = array_search($pointure, $pointurelist);	
 if (sizeof($errors) != 0) {
	goto err;
      }		
$_SESSION['ct_ski'] = $skimail;
$_SESSION['ct_boots'] = $bootsmail;
$_SESSION['ct_longski'] = $longskimail;
$_SESSION['ct_pointure'] = $pointuremail;
?>		
<a href="recap.php"></a>
<script type="text/javascript">;
window.location.replace("recap.php");
</script>
<?php err:
    if (sizeof($errors) == 0) {
      $_SESSION['ctform']['error'] = false;
      $_SESSION['ctform']['success'] = true;
    } else { 
      $_SESSION['ctform']['ct_ski'] = $ski;
      $_SESSION['ctform']['ct_boots'] = $boots;
	  $_SESSION['ctform']['ct_longski'] = $longski;
	  $_SESSION['ctform']['ct_pointure'] = $pointure;
       foreach($errors as $key => $error) {
        $_SESSION['ctform'][$key] = "<span style=\"font-weight: bold; color: #f00\">$error</span>";
      }
        $_SESSION['ctform']['error'] = true;
    }
  } 
}
$_SESSION['ctform']['success'] = false; 
?>


Fichier 2 - "recap.php"

<?php session_start(); ?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Récapitulatif</title>
<style>
pre {
    display: block;
    font-family: "Courier New", monospace;
	font-stretch: normal;
    font-size: 12px;
    white-space: pre;
} 
</style>
</head>
<body>
<?php
$select = array();
$select['type'] = $_SESSION['ct_ski'];
$select['longueur'] = $_SESSION['ct_longski'];
$select['boots'] = $_SESSION['ct_boots'];
$select['pointure'] = $_SESSION['ct_pointure'];
if(!isset($_SESSION['panier']))
{
    $_SESSION['panier'] = array();
    $_SESSION['panier']['type'] = array();
    $_SESSION['panier']['longueur'] = array();
    $_SESSION['panier']['boots'] = array();
    $_SESSION['panier']['pointure'] = array();
}   
array_push($_SESSION['panier']['type'],$select['type']);
array_push($_SESSION['panier']['longueur'],$select['longueur']);
array_push($_SESSION['panier']['boots'],$select['boots']);
array_push($_SESSION['panier']['pointure'],$select['pointure']);
$type = $_SESSION['panier']['type'];
$longueur = $_SESSION['panier']['longueur'];
$boots = $_SESSION['panier']['boots'];
$pointure = $_SESSION['panier']['pointure'];  
  echo "Voici la récapitulatif de votre demande :<br><br>
  <pre>
  Type de              | Longueur            | Type de                | Pointure des
  matériel             | des skis            | chaussures             | chaussures</pre>";   	  
  foreach ($type as $key => $value) {
   unset($value);
   $type[$key] = str_pad($type[$key], 20);
   $longueur[$key] = str_pad($longueur[$key], 19);
   $boots[$key] = str_pad($boots[$key], 22);
   $pointure[$key] = str_pad($pointure[$key], 15);
   echo "<pre>  " .$type[$key] . " | " . $longueur[$key] . " | " . $boots[$key] . " | " . $pointure[$key] .  "</pre>";	
  }	 
?>
          <hr>
          <a href="choix.php">Cliquez ici pour ajouter du matériel</a>
          <hr>
          <a href="confirm.php">Cliquez ici pour finaliser votre réservation</a>
          <hr>
          <a href="supprimer.php">Cliquez ici pour supprimer tout</a>
</body>
</html>


Fichier 3 - "confirm.php"

<?php session_start(); ?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Confirmation</title>
<style>
pre {
    display: block;
    font-family: "Courier New", monospace;
	font-stretch: normal;
    font-size: 12px;
    white-space: pre;
} 
</style>
</head>
<body>
<?php
$select = array();
$select['type'] = $_SESSION['ct_ski'];
$select['longueur'] = $_SESSION['ct_longski'];
$select['boots'] = $_SESSION['ct_boots'];
$select['pointure'] = $_SESSION['ct_pointure'];
if(!isset($_SESSION['panier']))
{
    $_SESSION['panier'] = array();
    $_SESSION['panier']['type'] = array();
    $_SESSION['panier']['longueur'] = array();
    $_SESSION['panier']['boots'] = array();
    $_SESSION['panier']['pointure'] = array();
}   
array_push($_SESSION['panier']['type'],$select['type']);
array_push($_SESSION['panier']['longueur'],$select['longueur']);
array_push($_SESSION['panier']['boots'],$select['boots']);
array_push($_SESSION['panier']['pointure'],$select['pointure']);
$type = $_SESSION['panier']['type'];
$longueur = $_SESSION['panier']['longueur'];
$boots = $_SESSION['panier']['boots'];
$pointure = $_SESSION['panier']['pointure']; 	 
  echo "Voici la récapitulatif de votre demande :<br><br>
  <pre>
  Type de              | Longueur            | Type de                | Pointure des
  matériel             | des skis            | chaussures             | chaussures</pre>";   	  
  foreach ($type as $key => $value) {
   unset($value);
   $type[$key] = str_pad($type[$key], 20);
   $longueur[$key] = str_pad($longueur[$key], 19);
   $boots[$key] = str_pad($boots[$key], 22);
   $pointure[$key] = str_pad($pointure[$key], 15);
   echo "<pre>  " .$type[$key] . " | " . $longueur[$key] . " | " . $boots[$key] . " | " . $pointure[$key] .  "</pre>";	
  }
?>
          <hr>
          <a href="supprimer.php">Cliquez ici pour supprimer tout</a>
          <hr>
          Ici formulaire pour données personnelles et réception d'un e-mail</a>
</body>
</html>


Fichier 4 - "supprimer.php"

<?php session_start(); 
$vide = false;
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false)
    {
        if(isset($_SESSION['panier']))
        {
            unset($_SESSION['panier']);
            if(!isset($_SESSION['panier']))
            {
                $vide = true;
            }
        }
        else
        {
             $vide = "inexistant";
        }
    } 
?>
<html>
<head>
<script type="text/javascript">
	 window.location.replace("choix.php");
</script>
</head>
</html>
Bonjour.

Je dois admettre, j'ai pas tout suivi, mais ce que je ne comprends pas, c'est pourquoi à l'étape 'confirm.php', vous utilisez encore les variables $_SESSION['ct_ski'], $_SESSION['ct_longski'], etc... La commande doit être entièrement dans $_SESSION['panier'] à ce moment-là. Si j'ai bien compris, les autres variables présentes dans $_SESSION ne sont que des variables transitoires... Pourquoi ne pas utiliser directement $_SESSION['panier'] ? C'est source de confusion, je trouve.

Pour débugguer sur PHP, c'est pas 'trop' compliqué, il faut abuser du var_dump qui permet de savoir à chaque étape ce qu'il y a dans les variables...

Smiley smile