[PHP] update en boucle + mysql_insert_id [Résolu/Fermé]

Signaler
-
 maxland -
Bonjour tout le monde,
voila mon probleme :

j'essaie de faire un update juste apres un insert, le truc c'est que l'update doit se faire
plusieurs fois d'affilée car il s'agit d'un panier contenant des articles qui doivent etre
mis a jour chacun leur tour.

j'ai essayé plusieurs methodes mais j'arrive toujours a mettre a jour qu'un seul produit,
j'ai tenté avec le while et le for, en recuperant le dernier id avec mysql_insert_id,
mais voila ca ne fonctionne qu'une fois pour le premier produit, je vous laisse mon code avec
les variantes en for et while qui donnent les memes resultats :

$req1 = mysql_query ("INSERT INTO commande (CLI_CODE) VALUES ('".$_SESSION['code']."')"); // insertion d'une commande en fonction du client

$i = 0;
if(isset($_SESSION['n']))
{	
	$n=$_SESSION['n'];
	

			while($i <= $n)
			{
				mysql_query (" UPDATE produits SET COM_NUM = '".mysql_insert_id()."' WHERE PROD_REF = '".$_SESSION['panier'][$i]['code']."'");
				$i++;
			}

}
/*
if(isset($_SESSION['n']))
{	
	$n=$_SESSION['n'];
	
	for ($i=0; $i<=$n; $i++)
		{

			if(!empty($_SESSION['panier'][$i]))
			{
				$req = mysql_query ("UPDATE produits SET COM_NUM = '".mysql_insert_id()."' WHERE PROD_REF = '".$_SESSION['panier'][$i]['code']."'");
			}
		}

}*/


voila si quelqu'un pouvait m'aider ce serait sympa, merci d'avance pour vos reponses.

ps: pour ceux qui se pose la question, $_SESSION['n'] me sert d'index pour le panier ...

8 réponses

Messages postés
318
Date d'inscription
lundi 22 décembre 2008
Statut
Membre
Dernière intervention
31 janvier 2014
8
utilise la boucle do while
ca fonctionne pas, a moins que je m'y prends mal,
en tout cas merci pour ta reponse.

code testé :

$req1 = mysql_query ("INSERT INTO commande (CLI_CODE) VALUES ('".$_SESSION['code']."')"); // insertion d'une commande en fonction du client

$i = 0;
if(isset($_SESSION['n']))
{	
	$n=$_SESSION['n'];
	

			do 
			{
				mysql_query (" UPDATE produits SET COM_NUM = '".mysql_insert_id()."' WHERE PROD_REF = '".$_SESSION['panier'][$i]['code']."'");
				$i++;
			}
			while($i <= $n);
}
Messages postés
5358
Date d'inscription
dimanche 3 février 2008
Statut
Membre
Dernière intervention
13 février 2017
889
Par la req1 tu ne fais qu'une seule insertion

et ensuite par UPDATE tu veux mettre à jour plusieurs lignes

et tu ne fais pas la bonnne requette UPDATE car tu écris dans le champ COM_NUM le numéro de la dernière insertion si le champ PROD_REF contient le code du produit dans ton panier ?

ça ne serait pas plutot l'inverse:

				mysql_query (" UPDATE produits SET PROD_REF = '".$_SESSION['panier'][$i]['code']."  WHERE COM_NUM = '".mysql_insert_id()."'");


et pourquoi vouloir faire un UPDATE immédiatement dans le même script, fais directement des INSERT pour chaque produit de ton panier
je vais expliquer mon code en détail :

$req1 = mysql_query ("INSERT INTO commande (CLI_CODE) VALUES ('".$_SESSION['code']."')");
// cette requete insere dans la table commande, le code du client qui passe commande, COM_NUM,
la clé primaire de la table commande est auto-incrémentée lors de l'insertion \\

