Aller au contenu

Calcul panier


lemuse

Sujets conseillés

Bonsoir, un dernier soucis dans l'artotheque, le calcul du nombre des uvres dans le panier ne tient pas compte si il y a eu un effacement, elle n'apparait plus "physiquement" (image, description) mais est toujours comptabilisée, je ne comprend pas bien ce code .. :unsure:

Le panier:

<?
$occurence = 0;
$verif_existe = 0;
$nombre_oeuvres = count($_SESSION["tableau_panier"]);
while($occurence < $nombre_oeuvres)
{
$id_oeuvre = $_SESSION["tableau_panier"][$occurence];
if($id_oeuvre!="effacé")
{
$verif_existe = 1;
}
$occurence++;
}

if(isset($_SESSION["tableau_panier"]) AND $_SESSION["occurence_panier"]>0 AND $verif_existe == 1)
{
echo "<table summary=\"Contenu de votre panier\">\n" ;
echo "<tr>\n" ;
echo "<td>\n" ;
echo "Image\n" ;
echo "</td>\n" ;
echo "<td>\n" ;
echo "Opération\n" ;
echo "</td>\n" ;
echo "</tr>" ;
include("connect.php");


//Effacer une oeuvre du panier.



$occurence = 0;
while($occurence < $nombre_oeuvres)
{
$id_oeuvre = $_SESSION["tableau_panier"][$occurence];
if($id_oeuvre!="effacé")
{
$selection_image = "SELECT * FROM mpf_fr_img ";
$selection_image .= "WHERE id_img = $id_oeuvre";

if($ligne_image = mysql_fetch_array(mysql_query($selection_image)))
{
echo "<tr>\n" ;
echo "<td>\n" ;
echo"<img src=\"../images/expo/".$ligne_image["nom_img"]."\" \nalt=\"".
$ligne_image["nom_oeuvre"]."\" \nclass=\"miniature\" \nid=\"id_".
$ligne_image["nom_img"]."\" \nonclick=\"javascript: ouvrirPopup(".$ligne_image['id_img'].");\" />\n";
echo "</td>\n" ;
echo "<td style=\"text-align: center; padding-top: 20px;\">\n" ;
echo "<input type=\"button\" value=\"Supprimer\" onclick=\"location.href='effacer_oeuvre.php?del_panier=".$id_oeuvre."';\" />" ;
echo "</td>\n" ;
echo "</tr>" ;
}
}
$occurence++;
}
if($verif_existe == 1)
{
//Calcul du nombre d'oeuvres dans le panier.
$nombre_occurences = count($_SESSION["tableau_panier"]);
$occurence = 0;
$oeuvres = 0;
while($occurence < $nombre_occurences)
{
if($_SESSION["tableau_panier"]!="effacé")
{
$oeuvres++;
}
$occurence++;
}
echo "\n<tr>\n" ;
echo "<td class=\"commentaire\">\n" ;
echo "<p>Votre panier contient ".$oeuvres." oeuvre(s). Le tarif pour ce nombre d'oeuvres est de :</p>" ;

switch($oeuvres)
{
case $oeuvres >= 30 : $tarif = "<p>x/pièce par an | x/pièce pour 6 mois | x/pièce pour 3mois</p>"; break;
case $oeuvres >= 20 : $tarif = "<p>x/pièce par an | 9/pièce pour 6 mois | x/pièce pour 3mois</p>"; break;
case $oeuvres >= 10 : $tarif = "<p>x/pièce par an | 12/pièce pour 6 mois | x/pièce pour 3mois</p>"; break;
case $oeuvres < 10 : $tarif = "<p>x/pièce par an | 15/pièce pour 6 mois | x/pièce pour 3mois</p>"; break;

}
echo $tarif;
echo "</td>\n" ;
echo "<td>\n" ;

echo "</td>\n" ;
echo "\n" ;
echo "</tr>\n" ;

echo "<tr>\n" ;
echo "<td>\n" ;
echo " \n" ;
echo "</td>\n" ;
echo "<td>\n" ;
echo "<input type=\"button\" value=\"Envoyer la commande\" onclick=\"location.href='envoi_commande.php'\" />\n" ;
echo "</td>\n" ;
echo "\n" ;
echo "</tr>\n" ;
echo "</table>\n" ;
}
}
else
{
echo "<p style=\"font-weight: bold;\">Votre panier est actuellement vide.</p>" ;

}
?>

Merci déja.

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

Bien sur Luan, voila :

<?
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta http-equiv="imagetoolbar" content="no" />
<link rel="stylesheet" type="text/css" href="artotheque.css" />
<style type="text/css">
<!--
body {
background-image: none;
margin: 20px;
}
td {
background-color: #EFDABD;
padding: 2px;
vertical-align: top;
}
-->
</style>
</head>
<body>
<h1>Votre panier</h1>
<?
if(isset($_GET["del_panier"]))
{
$nombre_oeuvres = count($_SESSION["tableau_panier"]);
$oeuvre_a_supprimer = $_GET["del_panier"];
$occurence = 0;
while($occurence < $nombre_oeuvres)
{
if($_SESSION["tableau_panier"][$occurence]==$oeuvre_a_supprimer)
{
$_SESSION["tableau_panier"][$occurence]="effacé";
}
$occurence++;
}
}
?>
<p style="font-weight: bold;">
Cette oeuvre est effacée du panier.
</p>
<meta http-equiv="refresh" content="3;http://www.monsite/artotheque/panier.php" />

