caddie avec tableau multidimensionnel

Eléphant du PHP | 150 Messages

12 sept. 2005, 11:53

Bonjour à tous,

J'ai essayé de créer un caddie pour mon site en utilisant un tableau multidimensionnel que j'essaye d'alimenter par la méthode POST et des array_push.
Certains de ces array_push font partie de fichiers que j'intègre à mes pages au moyen de require_once, dans le code html.

Le résultat: je n'arrive rien à tirer de mon tableau, mais je peux, naturellement, récuper les données envoyées en méthode POST. Ce qui veut dire que mon tableau ne sert à rien...

Quelqu'un peut m'aider????

Voici le code qui crée mon caddie:

<?php

session_start();

if (isset($_POST["Commander"])) {

$qt = $_POST['quantite'];

array_push($_SESSION ['caddie']['produit']['quantite'], $qt);

array_push($_SESSION ['caddie']['produit']['reference'], $refprod);

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

if (isset($_POST["Valider"])) {
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$adresse = $_POST['adresse'];
$codepostal = $_POST['codepostal'];
$ville = $_POST['ville'];
$pays = $_POST['pays'];
$telephone = $_POST['telephone'];
$email = $_POST['email'];
$bat = $_POST['batiment'];
$etage = $_POST['etage'];

array_push($_SESSION['caddie']['facture']['client']['nom'],$nom);
array_push($_SESSION['caddie']['facture']['client']['prenom'],$prenom);
array_push($_SESSION['caddie']['facture']['client']['adresse'],$adresse);
array_push($_SESSION['caddie']['facture']['client']['codepostal'],$codepostal);
array_push($_SESSION['caddie']['facture']['client']['ville'],$ville);
array_push($_SESSION['caddie']['facture']['client']['pays'],$pays);
array_push($_SESSION['caddie']['facture']['client']['telephone'],$telephone);
array_push($_SESSION['caddie']['facture']['client']['email'],$email);
array_push($_SESSION['caddie']['facture']['client']['batiment'],$bat);
array_push($_SESSION['caddie']['facture']['client']['etage'],$etage);


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

if(!isset($_SESSION['caddie']))
{
$_SESSION['caddie'] = array(
"session"=> session_id(),
"aujourdhui" => date("Y-m-d"),
"produit" => array(
"reference" => array(),
"quantite" => array(),
"prixunitaire" => array(),
"prixactuel" => array(),
"totalproduit" => array(),
"acompteproduit" => array(),
"soldeproduit" => array(),
),
"facture"=> array (
"total" => array(
"total" => array(),
"acompte" => array(),
"solde" => array(),
),
"clients" => array(
"nom" => array(),
"prenom" => array(),
"adresse" => array(),
"codepostal" => array(),
"batiment" => array(),
"etage" => array(),
"ville" => array(),
"pays" => array(),
"telephone" => array(),
"email" => array(),
)
)
);
}

else{
$caddie=$_SESSION['caddie'];
}

?>

Puis un exemple de fichier inclus dans le code html:

<?php

$mysql_link = mysql_connect('................................');
$requete = $ref;
$result = mysql_db_query('.............', $requete);
$refprod = mysql_fetch_array($result);
echo $refprod[cp_prod_prod];
mysql_close ();

array_push($_SESSION [$caddie]['produit']['reference'], $refprod);

?>

Donc, quand de demande d'afficher qqc dans mon panier avec un :

echo 'Références: '.$_SESSION['refprod'];

... il ne se passe rien. Ou si, un humiliant: "Références:" !!!

Merci de votre aide.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 sept. 2005, 13:39

ton code contient des erreurs logiques.
1° certaines partie du code reposent sur la variable $caddie qui n'est créée qu'à la fin (et encore: il y a une erreur dans le if de création)
En fait tu n'a pas besoin de cette variable puisque tout le code manipule directement $_SESSION['caddie'] c'est à dire le caddie sauvegardé dans la session. C'est donc une erreur d'utiliser $caddie en parallèle vu qu'en aucun moment tu ne récupère d'abord le caddie de la session dans cette variable.
Le plus simple alors est de :
* virer la variable $caddie
* créer un caddie de session vide si ce dernier n'existe pas
* et ensite traiter les actions Commander et Valider (ces actions manipulent directement la caddie de la session ce qui est trés bien.

2° Dans le code et à chaque fin d'action, ton header réappelle la même page ce qui ne sert à rien de même que le die(). Il aurait suffit de structurer l'arbre des if pour acheminer vers la fin du script en utilisant un else if entre actions.

Pourquoi? tout simplement car ton header réappelle la page et réexécute donc le même script une deuxième fois (ralentissement des temps de réponse) d'autant plus que lorsque tu fais :
header("Location: ".$_SERVER["PHP_SELF"]);
die();
non seulement die() n'est pas atteinte mais aussi tu réappelle la même page PHP_SELF sans paramètres ; conséquence : le script est réexécuté et tous les if sont sautés : seule la fin du script est exécutée.
C'est exactement le comportement attendu sans l'utilisation des header.
Moralité : ton header de PHP_SELF complique bien les choses.


Le nouveau code corrigé que je te propose est le suivant :
<?php 
session_start();
//Emplacement modifié : effectivement il faut d'abord créer le caddie s'il n'existe pas
//ATTENTION: le code agit directement sur le caddie de la session, une variable $caddie n'est plus utile 
if(!isset($_SESSION['caddie'])) 
{ 
$_SESSION['caddie'] = array( 
"session"=> session_id(), 
"aujourdhui" => date("Y-m-d"), 
"produit" => array( 
"reference" => array(), 
"quantite" => array(), 
"prixunitaire" => array(), 
"prixactuel" => array(), 
"totalproduit" => array(), 
"acompteproduit" => array(), 
"soldeproduit" => array(), 
), 
"facture"=> array ( 
"total" => array( 
"total" => array(), 
"acompte" => array(), 
"solde" => array(), 
), 
"clients" => array( 
"nom" => array(), 
"prenom" => array(), 
"adresse" => array(), 
"codeGETal" => array(), 
"batiment" => array(), 
"etage" => array(), 
"ville" => array(), 
"pays" => array(), 
"telephone" => array(), 
"email" => array(), 
) 
) 
); 
} 


//Ajout dans le caddie
if (isset($_GET["Commander"])) { 

$qt = $_GET['quantite'];
//NB: cette partie du code utlise $refprod qui doit avoir une valeur auparavant
//Cette ligne est ajoutée pour des soucis de test
$refprod = $_GET['refprod'];

array_push($_SESSION ['caddie']['produit']['quantite'], $qt); 

array_push($_SESSION ['caddie']['produit']['reference'], $refprod); 
 
} 

//Validation du caddie
else if (isset($_GET["Valider"])) { 
$nom = $_GET['nom']; 
$prenom = $_GET['prenom']; 
$adresse = $_GET['adresse']; 
$codeGETal = $_GET['codeGETal']; 
$ville = $_GET['ville']; 
$pays = $_GET['pays']; 
$telephone = $_GET['telephone']; 
$email = $_GET['email']; 
$bat = $_GET['batiment']; 
$etage = $_GET['etage']; 

array_push($_SESSION['caddie']['facture']['client']['nom'],$nom); 
array_push($_SESSION['caddie']['facture']['client']['prenom'],$prenom); 
array_push($_SESSION['caddie']['facture']['client']['adresse'],$adresse); 
array_push($_SESSION['caddie']['facture']['client']['codeGETal'],$codeGETal); 
array_push($_SESSION['caddie']['facture']['client']['ville'],$ville); 
array_push($_SESSION['caddie']['facture']['client']['pays'],$pays); 
array_push($_SESSION['caddie']['facture']['client']['telephone'],$telephone); 
array_push($_SESSION['caddie']['facture']['client']['email'],$email); 
array_push($_SESSION['caddie']['facture']['client']['batiment'],$bat); 
array_push($_SESSION['caddie']['facture']['client']['etage'],$etage); 

} 

//Test de déboggage
print_r($_SESSION['caddie']);

?>  
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 150 Messages

12 sept. 2005, 15:07

merci, ça marche beaucoup mieux comme ça en effet :D

mais j'ai un problème le code suivant:

$total_prod = $pa * $qt;
array_push($_SESSION ['caddie']['produit']['totalproduit'],$total_prod);

$acompte_prod = ($pu * $qt) / 2;
array_push($_SESSION ['caddie']['produit']['acompteproduit'],$acompte_prod);

$solde_prod = $total_prod - $acompte_prod;
array_push($_SESSION ['caddie']['produit']['soldeproduit'],$solde_prod);

je ne sais pas où le mettre: pour l'instant, impossible de recueillir les valeurs.
N.B. : $pa et $pu viennent de fichiers inclus avec require_once dans le code html et sont des valeurs extraites d'une base sql.
Je les envois dans le tableau à partir du fichier inclus, avec un array_push à la fin de ma requête mysql, et ils aparaissent bien dans mon tableau lors du test de déboggage.

Je crois en fait que $qt et $pa et $pu n'arrivent pas à se rencontrer...

Mammouth du PHP | 19672 Messages

12 sept. 2005, 16:36

Saut,
il y a déja plusieurs semaines, j'avais monté un tuto pour créer un caddie, tu y trouveras sans doutes quelques réponses pratiques.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

12 sept. 2005, 17:07

merci, je vais y jeter un coup d'oeil.

Eléphant du PHP | 150 Messages

16 sept. 2005, 23:13

Bon, après être passé du côté de ton tuto, bien des choses ont avancé.

Merci beaucoup: le caddie en lui-même fonctionne parfaitement.

Mais... je rencontre qqc problèmes pour adapter des fonctions de ton tuto à mon cas particulier, et notamment celle qui permet de voir si un produit est déjà dans le caddie ou pas.

Pourquoi? Pcq la référence du produit est enregistrée ds le tableau de session même si le client ne clique pas dessus.
Donc, j'ai besoin de faire une vérification différente: pour toutes les références produit qui ont une quantité assignée dans le tableau, alors j'affiche qqc comme "Déjà dans ton panier", sinon bouton submit.

Donc, voici le code que j'ai essayé de mettre en place, et qui, bien sûr, ne fonctionne pas:

- NB: les deux fichiers suivants sont appelés dans le code html de la manière suivante:
<?php
       require_once ('deja.php');
       require_once ('affichsubmit.php');
?>
- deja.php:
<?php 

function nombre_article($refprod) 
{ 
    /* On initialise la variable de retour */ 
    $nombre = false; 
    /* Comptage du panier */ 
    $nb_art = count($_SESSION['caddie']['produit']['reference']); 
    /* On parcoure le panier à la recherche de l'article pour vérifier le cas échéant combien sont enregistrés */ 
    for($i = 0; $i < $nb_art; $i++) 
    { 
        if($_SESSION['caddie']['produit']['reference'][$i] == $refprod)   {
        $nombre = $_SESSION['caddie']['produit']['quantite'][$i];
        }
    } 
    return $nombre; 
}
?>
- affichsubmit.php:
<?php

$nombre = nombre_article($refprod);

if ($nombre = false) {
require_once ('boutonsubmit.html');

} else {
require_once ('presproduit.html');
echo $nombre;
}

?>
Apparemment la variable $nombre ne passe pas à ce dernier fichier, et ce que j'obtiens et toujours le résultat de else: donc je crois que je ne parviens pas à réaliser le test pertinent, càd sur la variable de session $qt qui correspond aux quantités du produit en question.

Bref, au secours!!!!

Un dernier truc, la variable correspondant à la référence du produit est elle aussi affichée par un include, un peu plus haut dans mon code.

Merci d'avance de votre aide.

Mammouth du PHP | 19672 Messages

17 sept. 2005, 08:11

...la référence du produit est enregistrée ds le tableau de session même si le client ne clique pas dessus...
Je n'en comprends pas la raison. Le tableau de session "panier" ne doit contenir QUE les articles sélectionnés par le client, donc je ne saisis pas vraiment pourquoi tu les y mettrais même s'il ne les sélectionne pas :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

17 sept. 2005, 09:06

Le problème, c'est que certaines variables sont appelées grâce à des include_once (), à l'intérieur du code html, et que ce sont les fichiers appelés qui contiennent les array_push... :?
tu crois qu'il y a un moyen de faire entrer ces array_push dans cette partie du code:
if (isset($_POST["Commander"])) { 
    
    $qt = $_POST["quantite"];
    
    array_push($_SESSION ['caddie']['produit']['quantite'], $qt);
    
    
    require_once('montantprod.php');
    
    $total_prod = total_prod($qt, $pu, $pa);
    
    array_push($_SESSION['caddie']['produit']['totalproduit'], $total_prod);
    
    
    require_once('acompteprod.php');
    
    $acompte_prod = acompte_prod($qt, $pu, $pa);
    
    array_push($_SESSION['caddie']['produit']['acompteproduit'], $acompte_prod);
    
    
    require_once('soldeprod.php');
    
    $solde_prod = solde_prod($qt, $pu, $pa);
    
    array_push($_SESSION['caddie']['produit']['soldeproduit'], $solde_prod);
}
???

Que je conditionne l'envoi des données relatives au produit par un bouton select ou un truc comme ça?

Tu crois que mon problème avec le script de vérification vient de là?

Mammouth du PHP | 19672 Messages

17 sept. 2005, 09:12

À première vue je dirais non, mais je ne visualise pas l'architecture de ton script de panier :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

17 sept. 2005, 09:25

Voilà le script entier (en sachant que les variables prixunitaire, prixactuel, reference) sont alimentés par des array_push placés ds des fichiers appelés par des include() dans la partie html qui suit ce code :
session_start();

if(!isset($_SESSION['caddie'])) 
{ 
   $_SESSION['caddie'] = array(
                                        "session"=> session_id(), 
                                        "aujourdhui" => date("d-m-Y"),
                                        "produit" => array( 
                                                                "reference" => array(),
                                                                "quantite" => array(),
                                                                "prixunitaire" => array(),
                                                                "prixactuel" => array(),
                                                                "totalproduit" => array(),
                                                                "acompteproduit" => array(),
                                                                "soldeproduit" => array(),
                                                          ), 
                                        "facture"=> array (
                                                                "total" => array(    
                                                                                        "total" => array(),
                                                                                        "acompte" => array(),
                                                                                        "solde" => array(),
                                                                                 ), 
                                                                "clients" => array(
                                                                                    "nom" => array(), 
                                                                                    "prenom" => array(),
                                                                                    "adresse" => array(),
                                                                                    "codepostal" => array(),
                                                                                    "batiment" => array(),
                                                                                    "etage" => array(),
                                                                                    "ville" => array(),
                                                                                    "pays" => array(),
                                                                                    "telephone" => array(),
                                                                                    "email" => array(),
                                                                                   )
                                                           )
                                    );
}


if (isset($_POST["Commander"])) { 
    
    $qt = $_POST["quantite"];
    
    array_push($_SESSION ['caddie']['produit']['quantite'], $qt);
    
    
    require_once('montantprod.php');
    
    $total_prod = total_prod($qt, $pu, $pa);
    
    array_push($_SESSION['caddie']['produit']['totalproduit'], $total_prod);
    
    
    require_once('acompteprod.php');
    
    $acompte_prod = acompte_prod($qt, $pu, $pa);
    
    array_push($_SESSION['caddie']['produit']['acompteproduit'], $acompte_prod);
    
    
    require_once('soldeprod.php');
    
    $solde_prod = solde_prod($qt, $pu, $pa);
    
    array_push($_SESSION['caddie']['produit']['soldeproduit'], $solde_prod);
}

elseif (isset($_POST["Valider"])) {
    $nom = $_POST['nom']; 
    $prenom = $_POST['prenom'];
    $adresse = $_POST['adresse'];
    $codepostal = $_POST['codepostal'];
    $ville = $_POST['ville'];
    $pays = $_POST['pays'];
    $telephone = $_POST['telephone'];
    $email = $_POST['email'];
    $bat = $_POST['batiment'];
    $etage = $_POST['etage'];
    
    array_push($_SESSION['caddie']['facture']['client']['nom'],$nom);
    array_push($_SESSION['caddie']['facture']['client']['prenom'],$prenom);
    array_push($_SESSION['caddie']['facture']['client']['adresse'],$adresse);
    array_push($_SESSION['caddie']['facture']['client']['codepostal'],$codepostal);
    array_push($_SESSION['caddie']['facture']['client']['ville'],$ville);
    array_push($_SESSION['caddie']['facture']['client']['pays'],$pays);
    array_push($_SESSION['caddie']['facture']['client']['telephone'],$telephone);
    array_push($_SESSION['caddie']['facture']['client']['email'],$email);
    array_push($_SESSION['caddie']['facture']['client']['batiment'],$bat);
    array_push($_SESSION['caddie']['facture']['client']['etage'],$etage);
   
}

?>

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

19 sept. 2005, 12:37

C'est une erreur de syntaxe au niveau de la condition if:
Tu as écrit :
affichsubmit.php:

PHP:
<?php

$nombre = nombre_article($refprod);

if ($nombre = false) {
require_once ('boutonsubmit.html');

} else {
require_once ('presproduit.html');
echo $nombre;
}

?>
Tu dois écrire :
if ($nombre == false)
En effet, si tu mets un signe d'affectation "= false" le "if" passe toujours au "else" puisque tu affectes false (faux) dans la variable $nombre et la condition devient alors fausse.
Il faut écrire "$nombre == false" si tu veux évaluer $nombre.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Tho
Eléphant du PHP | 58 Messages

19 sept. 2005, 14:50

Il est d'ailleurs conseillé de noter :
<?php
if ( false == $nombre ) {
  ...
}
?>
ce qui provoquera une erreur si t'oublies un =

Invité
Invité n'ayant pas de compte PHPfrance

19 sept. 2005, 14:56

J'ai modifié l'erreur de syntaxe et ça marche maintenant !!

Merci beaucoup à tous :D