8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un petit problème dans la conception de mon panier ... Je dois gérer une billetterie.
Je ne comprends pas ce qui ne va pas, par exemple pour supprimer un billet je récupère l'ID du billet et le transmet à une fonction qui se charge de supprimer le billet du panier.
En mettant cette fonction :
  //Suppression des espaces verticaux
$id = preg_replace('#\v#', '',$é);

ça marche sauf dans l'affichage de l'ID.
En fait je ne comprends pas comment ça peut marcher parce que ça ne récupère pas l'ID dans le reste du code.
Lorsque je clique sur supprimer la ligne va être supprimer mais aucun ID ne sera transmis ...
c'est assez étrange !
voici le code du panier :

<?php
 /* Début du script du Panier */

include_once("fonctions-panier.php");
require 'Pages/inc/params.php';

$erreur = false;

$action = (isset($_POST['action'])? $_POST['action']:  (isset($_GET['action'])? $_GET['action']:null )) ;
if($action !== null)
{
   if(!in_array($action,array('ajout', 'suppression', 'refresh')))
   $erreur=true;

   //récuperation des variables en POST(lors de la modification) ou GET(lors du clic sur la page bonbon)
   $type_billet = (isset($_POST['type_billet'])? $_POST['type_billet']:  (isset($_GET['type_billet'])? $_GET['type_billet']:null )) ;
   $type_match = (isset($_POST['type_match'])? $_POST['type_match']:  (isset($_GET['type_match'])? $_GET['type_match']:null )) ;

	mysql_connect($host,$user,$password) or die('Erreur de connexion au SGBD.');
	mysql_select_db($base) or die('Erreur SQL!<br />'.$sql.'<br />'.mysql_error());
	$query="SELECT Prix FROM Billets where Nom = '$type_billet' ";
	$r=mysql_query($query);
	if (mysql_num_rows($r) > 0)
	{
	$p=mysql_result($r,0); 
	}
	mysql_close(); /* On ferme la connexion */
	
	mysql_connect($host,$user,$password) or die('Erreur de connexion au SGBD.');
	mysql_select_db($base) or die('Erreur SQL!<br />'.$sql.'<br />'.mysql_error());
	$query="SELECT ID FROM Billets where Nom = '$type_billet' ";
	$r=mysql_query($query);
	if (mysql_num_rows($r) > 0)
	{
	$id=mysql_result($r,0);
	}
	mysql_close(); /* On ferme la connexion */
	
   $q = (isset($_POST['choix'])? $_POST['choix']:  (isset($_GET['q'])? $_GET['q']:null )) ;

   //Suppression des espaces verticaux
   $id = preg_replace('#\v#', '',$é);
   
   //On verifie que $p soit un float
   $p = floatval($p);

   //On traite $q qui peut etre un entier simple ou un tableau d'entier

   if (is_array($q)){
      $QteArticle = array();
      $i=0;
      foreach ($q as $contenu){
         $QteArticle[$i++] = intval($contenu);
      }
   }
   else
   $q = intval($q);
    
}

