Problème de fonction dans un panier eCommerce

Eléphanteau du PHP | 13 Messages

08 janv. 2009, 12:15

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++.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 janv. 2009, 12:35

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 13 Messages

08 janv. 2009, 12:55

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 ?

Mammouth du PHP | 1353 Messages

08 janv. 2009, 13:00

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 ;)
Modifié en dernier par guilt92 le 08 janv. 2009, 13:11, modifié 1 fois.
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphanteau du PHP | 13 Messages

08 janv. 2009, 13:03

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 .