Page 1 sur 1

Problème de fonction dans un panier eCommerce

Posté : 08 janv. 2009, 12:15
par Samus
Bonjour, Dans mon site j'ai une fonction qui vérifie qu'un article n'a pas encore été ajouté au panier, au quel cas elle ne l'ajoutera pas.

*********MA FONCTION*************
function verifsimil($login, $prod) 
{
           $present=0; $sql = mysql_query("SELECT * FROM panier WHERE user = '".$login."'");
           while ($donnee = mysql_fetch_array($sql) OR $present=0;) 
           {
                 if ($prod == $donnee['narticle']) { $present=1; } } mysql_close(); return $present; 
           }
************************************************

********APPEL DE LA FONCTION********************
 
if (verifsimil($_SESSION['_login'], $_GET['prod'])==0) 
************************************************

et ça ne marche pas quand je clique sur le lien pour aller à la page rien ne se passe, sablier mais jamais de réponse. P.S: je bosse en local avec wamp et notepad++.

Posté : 08 janv. 2009, 12:35
par Ryle
Sans rentrer dans le détail, quelques petites choses qui ne vont pas :

Pour comparer deux valeurs, on utilise l'opérateur "==". L'opérateur "=" sert à l'affectation.
Lorsque tu fais : OR $present=0; dans ton while, tu affectes la valeur 0 à ta variable $present, rendant ce test toujours vrai.
Par ailleurs, même avec un "==", dans la mesure ou ta variable $present est déclarée juste au dessus étant égale à 0, le test sera toujours vrai et n'a donc aucun intéret.
function verifsimil($login, $prod)  
{ 
           $present=0; 
           // une bonne habitude à prendre : mettre sa requête dans une variable, et ne ramener que les colonnes dont tu as besoin
           $sql = "SELECT narticle FROM panier WHERE user = '".$login."'"; // ca permet d'afficher la requête pour débugger plus facilement :)
           $resultSet = mysql_query($sql); 
           while ($donnee = mysql_fetch_assoc($resultSet))  // pas besoin d'un _array si on utilise que les noms de colonnes, un _assoc suffit
           { 
                 if ($prod == $donnee['narticle']) { 
                       $present=1; 
                 } 
           } 
           mysql_close(); 
           return $present;  
} 
Nota : bien indenter le code le rend plus lisible et plus facile à maintenir... dans ton exemple on a l'impression que la fonction n'est pas complète, en l'indentant proprement on se rend compte que si :)

Tu peux aussi simplifier ta fonction en virant le while() et en demandant directement dans ta requête si l'article est trouvé :
$sql = "SELECT COUNT(*) AS nb FROM panier WHERE user = '".$login."' AND narticle = ". $prod;
Si nb est égal à 0, l'article n'y est pas, sinon (1 ou plus) c'est qu'il est présent :)

Posté : 08 janv. 2009, 12:55
par Samus
oui merci mais ce que jvoulais faire c'est que la variable = 0 il ne trouve pas l'article, je considère donc au départ que la variable est donc à 0 et si il le trouve il le met à 1 donc au final il renvoi la valeur. S'il renvoi 0 c'est donc qu'il ne l'a pas trouvé et donc par défaut il ne le trouve pas. :?

Sinon oui pour l'indentation le copier coller depuis notpad à bien foiré je le recolle:
			function verifsimil($login, $prod)
			{
				$present=0;
				$sql = mysql_query("SELECT * FROM panier WHERE user = '".$login."'");
				 
				while ($donnee = mysql_fetch_array($sql) OR $present=0;)
				{
					if	($prod == $donnee['narticle'])
					{
						$present=1;
					}
				}
				mysql_close();
				return $present;
			}
mais est ce que l'appel à la fonction est correct ?

Posté : 08 janv. 2009, 13:00
par guilt92
Bonjour,
Le problème c'est que quand tu fais

while($present=0) (comme c'est un OR il vérifie toujours la condition) comme c'est une affectation ça sera toujours vrai, donc tu rentres dans une boucle infinie.

Utilise plutot la méthode proposée par Ryle ou sinon utilise la fonction mysql_num_rows() qui te permet de savoir si ta requete a renvoyé des réponses ou pas... Mais ce while ne pourra jamais fonctionner...

EDITAu temps pour moi comme tu fais un return ca termine la boucle, mais bon c'est pas très joli comme façon de faire ;)

Posté : 08 janv. 2009, 13:03
par Samus
oui d'accord j'ai compris ça merci bien

J'ai essayé la methode de Ryle, mais la fonction marche apparemment mais j'ai encore quelques problèmes, je vérifie et je vous tiens au courrant.

EDIT: je dois avoir un problème dans l'utilisation de la fonction ou autre puisque il n'arrive plus à insérer un nouvel objet dans le panier dans la bdd, je l'utilise comme cela:
if (isset($_GET['prod']))
{
	if (verifsimil($_SESSION['_login'], $_GET['prod'])==0)
	{
		echo 'vous êtes connecté <b>'.$_SESSION['_login'].'</b><br>';
		echo "Ajout en cours";
		$sql = mysql_query("INSERT INTO panier VALUES ('', '".$_GET['prod']."','".$_SESSION['_login']."')");
		mysql_close();
		echo "Article ajouté au panier";
	}
	else
	{
		echo "Article déjà présent dans votre pannier";
	}
}

Lorsque je n'utilise pas la fonction c'est à dire que je mets if(0==0) l'ajout marche sans problème dans la base de donné mais sinon il ne m'ajoute pas dans la bdd, je comprends vraiment pas comme ça se fait, pourtant les phrases d'echo au dessus et en dessous de la requête sql sont affichés, il passe donc bien par la requête...


EDIT² : c'est bon j'ai enlevé le mysql_close() et cela fonctionne :P .