Session et tableaux

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Session et tableaux

par sadeq » 14 juin 2005, 16:14

Ô tu fais une recherche de l'article s'il existe tu ne l'ajoute pas :
Voici le programme entier :
session_start(); 

if (isset($_SESSION["caddie"])) 
{ 
    $caddie = $_SESSION["caddie"]; 
} 
else 
{ 
    $caddie = null; 
} 

//Identité d'un article
$nom = isset($_GET['nom'])?$_GET['nom']:null; 
$pu = isset($_GET['pu'])?$_GET['pu']:0; 

//Maj automatique des qté's
if (isset($_GET['qt']) && $caddie != null) 
{ 
	 $qt = $_GET['qt']; 
	 if ($qt != null)
	 	foreach($qt as $key=>$valeur) {
		   if ($valeur>0){
	 			$caddie[$key][2] = $valeur ;
	 			$caddie[$key][3] = $caddie[$key][1] * $valeur;
			}
		$_SESSION["caddie"] = $caddie; 
	}
} 

//Suppression d'un article
if (isset($_GET["supprimer"]) && $caddie != null) 
{ 
	unset($caddie[$_GET["supprimer"]]);
	$caddie = array_values($caddie) ;
    $_SESSION["caddie"] = $caddie; 
}  

//Ajout d'article
if (isset($_GET["ajout"]) && $nom != null  && $pu>0) 
{ 
	//Ajout par défaut d'1 article : structure du caddie (Nom, Prix, Qté, Total=Qté*Prix) 
	if (!existe($nom,$caddie)) { //si l'article n'existe pas déjà dans le caddie
		$caddie[]= array($nom,$pu,1,$pu); 
    	$_SESSION["caddie"] = $caddie; 
	}
} 
function existe($mot_clé,$tableau ){
if ($tableau != null) 
	foreach ($tableau as $ligne){
		if (is_array($tableau) && in_array($mot_clé,$ligne)) return true;
		else if ($mot_clé == $ligne) return true;
		}		
return false;
}
//Affichage
echo "
<h1>Panier</h1>
<form name='f1'>
Nom <input name=nom value='$nom'> Prix <input name=pu value='$pu'> 
<input type=submit name=ajout value=+>
";

if ($caddie != null) {
	$total = 0;
	echo "<h3>Produits achetés</h3><table><tr><th>Nom<th>Prix<th>Qté<th>Total";
 	foreach($caddie as $key=>$ligne) 
	 if ($ligne != null) {
		echo "<tr><th>".$ligne[0]."<th>".$ligne[1]."<th><input name='qt[]' value='".$ligne[2]."' onChange='f1.submit()'><th>".$ligne[3]
		."<td><a href=?supprimer=$key>Supprimer</a>";
		$total += $ligne[3];
	}
	echo "<tr><th colspan=3>Total (ht)<th>$total <td><input type=submit name='editer' value=Editer></table>";
}
echo "</form>";

par xgregx » 14 juin 2005, 14:45

Merci !!!

par Cyrano » 14 juin 2005, 14:41

En fin de compte : [Résolu] :?:

par xgregx » 14 juin 2005, 14:33

Merci Saqued, ta solution fonctionne très bien !

Le seul souci c'est que si je clique deux fois sur le meme produit, au lieu de m'écraser l'entrée il m'en crée une autre...ce qui doit pourvoir être modifié.
Je dois pouvoir faire un test du genre:
foreach($caddie as $ligne)
 if ($ligne[0] = $nom){
j'écrase l'entrée par la nouvelle
//$caddie[]= array($nom,$qt,$pu,$sub);
}
else{
$caddie[]= array($nom,$qt,$pu,$sub);
}

par sadeq » 14 juin 2005, 13:26

Pourquoi faire compliqué quand on peut faire simple :
1. Si to caddie n'est pas dans la session, il est null.
2. Quand tu te mets en mode Ajout tu crée une ligne dans le tableau caddie (ligne composée de Nom, Quantité et Sub) que tu mémorise dans la session.
session_start(); 

if (isset($_SESSION["caddie"])) 
{ 
    $caddie = $_SESSION["caddie"]; 
} 
else 
{ 
    $caddie = null; 
} 

$nom = isset($_GET['nom'])?$_GET['nom']:null; 
$qt = isset($_GET['qt'])?$_GET['qt']:0; 
$pu = isset($_GET['pu'])?$_GET['pu']:0; 
 