if (!$erreur){
   switch($action){
      Case "ajout":
         ajouterArticle($id,$q,$p,$type_billet);
         break;

      Case "suppression":
         supprimerArticle($id);
         break;

      Case "refresh" :
         for ($i = 0 ; $i < count($QteArticle) ; $i++)
         {
            modifierQTeArticle($_SESSION['panier']['IdBonbons'][$i],round($QteArticle[$i]));
         }
         break;

      Default:
         break;
   }
}
?>
<form name="form" method="post" action="index.php?page=panier" onsubmit="envoyer(this.form);"  />
<table summary="Votre Panier">

		<caption style="text-decoration:underline; font-size:medium;">Votre panier</caption>

	<tr>
		<th>Identifiant</th>
		<th>Nom Billet</th>
		<th>Quantité</th>
		<th>Prix Unitaire</th>
		<th>Action</th>
	</tr>

	<?php
	/* Suite du Script */
	if (creationPanier())
	{
	   $nbArticles=count($_SESSION['panier']['IdBonbons']);
	   if ($nbArticles <= 0)
	   echo "<tr><td colspan='4'>Votre panier est vide </td></tr>";
	   else
	   {
	      for ($i=0 ;$i < $nbArticles ; $i++)
	      {

	         echo "<tr>";
	         echo "<td>".htmlspecialchars($_SESSION['panier']['IdBonbons'][$i])."</td>";
			 echo "<td>".htmlspecialchars($_SESSION['panier']['type_billet'][$i])."</td>";
	         echo "<td><input type=\"text\" size=\"4\" name=\"choix[]\" value=\"".htmlspecialchars($_SESSION['panier']['qteBonbons'][$i])."\"/></td>";
	         echo "<td>".htmlspecialchars($_SESSION['panier']['prixBonbons'][$i])."</td>";
	         echo "<td><a href=\"".htmlspecialchars("index.php?page=panier&action=suppression&id=".rawurlencode($_SESSION['panier']['IdBonbons'][$i]))."\">Supprimer</a></td>";
	         echo "</tr>";
	      }

	      echo "<tr><td colspan=\"2\"> </td>";
	      echo "<td colspan=\"2\">";
	      echo "Total de vos achats : ".MontantGlobal()." &euro;";
	      echo "</td></tr>";
		
		  $total_achat = MontantGlobal(); //On récupère le prix total
	      echo "<tr><td colspan=\"4\">";
	      echo "<input type=\"submit\" value=\"Rafraichir\"/>";
		  echo "<input type=\"submit\" value=\"Commander\" onclick=\"document.form.action='index.php?page=commande&amp;nbArticles=$nbArticles&amp;total_achat=$total_achat'\" />";
	      echo "<input type=\"hidden\" name=\"action\" value=\"refresh\"/>";
		  
	      echo "</td></tr>";
	   }
	}
	?>
</table>


Le code des fonctions qui sont appelées :

<?php

/**
 * Verifie si le panier existe, le créé sinon
 * @return booleen
 */
function creationPanier(){
   if (!isset($_SESSION['panier'])){
      $_SESSION['panier']=array();
      $_SESSION['panier']['IdBonbons'] = array();
      $_SESSION['panier']['qteBonbons'] = array();
	  $_SESSION['panier']['type_billet'] = array();
      $_SESSION['panier']['prixBonbons'] = array();
      $_SESSION['panier']['verrou'] = false;
   }
   return true;
}


/**
 * Ajoute un article dans le panier
 * @param string $IdBonbons
 * @param int $qteBonbons
 * @param float $prixBonbons
 * @return void
 */
function ajouterArticle($IdBonbons,$qteBonbons,$prixBonbons, $billet){

   //Si le panier existe
   if (creationPanier() && !isVerrouille())
   {
      //Si le produit existe déjà on ajoute seulement la quantité
      $positionProduit = array_search($IdBonbons,  $_SESSION['panier']['IdBonbons']);

      if ($positionProduit !== false)
      {
         $_SESSION['panier']['qteBonbons'][$positionProduit] += $qteBonbons ;
      }
      else
      {
         //Sinon on ajoute le produit
         array_push( $_SESSION['panier']['IdBonbons'],$IdBonbons);
		 array_push( $_SESSION['panier']['type_billet'],$type_billet);
         array_push( $_SESSION['panier']['qteBonbons'],$qteBonbons);
         array_push( $_SESSION['panier']['prixBonbons'],$prixBonbons);
      }
	}
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}



/**
 * Modifie la quantité d'un article
 * @param $IdBonbons
 * @param $qteBonbons
 * @return void
 */