</body>
</html>

Modifié par lemuse
Lien vers le commentaire
Partager sur d’autres sites

Salut,

Si je suis la logique du script, tu n'effaces pas vraiment l'entrée du tableau... Tu ne fais que la modifier:

$_SESSION["tableau_panier"][$occurence]="effacé";

Tu changes la valeur en effacé... de ce fait, il y a toujours une valeur, elle est donc comptabilisée mais pas visible. J'utilise que très rarement les tableaux alors je ne connais pas vraiment... Peut-être que ce que j'ai fait est faux, donc si jamais, il faudrait trouver un moyen d'enlever un élément d'un tableau... La seule fonction que j'ai trouvée sur internet est unset();.

Essaie quand même de remplacer le code de la page effacer_oeuvre.php par par celui-ci:


<?
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta http-equiv="imagetoolbar" content="no" />
<link rel="stylesheet" type="text/css" href="artotheque.css" />
<style type="text/css">
<!--
body {
background-image: none;
margin: 20px;
}
td {
background-color: #EFDABD;
padding: 2px;
vertical-align: top;
}
-->
</style>
</head>
<body>
<h1>Votre panier</h1>
<?
if(isset($_GET["del_panier"]))
{
$nombre_oeuvres = count($_SESSION["tableau_panier"]);
$oeuvre_a_supprimer = $_GET["del_panier"];
$occurence = 0;
while($occurence < $nombre_oeuvres)
{
if($_SESSION["tableau_panier"][$occurence]==$oeuvre_a_supprimer)
{
unset($_SESSION["tableau_panier"][$occurence]);
}
$occurence++;
}
}
?>
<p style="font-weight: bold;">
Cette oeuvre est effacée du panier.
</p>
<meta http-equiv="refresh" content="3;http://www.monsite/artotheque/panier.php" />

</body>
</html>

Lien vers le commentaire
Partager sur d’autres sites

J'ai essayé ta correction, mais j'ai cette erreur qui se répète à chaque suppression, le positif est que le compteur s'affiche en tenant compte des suppressions cette fois ..

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/museed/public_html/artotheque/panier.php on line 94

La ligne incriminée :

        if($ligne_image = mysql_fetch_array(mysql_query($selection_image)))

Merci de me consacrer de ton temps :)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Le souci vient de la requête qui devient invalide vu qu'on a supprimé une entrée du tableau... Enfin, je crois :P


if($id_oeuvre!="effacé")
{

Lignes 37, 38, cette condition devient inutile vu que la valeur est totalement supprimée.

Il te suffit de l'enlever, et d'enlever l'accolade qui termine la condition à la ligne 57


}
}
$occurence++;

Deuxième acollade...

Au cas où, voici le code avec mes modifications...


<?
$occurence = 0;
$verif_existe = 0;
$nombre_oeuvres = count($_SESSION["tableau_panier"]);
while($occurence < $nombre_oeuvres)
{
$id_oeuvre = $_SESSION["tableau_panier"][$occurence];
if($id_oeuvre!="effacé")
{
$verif_existe = 1;
}
$occurence++;
}