if (isset($_GET["ajout"]) && $nom != null && $qt>0 && $pu>0) 
{ 
	$sub = $qt * $pu;	
	$caddie[]= array($nom,$qt,$sub); 
    $_SESSION["caddie"] = $caddie; 
    //header("Location: ".$_SERVER["PHP_SELF"]);  
} 
echo "
<h1>Panier</h1>
<form>Nom <input name=nom> Qté <input name=qt> Prix <input name=pu> <input type=submit name=ajout value=Ajouter></form>
";

if ($caddie != null) {
	$total = 0;
	echo "<h3>Produits achetés</h3><table><tr><th>Nom<th>Qté<th>Total";
 	foreach($caddie as $ligne) 
	 if ($ligne != null) {
		echo "<tr><th>".$ligne[0]."<th>".$ligne[1]."<th>".$ligne[2];
		$total += $ligne[2];
	}
	echo "<tr><th colspan=2>Total (ht)<th>$total</table>";
}

par Cyrano » 14 juin 2005, 13:20

Je crois que ça doit venir de ce que tu es toujours sur la même session, or l'ancienne variable de session n'est pas bonne dans sa structure. Ferme ton navigateur et rouvre le sur ta page pour remettre le truc à plat. Ce message d'etrreur n'est pas normal autrement.

par xgregx » 14 juin 2005, 13:06

Je t'envoie tout le code car là j'ai toujours ce pb de
Warning: First argument to array_push() needs to be an array in d:\easyphp\www\odonae\shop\shop.php on line 23

Warning: First argument to array_push() needs to be an array in d:\easyphp\www\odonae\shop\shop.php on line 24

Warning: First argument to array_push() needs to be an array in d:\easyphp\www\odonae\shop\shop.php on line 25

Warning: Cannot add header information - headers already sent by (output started at d:\easyphp\www\odonae\shop\shop.php:23) in d:\easyphp\www\odonae\shop\shop.php on line 28

Code : Tout sélectionner

<? session_start(); if (isset($_SESSION["caddie"])) { $caddie = $_SESSION["caddie"]; } else { $caddie = array("Produit"=> array()); $caddie['Produit']['Nom'] = array(); $caddie['Produit']['Quantité'] = array(); $caddie['Produit']['Sous total'] = array(); } if (isset($_GET["ajout"])) { $nom = $_GET['nom']; $qt = $_GET['qt']; $pu = $_GET['pu']; $sub = $qt * $pu; array_push($caddie['Produit']['Nom'], $nom); array_push($caddie['Produit']['Quantité'], $pu); array_push($caddie['Produit']['Sous total'], $sub); $_SESSION["caddie"] = $caddie; header("Location: ".$_SERVER["PHP_SELF"]); die(); } include ("header.php"); include ("menu.php"); ?> <div id="droite"> <a href="http://www.odonae.com" title="Retour Accueil" ><img src="img/tete.gif" /></a> <p> <? include ("cnx.php"); $sql = "select * from Oshopproduits"; $result = mysql_query($sql); $nbp = mysql_num_rows($result); while($var=mysql_fetch_array($result)){ $id = $var["SP_id"]; $nom = $var["SP_nom"]; $mini = $var["SP_minia"]; $large = $var["SP_large"]; $pu = $var["SP_prix"]; ?> <div class="produit"> <a href='javascript:popup("affiche.php?id=<? echo $id; ?>")'><img src="<? echo $mini; ?>" /></a> <form method="get" action="shop.php"> <input type="hidden" name="ajout" value="AJOUT"> <input type="hidden" name="nom" value="<?= $nom ?>"> <input type="hidden" name="pu" value="<?= $pu ?>"> <select name="qt" class="form"> <option value="1" selected>1</option> <option value="2">2</option> <option value="3">3</option> </select> <input type="submit" value="Ajouter" class="form"> </form> </div> <? } ?> </div>

par Cyrano » 14 juin 2005, 12:30

Bon, décidément, ça me réussit pas de faire plusieurs trucs en même temps: voilà le corrigé, je suis complètement à l'ouest ce matin:
<?php
session_start();

if (isset($_SESSION["caddie"]))
{
    $caddie = $_SESSION["caddie"];
}
else
{
    $caddie = array("Produit"=> array());
    $caddie['Produit']['Nom'] = array();
    $caddie['Produit']['Quantité'] = array();
    $caddie['Produit']['Sous total'] = array();
}


if (isset($_GET["ajout"]))
{
    $nom = $_GET['nom'];
    $qt = $_GET['qt'];
    $pu = $_GET['pu'];
    $sub = $qt * $pu;
    array_push($caddie['Produit']['Nom'], $nom);
    array_push($caddie['Produit']['Quantité'], $pu);
    array_push($caddie['Produit']['Sous total'], $sub);

    $_SESSION["caddie"] = $caddie;
    header("Location: ".$_SERVER["PHP_SELF"]);
    die();
}
?>

