8719 sujets

Développement web côté serveur, CMS

Pages :
Salut,

Je fais face à un problème en PHP que je ne sait pas trop comment résoudre, vu que je tourne en rond depuis un moment. Smiley lol

Je dois créer un panier basique (il n'y aura pas de paiement donc je n'ai pas jugé nécessaire de créer un panier complexe puisqu'il dois juste avoir un récapitulatif des articles).

Je travaille sous wordpress, et j'ai testé différentes solutions avec des tableaux mais rien n'y fais. Je veux récupérer les informations de mes input par $_POST et les stocker dans une variable de session, par exemple $_SESSION ['panier']. Le seul succès que j'ai eu pour le moment c'est d'arriver à faire une boucle du style.

    foreach ($_POST as $key => $val) {
    if (!isset($_SESSION[$key]) || ($val !== $_SESSION[$key])) {
        $_SESSION[$key] = $val;
    }
} 


Chaque fois que j'ajoute un article, ils s'ajoutent automatiquement à la suite, mon soucis est que j'ai d'autre variable de sessions, et que j'aimerais que les informations de $post soient dans une nouvelle variable, donc on obtiendrais un truc du style
$_SESSION['panier'] = array ($article1 => prix, $article2 =>prix);
et ainsi de suite. Je ne suis pas super fortiche en php et tout ce que cela m'a ammené à faire c'est que chaque fois que j'ajoute un article cela efface le précédent.

Comment faire? Merci d'avance de votre aide.
Modifié par CroiSciento (03 Jun 2014 - 11:34)
Quelque chose comme ça devrait te convenir :

foreach ($_POST as $key => $val) {
    if (!isset($_SESSION['panier'][$key]) || ($val !== $_SESSION['panier'][$key])) {
        $_SESSION['panier'][$key] = $val;
    }
} 
Salut, merci de ta réponse c'est exactement ce que je recherchais. J'avais déjà mis la même ligne de code, sauf que mon if était différent. Pourrais tu m'expliquer la condition? Je t'avoues que j'ai un peu de mal.
Je t'avoue que j'ai repris ta condition sans y réfléchir. Il me manque des informations pour écrire la condition correct. Je pense que si tu as fait ça c'est pour ne pas écraser d'article dans ton panier. Pour faire bien il me faudrait le print_r de ton $_POST.
J'avais fais une boucle foreach de base mais chaque fois mes articles étaient écrasés, en cherchant sur le net je suis tombé sur ces deux conditions, mais j'avoue que j'ai repris sans trop avoir compris... Smiley sweatdrop

Voici mon formulaire :
         <form action="" method="POST">
        <input type="submit" value="Ajouter au panier" id="add_basket">
        <input type="hidden" name="<?php the_title(); ?>" value="<?php $prix = get_post_meta(get_the_ID(), '_prix', true);  echo $prix;?>">
        </form>


Et le print_r de $_POST :
Array
(
    [WoodFord_–_Reserve_Double_Oaked] => 50€
)
Désolé du double post, mais je viens de me rendre compte que la solution n'est pas totalement ce que je recherche.

Je compte ajouter un compteur, du coup le système ne marche plus car c'est un tableau qui ne contient que le titre de l'article => prix. Je voudrais obtenir un truc du style :


$_SESSION['panier'] = array(
    array(
         label => nom1,
         prix => prix,
         quantite => 1,  
        );
    array(
         label => nom2,
         prix => prix,
         quantite => 5,  
        );
    );
?>


De ce fait, je pourrais ajouter un input qui change la valeur directement, parce que là le système que j'ai est assez limité.

Merci d'avance pour votre attention. Smiley biggol
Voilà un petit exemple qui je l'espère t'aidera..


<?php
	$liste=array();


        //sert a créer ta session de panier si elle n'existe pas..
	if (!isset($_SESSION['panier'])) $_SESSION['panier']=array();
	
			        //nom       prix
	$liste[]=array("un pinceau","1eu");
	$liste[]=array("un crayon","2eu");
	$liste[]=array("un cochon :O","3eu");
	foreach ($liste as $val) $_SESSION['panier'][]=$val;

       //on créer un liste de base..


    echo "Mon panier de session<br><br>";

    foreach ($_SESSION['panier'] as $val) {
    	 echo $val[0]."=".$val[1]."<br>";
    }
    // on affiche ce qu'il y a dans la session (panier)   val[0]=titre et val[1] = prix



    echo "<br><br>Mon panier de Liste 1<br><br>";


        $liste1=array();
	
			        //nom   prix
	$liste1[]=array("livre","1eu");
	$liste1[]=array("cd","2eu");
	$liste1[]=array("film","3eu");

        //on crée une liste différente pour l'ajouter a notre panier

	$liste2=array(); 
	
			           //nom       prix
	$liste2[]=array("un pinceau","1eu");
	$liste2[]=array("un crayon","2eu");
	$liste2[]=array("un cochon :O","3eu");

        //on crée une liste identique pour l'ajouter a notre panier pour vérifier le fait que ca s'écrase pas
    
    foreach ($liste1 as $val) {
    	 echo $val[0]."=".$val[1]."<br>";
    	 $_SESSION['panier'][]=$val;
    }
      // affichage et ajout de la liste 1

    echo "<br><br>Mon panier de Liste 2<br><br>";

    foreach ($liste2 as $val) {
    	 echo $val[0]."=".$val[1]."<br>";
    	 $_SESSION['panier'][]=$val;
    }

     // affichage et ajout de la liste 2

    echo "<br><br>Mon panier du \$_POST<br><br>";

    if (isset($_POST) && !empty($_POST)) {
		foreach ($_POST as $key => $val) {
			if (!isset($_SESSION['panier'])) $_SESSION['panier']=array(); //si ton panier de session existe pas, on le crée..
                        echo $key."=".$val."<br>";
			$_SESSION['panier'][]=array($key,$val);
		}
	}
	else echo "<i>C'est vide...</i>";




    echo "<br><br>Mon panier final de session<br><br>";
        foreach ($_SESSION['panier'] as $val) {
    	 echo $val[0]."=".$val[1]."<br>";
    }

     // affichage du contenu final...

?>


Et pour ton code html, c'est assez moche de mélanger html et php tu devrais plutôt optez pour quelque chose de plus lisible comme :


<?php

$nom=the_title();
$prix = get_post_meta(get_the_ID(), '_prix', true);

echo "<form action='#' method='POST'>
        <input type='submit' value='Ajouter au panier' id='add_basket' />
        <input type='hidden' name='".$nom."' value='".$prix."' />
        </form>";
?>


EDIT: Je viens de voir ton message... tu peux effectivement ajouter un champ quantité :

                      // val[0] val[1]  val[2] dans les foreach de mon exemple..
$objet=array("nom","prix","quantite");


Voilà Smiley cligne
Modifié par Derlys (03 Jun 2014 - 16:00)
Salut, merci beaucoup de ta réponse ça m'aide vraiment. Je cherchais à faire exactement la même chose. Cependant comment faire pour ajouter la quantité? J'ai essayé de comprendre avec ton exemple tout à la fin de ton post mais je n'y arrive pas...

Voici ce que j'ai pour le moment :



    if(isset($_POST) && !empty($_POST)) {
        foreach($_POST as $key => $val) {
            if(!isset($_SESSION['panier_test'])) $_SESSION['panier_test'] = array();
            // Si le panier de n'existe pas on le créer
            $key = str_replace('_', ' ', $key);
            echo $key."=".$val."</br>";
            $_SESSION['panier_test'][] = array($key,$val);
        }
    }
    else echo "<i> Le panier est vide... </i>";

    echo "<br><br>Mon panier final de session<br><br>";
        foreach ($_SESSION['panier_test'] as $val) {
        $val = str_replace('_', ' ', $val);
         echo $val[0]."=".$val[1]."<br>";
    }



Je vais aussi ajouter un système pour vérifier que la clef et la valeur de $_POST ne correspondent pas à celle dans $_SESSION['panier_test'] pour éviter de l'ajouter deux fois.

Merci encore! Smiley murf
J'ai une dernière question :

foreach ($_SESSION['panier_test'] as $val) {
        $val = str_replace('_', ' ', $val);
         echo $val[0]."=".$val[1]."<br>";
    }


Comment se fait t'il qu'il suffise de faire $val[0] pour afficher le contenu de chaque tableau, c'est un tableau en deux dimensions. Sans boucle pour accéder à la première valeur je verrais $_SESSION['panier_test'][0][1]... Smiley confus
Et donc dans une boucle foreach ça donne :

$val = $_SESSION['panier_test'][0]
$val = $_SESSION['panier_test'][1]
$val = $_SESSION['panier_test'][2]
....

donc $val[0] = première valeur de $_SESSION['panier_test'][0], etc.
Mon print_r :

Array
(
    [0] => Array
        (
            [0] => WoodFord – Reserve Double Oaked
            [1] => 50€
        )

)


Vu que c'est un tableau dans un tableau pour moi $_SESSION['panier_test'][0] c'est mon premier tableau et pas ma première valeur. Smiley confus
Salut,

Je vais te mettre un autre petit exemple assez détaillé Smiley lol


<?php
	$liste=array(); //liste de base supposée déjà existante
	if (!isset($_SESSION['panier'])) $_SESSION['panier']=array();
	
			     //nom  prix quantite
	$objet1=array("un pinceau","1eu","1");
	$objet2=array("un crayon","2eu","2");
	$objet3=array("un cochon :O","3eu","3");
    // je crée 3 objets...

    /* 
    A savoir : 
    $objet1[0] = "un pinceau"
    $objet1[1] = "1eu"
    $objet1[2] = "1"

    */


    //j'ajoute ces objets a une liste..
    // le [] ajoute à l'id suivant, comme la liste est vide l'id de début est 0 ce qui donne :
    $liste[]=$objet1; //$liste[0]=$objet1;
    $liste[]=$objet2; //$liste[1]=$objet2;
    $liste[]=$objet3; //$liste[2]=$objet3;

    /* 
    A savoir : 
    $liste[0][0] = "un pinceau"
    $liste[0][1] = "1eu"
    $liste[0][2] = "1"

    $liste[1][0] = "un crayon"
    $liste[1][1] = "2eu"
    $liste[1][2] = "2"

    */

	foreach ($liste as $val) $_SESSION['panier'][]=$val;
	//pour chaque objet de la liste, on l'ajoute au panier ce qui donne quelque chose de similaire si la panier de la session était vide soit :

	/* 
    A savoir : (Si le panier était vide)
    $_SESSION['panier'][0][0] = "un pinceau"
    $_SESSION['panier'][0][1] = "1eu"
    $_SESSION['panier'][0][2] = "1"

    $_SESSION['panier'][1][0] = "un crayon"
    $_SESSION['panier'][1][1] = "2eu"
    $_SESSION['panier'][1][2] = "2"

    */


    //Et un petit affichage pour que tu puisses voir le résultat..
	echo "Mon panier de session<br><br>";
    foreach ($_SESSION['panier'] as $val) { //a chaque fois qu'il existe une valeur, $val=$_SESSION['panier'][n] avec n l'id de l'objet
    	 echo "objet=".$val[0]." prix=".$val[1]." quantite=".$val[2]."<br>";
    	 // $val[0] = $_SESSION['panier'][n][0];      soit le nom
    	 // $val[1] = $_SESSION['panier'][n][1];      soit le prix
    	 // $val[2] = $_SESSION['panier'][n][2];      soit la quantité
    }
?>


Après je ne sais pas trop ce que tu dois faire réellement mais il ne te reste plus qu'a bien envoyer les informations en POST et les utilisées correctement.. Smiley langue
Merci de ta réponse, j'ai plusieurs questions :

- Ton système fonctionne car tu créer un array d'objet avec 3 valeur. Cependant dans la boucle que tu m'a passé plus tôt on ne peut justement que en créer 2 de ces valeurs :

if(isset($_POST) && !empty($_POST)) {
        foreach($_POST as $key => $val) {
            if(!isset($_SESSION['panier_test'])) $_SESSION['panier_test'] = array();
            // Si le panier de n'existe pas on le créer
            $key = str_replace('_', ' ', $key);
            echo $key."=".$val."</br>";
            $_SESSION['panier_test'][] = array($key,$val);
        }
    }


Comment faire pour que $_SESSION['panier_test'][] = array($key,$val, $quantite); ? C'est là le gros problème.

- Je peut paraître bête mais l'écriture du foreach ne me semble pas logique :
//Et un petit affichage pour que tu puisses voir le résultat..
	echo "Mon panier de session<br><br>";
    foreach ($_SESSION['panier'] as $val) { //a chaque fois qu'il existe une valeur, $val=$_SESSION['panier'][n] avec n l'id de l'objet
    	 echo "objet=".$val[0]." prix=".$val[1]." quantite=".$val[2]."<br>";
    	 // $val[0] = $_SESSION['panier'][n][0];      soit le nom
    	 // $val[1] = $_SESSION['panier'][n][1];      soit le prix
    	 // $val[2] = $_SESSION['panier'][n][2];      soit la quantité
    }


Pourquoi $_SESSION['panier'] as $val met automatiquement $val=$_SESSION['panier'][n] ? Imaginons que je veuille juste afficher le "premier degré" de mon tableau vu que dans la boucle $val[0] signifie $_SESSION['panier'][n][0] comment afficher juste $_SESSION['panier'][n]?

Sinon je cherche aussi à reprendre l'image de mon post et le stocker dans un input, mais c'est secondaire car c'est mon tout premier panier et cela ne me fait rien si je ne peut pas avoir l'image. Je mettrais aussi un système de compteur sur la page du panier pour pouvoir incrémenter cette valeur afin que lorsqu'on valide la commande tout soit bien enregistré dans un tableau. Smiley lol
Re,

CroiSciento a écrit :

- Ton système fonctionne car tu créer un array d'objet avec 3 valeur. Cependant dans la boucle que tu m'a passé plus tôt on ne peut justement que en créer 2 de ces valeurs :


if(isset($_POST) && !empty($_POST)) {
        foreach($_POST as $key => $val) {
            if(!isset($_SESSION['panier_test'])) $_SESSION['panier_test'] = array();
            // Si le panier de n'existe pas on le créer
            $key = str_replace('_', ' ', $key);
            echo $key."=".$val."</br>";
            $_SESSION['panier_test'][] = array($key,$val);
        }
}


Comment faire pour que $_SESSION['panier_test'][] = array($key,$val, $quantite); ? C'est là le gros problème.



Tout à fait, car au début tu envoyais et recevais des informations sous la forme :
$_POST['nom']=valeur;

Mais maintenant tu veux envoyer plusieurs valeurs (nom,prix et quantité) donc tu dois changer ton code html.. et y adapter ton code php.. cependant la structure de ton code html va dépendre de comment tu comptes envoyer les données, un formulaire par objet ? un formulaire pour plusieurs objets ?

Si c'est un seul tu peux faire quelque chose comme ça :

$nom="un pinceau";
$prix = "1eu";
$quantite = "1";

<form action='#' method='POST'>
	<input type='hidden' name='nom' value='".$nom."' />
	<input type='hidden' name='prix' value='".$prix."' />
	<input type='hidden' name='quantite' value='".$quantite."' />
	<input type='submit' value='Ajouter au panier' />
</form>

if (isset($_POST) && !empty($_POST)) {
	if (isset($_POST['nom'])) $reception_nom=$_POST['nom'];
	if (isset($_POST['prix'])) $reception_prix=$_POST['prix'];
	if (isset($_POST['quantite'])) $reception_quantite=$_POST['quantite'];

	if ($reception_nom!=null && $reception_prix!=null && $reception_quantite!=null) {
		$objet=array($reception_nom,$reception_prix,$reception_quantite);
		if(!isset($_SESSION['panier_test'])) $_SESSION['panier_test'] = array();
		$_SESSION['panier_test'][] = $objet;
	}
}


Sinon, il faudra trouver un autre moyen d'envoyer/recevoir tes informations..


CroiSciento a écrit :

- Je peut paraître bête mais l'écriture du foreach ne me semble pas logique :

//Et un petit affichage pour que tu puisses voir le résultat..
	echo "Mon panier de session<br><br>";
    foreach ($_SESSION['panier'] as $val) { //a chaque fois qu'il existe une valeur, $val=$_SESSION['panier'][n] avec n l'id de l'objet
    	 echo "objet=".$val[0]." prix=".$val[1]." quantite=".$val[2]."<br>";
    	 // $val[0] = $_SESSION['panier'][n][0];      soit le nom
    	 // $val[1] = $_SESSION['panier'][n][1];      soit le prix
    	 // $val[2] = $_SESSION['panier'][n][2];      soit la quantité
}


Pourquoi $_SESSION['panier'] as $val met automatiquement $val=$_SESSION['panier'][n] ? Imaginons que je veuille juste afficher le "premier degré" de mon tableau vu que dans la boucle $val[0] signifie $_SESSION['panier'][n][0] comment afficher juste $_SESSION['panier'][n]?



Le but d'un foreach est de parcourir un tableau sans se soucier d'une logique quelconque par rapport a la clé primaire, il peut te parcourir n'importe quel tableau *-*.
Donc quand tu fais :
$_SESSION['panier'] as $val

Pour chaque élément de ton panier, il va créer une variable $val qui correspond a ton objet

En gros ici ça revient a faire :

for ($i=0;$i<$_SESSION['panier'].length;$i++) {
     $val=$_SESSION['panier'][$i];
     echo "objet=".$val[0]." prix=".$val[1]." quantite=".$val[2]."<br>";
}

Sauf que le foreach s'en fou royalement de la logique d'incrémentation et de savoir si la clé (ici le $i) est un entier ou une chaine de caractère ou un tableau, ou je ne sais quoi d'autre !

Donc si tu veux afficher juste $_SESSION['panier'][n] dans ton foreach il te suffit d'afficher, $val mais étant donné qu'il s'agit d'un tableau, ça n'a pas grand intérêt.. Mais ça donnerait ça :

foreach ($_SESSION['panier'] as $val) { // pour chaque objet dans ton panier, ca effectue les lignes ci-dessous ($val est ton objet courant)
     echo $val."<br>"; // ce qui affichera : Array et si tu print_r : Array('0'=>'nom','1'=>'prix','2'=>'quantite') ou quelque chose comme ça ^^
}



Si tu as d'autres questions ^^
Modifié par Derlys (04 Jun 2014 - 11:02)
D'accord, c'était tout bête en fait l'histoire de créer un objet avec les informations de $_POST je me sens bête Smiley confused

Sinon, merci de l'explication pour la boucle foreach, je ne l'ai vu que y'a quelques semaines et j'avais encore un peu de mal parce qu'avant dans mes études on m'a fait fonctionné avec des boucles for/while. Smiley biggrin

Ton système est exactement ce que je recherchais, merci de ton explication c'est clair et précis. Je reposterais si jamais j'ai d'autres soucis ! Smiley murf
De rien, j'étais entrain de faire un petit script de test si jamais ça t'intéresse je le poste quand même.


<?php

session_start();

if (isset($_POST['vider'])) {
	session_destroy();
	session_start();
}


$nom="un pinceau";
$prix = "1eu";
$quantite = "1";
echo "
<form action='#' method='POST'>
	<input type='hidden' name='nom' value='".$nom."' />
	<input type='hidden' name='prix' value='".$prix."' />
	<input type='hidden' name='quantite' value='".$quantite."' />
	<input type='submit' value='Ajouter un pinceau' />
</form>";

$nom="un crayon";
$prix = "2eu";
$quantite = "1";
echo "
<form action='#' method='POST'>
	<input type='hidden' name='nom' value='".$nom."' />
	<input type='hidden' name='prix' value='".$prix."' />
	<input type='hidden' name='quantite' value='".$quantite."' />
	<input type='submit' value='Ajouter un crayon' />
</form>";

$nom="un cochon :O";
$prix = "3eu";
$quantite = "1";
echo "
<form action='#' method='POST'>
	<input type='hidden' name='nom' value='".$nom."' />
	<input type='hidden' name='prix' value='".$prix."' />
	<input type='hidden' name='quantite' value='".$quantite."' />
	<input type='submit' value='Ajouter un cochon :O' />
</form>";

echo "
<form action='#' method='POST'>
	<input type='hidden' name='vider' />
	<input type='submit' value='Vider le panier' />
</form>";

if (isset($_POST) && !empty($_POST)) {
	if (isset($_POST['nom'])) $reception_nom=$_POST['nom'];
	if (isset($_POST['prix'])) $reception_prix=$_POST['prix'];
	if (isset($_POST['quantite'])) $reception_quantite=$_POST['quantite'];

	if ($reception_nom!=null && $reception_prix!=null && $reception_quantite!=null) {
		$objet=array($reception_nom,$reception_prix,$reception_quantite);
		if(!isset($_SESSION['panier'])) $_SESSION['panier'] = array();
		$_SESSION['panier'][] = $objet;
	}
}

if (isset($_SESSION['panier']) && !empty($_SESSION['panier'])) {
	echo "<h3>Mon panier</h3>";
    foreach ($_SESSION['panier'] as $key=>$val) {
    	 echo "id=".$key." objet=".$val[0]." prix=".$val[1]." quantite=".$val[2]."<br>";
    }
    echo "<br><br>";
}
?>


Bon amusement Smiley cligne
Modifié par Derlys (04 Jun 2014 - 11:29)
Je suis en train d'essayer d'effectuer une vérification pour éviter de recréer un array si un article existe déjà, je voudrais juste incrémenter le prix si un article du même nom existe déjà.

Je suis arrivé sur ça, cela ne fonctionne pas mais je sais pourquoi :

if (isset($_POST) && !empty($_POST)) {
    if (isset($_POST['nom'])) $reception_nom=$_POST['nom'];
    if (isset($_POST['prix'])) $reception_prix=$_POST['prix'];
    if (isset($_POST['quantite'])) $reception_quantite=$_POST['quantite'];

    if ($reception_nom!=null && $reception_prix!=null && $reception_quantite!=null) {
        foreach($_SESSION['panier'] as $val) {
            if ($val[0] == $reception_nom) {
                $val[2]++;
            }
            else {
                $objet=array($reception_nom,$reception_prix,$reception_quantite);
                if(!isset($_SESSION['panier'])) $_SESSION['panier'] = array();
                $_SESSION['panier'][] = $objet;
            }
        }

    }
}


J'ai un if/else dans mon foreach, qui logiquement est censé répéter la même chose chaque fois je parcours mon tableau, sauf que je ne sais pas comment parcourir tout mon tableau afin de vérifier que la première case n'est pas égale à $reception_prix. Du coup je suis un peu perdu, et je t'avoue que les tableaux c'est pas mon fort étant donné que je les ai très peu utilisé.
Modifié par CroiSciento (04 Jun 2014 - 12:21)
Enjoy Smiley cligne


if (isset($_POST) && !empty($_POST)) {
	if (isset($_POST['nom'])) $reception_nom=$_POST['nom'];
	if (isset($_POST['prix'])) $reception_prix=$_POST['prix'];
	if (isset($_POST['quantite'])) $reception_quantite=$_POST['quantite'];

	if ($reception_nom!=null && $reception_prix!=null && $reception_quantite!=null) {
		$existe=false; //on considère que l'objet que tu veux ajouter n'existe pas !

		if (isset($_SESSION['panier']) && !empty($_SESSION['panier'])) { // Si j'ai un panier... je vérifie
	        foreach($_SESSION['panier'] as $key=>$val) { //on regarde chaque objet
	            if ($val[0] == $reception_nom && $val[1] == $reception_prix) { // Si on trouve un objet avec le même nom et le même prix
	                $existe=true; //on indique qu'il existe
	                $_SESSION['panier'][$key][2]++; //on incrémente la quantité de 1 ($key correspond a l'id de l'objet, on doit modifier la valeur dans la session et non dans le foreach)
	            }
	            //Si on a rien on est juste tombé sur un nom différent mais on doit quand même vérifier les autres nom avant de savoir si on doit l'ajouter ou pas !
	        }
	        // Ici j'aurais vérifié tous les noms et je saurais si il était déjà existant grâce à $existe, si il éxistait il a été incrémenté avant
   		}

        //Donc on gère le cas où il n'existe pas, on l'ajoute !
        if (!$existe) {
        	$objet=array($reception_nom,$reception_prix,$reception_quantite);
        	if(!isset($_SESSION['panier'])) $_SESSION['panier'] = array();
        	$_SESSION['panier'][] = $objet;
        }
    }
}


Bon par contre au niveau sécurité tu devrais vérifier que ce que t'envoie la personne en POST correspond bien a ce que tu attends sauf si ça n'a pas de grave impact sur tes objectifs. Il faut toujours garder en tête qu'il ne faut jamais faire confiance à ce que t'envoie l'utilisateur et que les informations envoyées en GET/POST sont facilement modifiables..
Modifié par Derlys (04 Jun 2014 - 12:54)
Okay, merci j'ai compris. Effectivement je cherchais comment viser mon article dans la session, mais j'avais totalement oublié que si la condition est vérifié on peut trouver le numéro de l'article. Smiley ravi

J'ai rajouté un bouton pour vider mon panier, mais je n'arrive pas à obtenir le bon résultat :

// Afficher les valeurs du panier et le bouton pour supprimer l'article visé
if (isset($_SESSION['panier']) && !empty($_SESSION['panier'])) {
    echo "<h3>Mon panier</h3>";
    foreach ($_SESSION['panier'] as $key=>$val) {
        echo $val[0]." - ".$val[1]." - ".$val[2]."</br>";
        echo '<form action="#" method="POST">';
        echo '<input type="submit" value="Supprimer du panier">';
        echo '<input type="hidden" name="suppr_panier" value="'.$key.'"></br>';
        echo '</form>';
        if($_POST['suppr_panier'] == $key) unset($_SESSION['panier'][$key]);
    }
    echo "<br><br>";
}
//Vider le panier
 if($_POST['vider_panier'] == "true") {
    unset($_SESSION['panier']);
 }


Unset détruit mon panier, donc du coup quand on appuie pour supprimer le panier l'article ne se supprime pas de suite il faut cliquer une deuxieme fois. J'ai essayé de mettre une variable null à mon array, cependant après il laisse des array vide met le nouveau par dessus dans un nouvel array par ex $panier[0] = null, $panier[1] etc

Je ne pense pas que mettre du html en php soit un bonne idée, mais je fais comme je peut. Smiley lol
Modifié par CroiSciento (04 Jun 2014 - 16:21)
Je comprends pas trop, tu me parles de vider ton panier et ton code permet de retirer un élément Smiley eek

Si tu veux vider le panier totalement tu dois juste reset ton panier comme ça par exemple :

$_SESSION['panier']=array();


Et si tu veux retirer les objets "null" présent dans ton panier tu peux faire quelque chose comme ça :

$save=$_SESSION['panier'];
$_SESSION['panier']=array();
foreach ($save as $objet) if ($objet!=null) $_SESSION['panier'][]=$objet;


CroiSciento a écrit :

du coup quand on appuie pour supprimer le panier l'article ne se supprime pas de suite il faut cliquer une deuxieme fois

Ça veut dire que tu supprimes ton élément après l'avoir affiché Smiley sweatdrop
Du coup ton code est bon, juste mal agencé..

Ce qui donne en mélangeant un peu le tout :


//manipulation pour savoir si on doit vider le panier
if (isset($_POST['vider'])) $_SESSION['panier']=array();

//manipulation pour savoir si on doit retirer un élément
if(isset($_POST['suppr_panier']) {
    $key=htmlentities($_POST['suppr_panier']);
    if(is_numeric($key)) unset($_SESSION['panier'][$key]);
}

//manipulation pour corriger ton problème du : null
$save=$_SESSION['panier'];
$_SESSION['panier']=array();
foreach ($save as $objet) if ($objet!=null) $_SESSION['panier'][]=$objet;

//affichage ton ton panier + boutons
if (isset($_SESSION['panier']) && !empty($_SESSION['panier'])) {
    echo "<h3>Mon panier</h3>";
    foreach ($_SESSION['panier'] as $key=>$val) {
        echo $val[0]." - ".$val[1]." - ".$val[2]."<br>";
        echo '<form action="#" method="POST">';
        echo '<input type="submit" value="Supprimer du panier">';
        echo '<input type="hidden" name="suppr_panier" value="'.$key.'"></br>';
        echo '</form>';
    }
    echo "<br><br>";
}

//affichage du bouton : vider le panier
echo "
<form action='#' method='POST'>
	<input type='hidden' name='vider' />
	<input type='submit' value='Vider le panier' />
</form>";

//et un petit print_r pour vérifier le tout
echo print_r($_SESSION['panier']);


Et pour répondre à ça :
CroiSciento a écrit :

Je ne pense pas que mettre du html en php soit un bonne idée, mais je fais comme je peut. Smiley lol

Pendant ma scolarité on m'a appris à ne pas mélanger les deux pour que ton code reste lisible, pour toi ou les gens qui doivent te lire, c'est du détail comme l'indentation qui permettent de rentre ton code plus propre...

Après si tu préfères lire :

<form action='#' method='POST'>
	<input type='hidden' name='<?php echo $le_nom; ?>' />
	<input type='submit' value='<?php echo $ma_valeur; ?>' />
</form>


que :

echo "
<form action='#' method='POST'>
	<input type='hidden' name='".$le_nom."' />
	<input type='submit' value='".$ma_valeur."' />
</form>";


Je peux plus rien pour toi ! Smiley biggrin
Modifié par Derlys (05 Jun 2014 - 12:06)
Pages :