$i = 0;
if(isset($_SESSION['n']))
// ici je vérifie si la variable session "n" existe, elle sert d'index a mon tableau associatif $_SESSION['panier'] \\
{
$n=$_SESSION['n'];

while($i <= $n)
{
mysql_query (" UPDATE produits SET COM_NUM = '".mysql_insert_id()."' WHERE PROD_REF = '".$_SESSION['panier'][$i]['code']."'");
$i++;
}
// la requete update doit mettre a jour le champs COM_NUM de la table produits, clé etrangere de la table commande, le produit a donc sa clé primaire PROD_REF et une clé étrangere COM_NUM qui elle est nulle de base et comme chaque produit est unique, il ne peut faire partie que d'une seule commande, donc pour chaque produit il doit y avoir un update du champs COM_NUM de la table produits.
c'est pour cela que je veux recuperer le COM_NUM auto-incrémenté par l'insert du haut pour pouvoir l'ajouter au champs COM_NUM présent dans la table produits \\

voila j'espere que c'est plus clair pour vous, et merci de votre aide
Messages postés
5358
Date d'inscription
dimanche 3 février 2008
Statut
Membre
Dernière intervention
13 février 2017
889
alors pourquoi ne pas faire directement l' INSERT de tes produits dans la table produit avec le num correspondant au precedent INSERT cleint ?

INSERT INTO produits SET COM_NUM = '".mysql_insert_id()."', PROD_REF = '".$_SESSION['panier'][$i]['code']."'"
ta ligne de code est fausse, c'est un mélange d'update et d'insert mais merci quand meme.
je ne peux pas faire d'insert alors que les produits existent deja, sinon si c'est possible
c'est qu'on m'a menti :s

je vous montre mes table produits et commande :

commande (COM_NUM smallint(8) auto_increment,
CLI_CODE int(6),
COM_VAL date NULL,
COM_PAYE date NULL,
LIV_CIV varchar(4),
LIV_NOM varchar(25),
LIV_PNOM varchar(30),
LIV_ADR1 varchar(60),
LIV_ADR2 varchar(60),
LIV_CP int(5),
LIV_VILLE varchar(25))

produits (PROD_REF smallint(6) auto_increment,
COM_NUM smallint(6) NULL,
TYPE_CODE varchar(5),
PROD_NOM varchar(30),
PROD_PHOTO1 varchar(50),
PROD_PHOTO2 varchar(50) NULL,
PROD_DESC varchar(255),
PROD_POIDS smallint(5),
PROD_DIM varchar(20),
PROD_CREA date,
PROD_DISPO tinyint(1),
PROD_VENTE date NULL)

les produits sont deja dans la table produits, leur champs COM_NUM est vide (NULL) mais il doit contenir le COM_NUM auto-incrémenté créé lors de l'insert d'une nouvelle commande quand ils sont commandés, ainsi ils appartiennent a une et une seule commande.
et l'insertion d'un client n'a rien a voir avec la table produits, c'est juste pour donner un proprietaire a la commande.
je crois avoir trouvé le probleme mais je ne sais pas le regler.
l'insertion est faite sans probleme et lors de la premiere boucle tout se passe bien,
mysql_insert_id() recupere bien le dernier id inséré car le premier produit du panier
possede bien le COM_NUM qu'il faut et est donc lié a la commande.
mais lors de la 2eme boucle rien ne se fait.

au debut je pensais que mon code etait faux mais si il l'etait rien ne marcherait du tout.
puis j'ai voulu savoir si la fonction mysql_insert_id() etait a usage unique, et je crois bien que c'est le cas
car j'affiche la valeur que renvoie la fonction et elle est égale a 0 alors que le premier produit est bien enregistré.

ca voudrait donc dire que lors du premier appel de la fonction mysql_insert_id(), on recoit bien le dernier id
entré mais qu'elle se reinitialise juste apres.

j'ai essayé de recuperer le dernier id inseré dans une variable puis de m'en servir dans la boucle mais je recois comme valeur : "ressource id#4" !?

si quelqu'un peut me confirmer mon hypothèse et m'aider a regler ce probleme ce serait sympa, merci.
c'est bon !!!
et j'avais raison en passant :)
mais je m'y prenais mal pour recuperer l'id, voici le code complet et qui fonctionne pour ceux que ca interesse :

mysql_query ("INSERT INTO commande (CLI_CODE, LIV_CIV, LIV_NOM, LIV_PNOM, LIV_ADR1, LIV_ADR2, LIV_CP, LIV_VILLE) VALUES ('".$_SESSION['code']."', '".$civ."', '".$nom."', '".$prenom."', '".$adr1."', '".$adr2."', '".$cpostal."', '".$ville."')"); // insertion d'une commande en fonction du client

$id = mysql_insert_id();
$i = 0;
if(isset($_SESSION['n']))
{	
	$n=$_SESSION['n'];
	
			while($i <= $n)
			{
				mysql_query ("UPDATE produits SET COM_NUM = '".$id."' WHERE PROD_REF = '".$_SESSION['panier'][$i]['code']."'");
				$i++;
			}
}


merci pour votre aide en tout cas