par Cyrano » 14 juin 2005, 12:27

oups, j'ai oublié d'enlever une ligne, j'édite le précédent plutôt que de reposter.

par xgregx » 14 juin 2005, 12:10

Je suis désolé mais rebelotte !
Merci pour ton aide en tout cas !
Ca fait plaisir !
Warning: First argument to array_push() needs to be an array in d:\easyphp\www\odonae\shop\shop.php on line 25

Warning: First argument to array_push() needs to be an array in d:\easyphp\www\odonae\shop\shop.php on line 26

Warning: First argument to array_push() needs to be an array in d:\easyphp\www\odonae\shop\shop.php on line 27

Warning: Cannot add header information - headers already sent by (output started at d:\easyphp\www\odonae\shop\shop.php:25) in d:\easyphp\www\odonae\shop\shop.php on line 30

par Cyrano » 14 juin 2005, 12:04

Autant pour moi, j'ai oublié un morceau de code:
<?php
session_start();

if (isset($_SESSION["caddie"]))
{
    $caddie = $_SESSION["caddie"];
}
else
{
    $caddie = array();
    $caddie = array("Produit"=> array("Nom", "Quantité", "Prix unitaire", "Sous total"));
}

$nom = $_GET['nom'];
$qt = $_GET['qt'];
$pu = $_GET['pu'];
$sub = $qt * $pu;

$caddie['Produit']['Nom'] = array();
$caddie['Produit']['Quantité'] = array();
$caddie['Produit']['Sous total'] = array();
if (isset($_GET["ajout"]))
{
    array_push($caddie['Produit']['Nom'], $nom);
    array_push($caddie['Produit']['Quantité'], $pu);
    array_push($caddie['Produit']['Sous total'], $sub);

    $_SESSION["caddie"] = $caddie;
    header("Location: ".$_SERVER["PHP_SELF"]);
    die();
}
?>

par xgregx » 14 juin 2005, 12:02

Là j'ai un...
Warning: First argument to array_push() needs to be an array in d:\easyphp\www\odonae\shop\shop.php on line 22
...que je ne comprends pas. ça te parle à toi Cyrano?

par Cyrano » 14 juin 2005, 11:52

Essaye comme ça :
<?php
session_start();

if (isset($_SESSION["caddie"]))
{
    $caddie = $_SESSION["caddie"];
}
else
{
    $caddie = array();
    $caddie = array("Produit"=> array("Nom", "Quantité", "Prix unitaire", "Sous total"));
}

$nom = $_GET['nom'];
$qt = $_GET['qt'];
$pu = $_GET['pu'];
$sub = $qt * $pu;

if (isset($_GET["ajout"]))
{
    $caddie = array("Produit"=> array("Nom" => $nom, "Quantité"=>$qt, "Prix unitaire"=>$pu, "Sous total"=>$sub));
    array_push($caddie['Produit']['Nom'], $nom);
    array_push($caddie['Produit']['Quantité'], $pu);
    array_push($caddie['Produit']['Sous total'], $sub);

    $_SESSION["caddie"] = $caddie;
    header("Location: ".$_SERVER["PHP_SELF"]);
    die();
}
?>

par xgregx » 14 juin 2005, 11:14

Voilà mon code, j'ai un peu avancé.
J'ai bien UN enregistrement mais, j'en veux plusieur mais je ne sais pas comment avancer mon curseur dans mon tableau
session_start();

if (isset($_SESSION["caddie"])) {
        $caddie = $_SESSION["caddie"];
    } else {
        $caddie = array();
    }     

$nom = $_GET['nom'];
$qt = $_GET['qt'];
$pu = $_GET['pu'];
$sub = $qt * $pu;

if (isset($_GET["ajout"])) {      
$caddie = array(Produit=> array(Nom => $nom, Quantité=>$qt, "Prix unitaire"=>$pu, "Sous total"=>$sub));

              
$_SESSION["caddie"] = $caddie;
header("Location: ".$_SERVER["PHP_SELF"]);
die();
} 
Pour lire mon tableau, là il me lit que le dernier enregistrement.

foreach($caddie as $clef => $valeur){
	foreach($caddie[$clef] as $clef2 => $valeur2)
		echo $clef2." : ".$valeur2."<br>\n";
}

par Cyrano » 14 juin 2005, 11:04

fais un var_dump($_SESSION['caddie']); pour voir au juste comment récupérer quoi:
Comme tu as de multiples dimensions, il faut que pour lire ça dans une boucle tu fasses des comptage et que tu indiques à quel niveau il faut compter.

Fais nous voir la structure de ton tableau $_SESSION['caddie'].