if(isset($_SESSION["tableau_panier"]) AND $_SESSION["occurence_panier"]>0 AND $verif_existe == 1)
{
echo "<table summary=\"Contenu de votre panier\">\n" ;
echo "<tr>\n" ;
echo "<td>\n" ;
echo "Image\n" ;
echo "</td>\n" ;
echo "<td>\n" ;
echo "Opération\n" ;
echo "</td>\n" ;
echo "</tr>" ;
include("connect.php");


//Effacer une oeuvre du panier.



$occurence = 0;
while($occurence < $nombre_oeuvres)
{
$id_oeuvre = $_SESSION["tableau_panier"][$occurence];

$selection_image = "SELECT * FROM mpf_fr_img ";
$selection_image .= "WHERE id_img = $id_oeuvre";
$a
if($ligne_image = mysql_fetch_array(mysql_query($selection_image)))
{
echo "<tr>\n" ;
echo "<td>\n" ;
echo"<img src=\"../images/expo/".$ligne_image["nom_img"]."\
" \nalt=\"".
$ligne_image["nom_oeuvre"]."\" \nclass=\"miniature\" \nid=\"id_".
$ligne_image["nom_img"]."\" \nonclick=\"javascript: ouvrirPopup(".$ligne_image['id_img'].");\" />\n";
echo "</td>\n" ;
echo "<td style=\"text-align: center; padding-top: 20px;\">\n" ;
echo "<input type=\"button\" value=\"Supprimer\" onclick=\"location.href='effacer_oeuvre.php?del_panier=".$id_oeuvre."'
;\" />" ;
echo "</td>\n" ;
echo "</tr>" ;
}

$occurence++;
}
if($verif_existe == 1)
{
//Calcul du nombre d'oeuvres dans le panier.
$nombre_occurences = count($_SESSION["tableau_panier"]);
$occurence = 0;
$oeuvres = 0;
while($occurence < $nombre_occurences)
{
if($_SESSION["tableau_panier"]!="effacé")
{
$oeuvres++;
}
$occurence++;
}
echo "\n<tr>\n" ;
echo "<td class=\"commentaire\">\n" ;
echo "<p>Votre panier contient ".$oeuvres." oeuvre(s). Le tarif pour ce nombre d'oeuvres est de :</p>" ;

switch($oeuvres)
{
case $oeuvres >= 30 : $tarif = "<p>x€/pièce par an | x€/pièce pour 6 mois | x€/pièce pour 3mois</p>"; break;
case $oeuvres >= 20 : $tarif = "<p>x€/pièce par an | 9€/pièce pour 6 mois | x€/pièce pour 3mois</p>"; break;
case $oeuvres >= 10 : $tarif = "<p>x€/pièce par an | 12€/pièce pour 6 mois | x€/pièce pour 3mois</p>"; break;
case $oeuvres < 10 : $tarif = "<p>x€/pièce par an | 15€/pièce pour 6 mois | x€/pièce pour 3mois</p>"; break;

}
echo $tarif;
echo "</td>\n" ;
echo "<td>\n" ;

echo "</td>\n" ;
echo "\n" ;
echo "</tr>\n" ;

echo "<tr>\n" ;
echo "<td>\n" ;
echo " \n" ;
echo "</td>\n" ;
echo "<td>\n" ;
echo "<input type=\"button\" value=\"Envoyer la commande\" onclick=\"location.href='envoi_commande.php'\" />\n" ;
echo "</td>\n" ;
echo "\n" ;
echo "</tr>\n" ;
echo "</table>\n" ;
}
}
else
{
echo "<p style=\"font-weight: bold;\">Votre panier est actuellement vide.</p>" ;

}
?>

Modif. Du message:

Du fichier panier.php donc ;)

Modifié par Luan
Lien vers le commentaire
Partager sur d’autres sites

Cette fois il n'y a plus rien si ce n'est :

Parse error: syntax error, unexpected T_IF in /home/museed/public_html/artotheque/panier.php on line 93

La ligne 93, toujours la même :

        if($ligne_image = mysql_fetch_array(mysql_query($selection_image)))

On tire sur l'écheveau là ;)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

A première vu (je regarderai mieux à mon retour, là je dois partir :P), j'ai rajouté un $a et je sais pas pourquoi :P Une erreur toute bête...


$selection_image = "SELECT * FROM mpf_fr_img ";
$selection_image .= "WHERE id_img = $id_oeuvre";
$a
if($ligne_image = mysql_fetch_array(mysql_query($selection_image)))

Enlève-le, ça devrait aider...

Lien vers le commentaire
Partager sur d’autres sites

Alors voila, Luan a trouvé la solution au problème, ici, un copier coller de celle ci :

Je viens de trouver une solution à ton problème. Mon idée de base était de supprimer l'entrée du tableau, le souci, c'est que je n'utilise presque jamais les tableaux, donc je ne sais pas faire... J'ai donc cherché la solution autre part... Non pas dans la suppression de l'élément mais le décompte du panier. Je m'explique.

Ton code de base:

//Calcul du nombre d'oeuvres dans le panier.
$nombre_occurences = count($_SESSION["tableau_panier"]);
$occurence = 0;
$oeuvres = 0;
while($occurence < $nombre_occurences)
{
if($_SESSION["tableau_panier"] != "effacé")
{
$oeuvres++;
}
$occurence++;
}

Dans la condition (si, tableau_panier contient !=effacé, alors on augmente $oeuvres de 1), tu ne vérifies pas une entrée précise de ton tableau mais tout le tableau entier, alors obligatoirement, il va tout compter, même si la valeur est en "effacé". Tu me suis ?

Voici la solution...

//Calcul du nombre d'oeuvres dans le panier.
$nombre_occurences = count($_SESSION["tableau_panier"]);
$occurence = 0;
$oeuvres = 0;
while($occurence < $nombre_occurences)
{
if($_SESSION["tableau_panier"][$occurence]!="effacé")
{
$oeuvres++;
}
$occurence++;
}

ici, je vérifie l'entrée précise ($occurence) du tableau_panier. De ce fait, il n'incrémente que si la valeur est différente de "effacé".

je me suis permis une petite amélioration, le panier gère le pluriel pour le nombre d'oeuvre et ai corrigé une faille de sécurité dans l'effacement de produit (intval(), pense à l'utiliser quand tu récupères une valeur numérique d'un champs de texte ou d'un $_GET afin d'éviter les injections sql).

Luan.

Encore merci pour la solution et ton jusqu'au-boutisme, c'est rassurant de rencontrer et d'échanger de cette façon :thumbsup:

+ ;)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...