function modifierQTeArticle($IdBonbons,$qteBonbons){
   //Si le panier éxiste
   if (creationPanier() && !isVerrouille())
   {
      //Si la quantité est positive on modifie sinon on supprime l'article
      if ($qteBonbons > 0)
      {
         //Recherche du produit dans le panier
         $positionProduit = array_search($IdBonbons,  $_SESSION['panier']['IdBonbons']);

         if ($positionProduit !== false)
         {
            $_SESSION['panier']['qteBonbons'][$positionProduit] = $qteBonbons ;
         }
      }
      else
      supprimerArticle($IdBonbons);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}

/**
 * Supprime un article du panier
 * @param $IdBonbons
 * @return unknown_type
 */
function supprimerArticle($IdBonbons){
   //Si le panier existe
   if (creationPanier() && !isVerrouille())
   {
      //Nous allons passer par un panier temporaire
      $tmp=array();
      $tmp['IdBonbons'] = array();
      $tmp['qteBonbons'] = array();
	  $tmp['type_billet'] = array();
      $tmp['prixBonbons'] = array();
      $tmp['verrou'] = $_SESSION['panier']['verrou'];

      for($i = 0; $i < count($_SESSION['panier']['IdBonbons']); $i++)
      {
         if ($_SESSION['panier']['IdBonbons'][$i] !== $IdBonbons)
         {
            array_push( $tmp['IdBonbons'],$_SESSION['panier']['IdBonbons'][$i]);
			array_push( $tmp['type_billet'],$_SESSION['panier']['type_billet'][$i]);
            array_push( $tmp['qteBonbons'],$_SESSION['panier']['qteBonbons'][$i]);
            array_push( $tmp['prixBonbons'],$_SESSION['panier']['prixBonbons'][$i]);
         }

      }
      //On remplace le panier en session par notre panier temporaire à jour
      $_SESSION['panier'] =  $tmp;
      //On efface notre panier temporaire
      unset($tmp);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}


/**
 * Montant total du panier
 * @return int
 */
function MontantGlobal(){
   $total=0;
   for($i = 0; $i < count($_SESSION['panier']['IdBonbons']); $i++)
   {
      $total += $_SESSION['panier']['qteBonbons'][$i] * $_SESSION['panier']['prixBonbons'][$i];
   }
   return $total;
}


/**
 * Fonction de suppression du panier
 * @return void
 */
function supprimePanier(){
   unset($_SESSION['panier']);
}

/**
 * Permet de savoir si le panier est verrouillé
 * @return booleen
 */
function isVerrouille(){
   if (isset($_SESSION['panier']) && $_SESSION['panier']['verrou'])
   return true;
   else
   return false;
}

/**
 * Compte le nombre d'articles différents dans le panier
 * @return int
 */
function compterArticles()
{
   if (isset($_SESSION['panier']))
   return count($_SESSION['panier']['IdBonbons']);
   else
   return 0;

}

?>


Pourriez-vous m'aider à résoudre ces problèmes ?
Modifié par Petit Rasta (20 Mar 2010 - 16:17)
Bonjour,

Il va falloir macher un petit peu le travail si tu veux une réponse. Je te conseille d'être un peu plus claire dans ton explication (pas besoin de savoir que c'est une billetterie) mais de sélectionner les lignes de codes (10 à 15 max) qui posent problème, pas la peine de nous mettre 2 fichiers...

De plus avant de poser un problème essaye toi même de le résoudre.
Tu n'as fais aucune recherche. Et ça se voit.

la preuve : la variable $é n'existe pas...

Mais bon on va encore dire que je grogne facilement Smiley biggrin
Modifié par masseuro (15 Mar 2010 - 18:39)
Bonsoir,

J'ai passé plus de 6h00 sur ces bouts de code ...
Je suis un peu plein de désespoir !
Effectivement la variable é n'existe pas, c'est censé être la variable $id à la place mais si on met la variable $id plus rien ne fonctionne.
En fait avec la variable é, la variable $id devient nule, du coup je n'ai plus l'affichage voulu mais mes liens supprimer "fonctionnent".
En fait ça supprime a chaque fois la première ligne du panier quand bien même on aurait cliquer sur le supprimer de la deuxième ligne.
Si je met $id à la place de é j'obtiens mon affichage correctement, cependant la suppression n'a pas lieue !
Pourtant dans l'adresse qui appelle la fonction supprimerArticle la valeur id= est bien renseignée avec le bon id.
C'est un peu compliqué à expliquer mais je pense que ça vient de la façon de stocker la valeur id ..?
J'en avais un peu marre tout à l'heure ce qui explique l'état du message...

[EDIT]

Après avoir re re regardé le code je pense que le problème vient du fait que la fonction supprimer ne récupère ou ne fait pas la correspondance en entre $IdBonbons et l'identifiant réel du billet ...

function supprimerArticle($IdBonbons){
   //Si le panier existe
   if (creationPanier() && !isVerrouille())
   {
      //Nous allons passer par un panier temporaire
      $tmp=array();
      $tmp['IdBonbons'] = array();
      $tmp['qteBonbons'] = array();
	  $tmp['billet'] = array();
      $tmp['prixBonbons'] = array();
      $tmp['verrou'] = $_SESSION['panier']['verrou'];

      for($i = 0; $i < count($_SESSION['panier']['IdBonbons']); $i++)
      {
         if ($_SESSION['panier']['IdBonbons'][$i] !== $IdBonbons)
         {
            array_push( $tmp['IdBonbons'],$_SESSION['panier']['IdBonbons'][$i]);
			array_push( $tmp['billet'],$_SESSION['panier']['billet'][$i]);
            array_push( $tmp['qteBonbons'],$_SESSION['panier']['qteBonbons'][$i]);
            array_push( $tmp['prixBonbons'],$_SESSION['panier']['prixBonbons'][$i]);
         }

      }
      //On remplace le panier en session par notre panier temporaire à jour
      $_SESSION['panier'] =  $tmp;
      //On efface notre panier temporaire
      unset($tmp);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}

On appelle la fonction en lui envoyant l'id :

 Case "suppression":
         supprimerArticle($id);
         break;

Cet id envoyé est bien le bon identifiant ...
Modifié par Petit Rasta (15 Mar 2010 - 21:17)
Bonjour,

ah! là c'est mieux Smiley biggrin Je comprends ton problème.

En effet apparemment $id ne correspond pas du tout à $IdBonbons. Ce qui fait qu'à chaque fois il te remettais le même tableau, sans suppression. En mettant la variable $é qui n'existe pas la valeur NULL est comprise comme 0. Donc comme la première ligne du tableau.

Vérifie ce que contient ton tableau de IdBonbon en SESSION avec la fonction var_dump, et compare ça avec l'identifiant que tu envois à ta fonction. Ce n'est que en affichant des traces que tu trouveras la source de ton problème.
Salut,

je n'ai pas analysé tout ton code mais je suspecte la partie récupération de la base mysql d'être buggé.

et en tout cas d'être pas du tout optimiser.

ton code

	mysql_connect($host,$user,$password) or die('Erreur de connexion au SGBD.');

	mysql_select_db($base) or die('Erreur SQL!<br />'.$sql.'<br />'.mysql_error());

	$query="SELECT Prix FROM Billets where Nom = '$type_billet' ";

	$r=mysql_query($query);

	if (mysql_num_rows($r) > 0)

	{

	$p=mysql_result($r,0); 

	}

	mysql_close(); /* On ferme la connexion */

	

	mysql_connect($host,$user,$password) or die('Erreur de connexion au SGBD.');

	mysql_select_db($base) or die('Erreur SQL!<br />'.$sql.'<br />'.mysql_error());

	$query="SELECT ID FROM Billets where Nom = '$type_billet' ";

	$r=mysql_query($query);

	if (mysql_num_rows($r) > 0)

	{

	$id=mysql_result($r,0);

	}

	mysql_close(); /* On ferme la connexion */



ça ne sert a rien d'ouvrir et de refermer 2 fois une connexion pour faire 2 requetes à la suite.

plus tu ouvres et refermes de connexion plus tu surcharges le travail de ton serveur.

En plus en général sur PHP les fonctions de fermeture de connexion aux bases sont buggés.
je l'ai constaté trés souvent sur SQL server. je dirais que c'est pas mieux sur mysql.

un exemple simple lié a ton code. chez moi

mysql_close(); /* On ferme la connexion */

provoque une erreur de réinitialisation d'apache et rien ne s'affiche.

N.B: je mets mysql_close($co) avec $co le resultat du mysql_connect ça passe.

et puis faire deux requêtes pour aller chercher 2 champs d'une même table avec la même condition Smiley rolleyes .

même dans des cas plus compliqué que ça. il est vraiment conseillé d'essayer de faire un maximum de chose dans une seule requete bien ecrite.

essaie


$co = mysql_connect($host,$user,$password) or die('Erreur de connexion au SGBD.');

mysql_select_db($base) or die('Erreur SQL!<br />'.$sql.'<br />'.mysql_error());

$query="SELECT Prix,ID FROM Billets where Nom = '$type_billet' ";

$r=mysql_query($query) or die(mysql_error());
	
if (mysql_num_rows($r) > 0) {
	while ($row = mysql_fetch_assoc($r)) {
		$p = $row['Prix'];
	        $id = $row['ID'];
	}
}


ensuite je ne comprends pas trés bien l'utilité du preg_replace.

je te deconseille mysql_result. la doc dit que la fonction est trés lente et entre en conflit avec les autres fonctions qui travaillent sur les requetes.ça a pas l'air top.
Modifié par CPascal (17 Mar 2010 - 18:05)
Bonjour,

Merci pour ta réponse et désolé de ne pas être venu plus tôt.
J'ai bien pris note de tes remarques et j'ai modifié mon code en conséquence Smiley cligne
Pour le problème que j'avais je l'ai résolu, il s'agissait de :

Case "suppression":
         supprimerArticle($id);
         break;


Or j'avais modifié mon code par rapport à ma dernière utilisation ^^
Avant je récupérait mon $id grâce à un formulaire et la variable était remplie par : $_POST
et par $_GET lors de la suppression.
Ceci ce faisait en tout début du code.
Maintenant je récupère avec une requête donc je n'avais plus ce fameux $_GET
C'est pourquoi il faut remplacer le code précédent par :

Case "suppression":
         supprimerArticle($_GET['id']);
         break;

Aucun où y en a qui se servirait de ce code ...

Je bloque sur un autre problème maintenant Smiley confused

a un endroit j'ai ce code :

if($_SESSION['panier']['Code'][$i] == "Oui")
			 {
				echo " <td><input type=\"text\" size=\"10\" name=\"Code\" value=\"\" \></td> ";
			 }
			 else
			 echo " <td><input type=\"text\" size=\"10\" readonly=\"readonly\" name=\"Code\" value=\"Aucun code\" \></td> ";


Mais je passe pour la confirmation par :

echo"	<input type=\"submit\" value=\"Commander\" onclick=\"document.form.action='index.php?page=commande&amp;nbArticles=$nbArticles&amp;total_achat=$total_achat'\" />";


Mon soucis c'est que je ne sais pas comment récupérer la valeur de mon code saisit par l'utilisateur dans le premier bout de code à ma page commande.
Sachant que j'utilise déjà le traitement ordinaire sur un formulaire lors du refresh :

		echo"	<input type=\"submit\" value=\"Rafraichir\" />";
		echo"	<input type=\"submit\" value=\"Commander\" onclick=\"document.form.action='index.php?page=commande&amp;nbArticles=$nbArticles&amp;total_achat=$total_achat'\" />";
		echo"	<input type=\"hidden\" name=\"action\" value=\"refresh\"/>";
		echo"	</div>";


Je n'ai pas vraiment d'idée pour que ma page commande puisse récupérer la valeur du code.
Auriez-vous des idées ?
Peut-être avec un triple submit ...

[Edit] Je crée un nouveau sujet pour ma question.
Modifié par Petit Rasta (20 Mar 2010 - 16:17)