Boucle update champs dans tableau

Résolu/Fermé
maverickz Messages postés 49 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 10 août 2011 - 15 nov. 2009 à 01:46
maverickz Messages postés 49 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 10 août 2011 - 15 nov. 2009 à 15:52
Bonjour,

Je souhaite faire une mise a jour de certains champs dans mon tableau.

J'ai le tableau, j'ai les éléments a updater.
L'update se passe correctement mais la boucle s'arrête sur un champ qui n'est pas concerné par l'update et ne veut pas continuer plus loin.

Je m'explique

<td>Champ1</td>  => Update OK
<td>Champ2</td>  => Update OK
<td>Champ3</td>  => Champ pas concerné par l'update , pas d'update , donc OK
<td>Champ4</td>  => Update NOT OK
<td>Champ5</td>  => Update NOT OK



Et voila la situation réelle :

Ceci sont les éléments concernés par l'update, le productID 1,2 et 4 , pas le 3

Array
(
    [1] => Array
        (
            [productID] => 1
            [productName] => Layout
            [quantity] => 156
            [productQuantity] => 1
            [shipDate] => 2009-11-15
        )

    [2] => Array
        (
            [productID] => 2
            [productName] => Hiver
            [quantity] => 18
            [productQuantity] => 1
            [shipDate] => 2009-11-15
        )

    [3] => Array
        (
            [productID] => 4
            [productName] => Chaise
            [quantity] => 40
            [productQuantity] => 7
            [shipDate] => 2009-11-15
        )

)


Comment est ce que je peux faire pour que la boucle continue a updater mes champs sans s'arrêter sur le champ a l'ID 3 qui n'est pas concerné par l'update


Voici le bout de code en question :



for ($i=1; isset($quantityLeft[$i]); $i++) {		
	for ($i=1; isset($tab[$i]); $i++) { 
		if($tab[$i]['productID']==$quantityLeft[$i]['productID']) {
		
$tab[$i]['quantity']=$quantityLeft[$i]['quantity']-$quantityLeft[$i]['productQuantity'];
		}
			
		else {
			$tab[$i]['quantity'];
		}



En gros je raconte que si $tab[productID] qui est la liste de mes ID dans ma base de donnée est égal a l'ID des produits a mettre a jour , je poursuis ma boucle et je soustrait la quantité. Sinon je soustrais rien.

Voila en gros la boucle fonctionne tant qu'il trouve que les ID sont égaux, ensuite elle s'arrête et ne mets pas a jour le reste.

do {
       	$quantityLeft[$i]['quantity']-$quantityLeft[$i]['productQuantity'];	
    }
     	while($tab[$i]['productID']==$quantityLeft[$i]['productID']); 



J'ai également essayé le do-while mais j'ai un " Exceed limit de la requete".



Si quelqu'un sait comment je peux faire poursuivre ma boucle en ignorant les éléments a ne pas mettre a jour je lui serai très reconnaissant :-)

Merci beaucoup pour votre aide.
A voir également:

5 réponses

maverickz Messages postés 49 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 10 août 2011 18
15 nov. 2009 à 12:13
Bonjour,

Je ne trouve pas...

Ce serait sans doute plus simple si j'affichais tous les éléments de la base de donnée et que je fasse le tri ensuite par PHP ?

Pour l'instant , il m'affiche 3 produits sur les 4 car le but est d'afficher les produits commandés et le nombre restant par rapport a une date que l'utilisateur a choisi.

Y a t'il moyen d'afficher le 4ème produit dans le même array même si ce produit n'est pas enregistré dans la commande ?

J'ai essayé ceci pour déjà voir ce qu'il m'affiche,mais bon, pas grand chose :

mysql_query("SELECT p.productID
	            FROM products p
		    WHERE NOT EXISTS (SELECT p.productID
						  FROM products p, orders o
						  WHERE o.shipDate = '$shipDate'");





Le must serait donc de pouvoir placer cette requete dans la requete qui m'affiche deja mon array que je vous copie ici :

Array
(
    [1] => Array
        (
            [productID] => 1
            [productName] => Layout
            [quantity] => 156
            [productQuantity] => 1
            [shipDate] => 2009-11-15
        )

    [2] => Array
        (
            [productID] => 2
            [productName] => Hiver
            [quantity] => 18
            [productQuantity] => 1
            [shipDate] => 2009-11-15
        )

    ******* Ce serait bien d'avoir productID=3 ici même si les 3/4 de ces champs seront vides *******

    [3] => Array
        (
            [productID] => 4
            [productName] => Chaise
            [quantity] => 40
            [productQuantity] => 7
            [shipDate] => 2009-11-15
        )

)




mysql_query("SELECT p.*, SUM(d.productQuantity) AS productQuantity, o.shipDate
		FROM products p, ordersdetails d, orders o
		WHERE p.productID = d.productID 
		AND o.orderID = d.orderID
		AND o.shipDate = '$shipDate'  
		GROUP BY p.productID");




La clé de tout cela c'est bien le champ "shipDate" et la variable $shipDate mais j'avoue avoir un peu de mal pour faire la requête exacte.

Merci en tout cas :-)
0
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
15 nov. 2009 à 12:46
Bjr

Hum je pige pas tout ça m'a l'air bien compliqué

Déjà tes 2 boucles impliquées avec la même variable $i c'est pas conseillé du tout !

Utilise plutôt (et adapte le reste en conséquence) :
for ($i=1; isset($quantityLeft[$i]); $i++) {		
	for ($j=1; isset($tab[$i]); $j++) { 


Ah puis y'a aussi le isset() ? Qu'est-ce qu'il fiche ici sachant qu'il retoune TRUE ou FALSE ?
Donc ca donne pour $i de 1 à TRUE faire qlque chose puis incrémenter $i ????? Hum si ce code fonctionne ben alors là !


Maintenant je comprends pas pourquoi tu testes si ton productID figure bien dans $tab[] : normalement l'utilisateur ne sélectionne que des productID valides non ? A moins que tu es peur d'un injection de code ou autre mais qd même


0
maverickz Messages postés 49 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 10 août 2011 18
15 nov. 2009 à 13:50
Hello,

tout d'abord, merci pour ta réponse


Je pense que ca va être très très dur a expliquer ;-) se serait plus la requete SQL qu'il faudrait revoir

Je vais quand même essayer d'être le plus clair possible :-)
Si je change les
 $i en $j  
plus l'adaptation du reste pour la seconde boucle il boucle le tout a l'infini

for ($i=1; isset($quantityLeft[$i]); $i++) {		
	for ($j=1; isset($tab[$i]); $j++) { 


les isset fonctionnent, je peux mettre
 $i<sizeof($tab[$i]) 
que ca me donnerait la même chose ;-)

les resultats affichés en soi sont presque correct, je m'explique.

Il m'affiche un tableau avec 4 produits de
 $tab[$i] [MESPRODUITS] 


La dedans j'ai qu'un seul champ a updater c'est la quantité
 $tab [$i]  ['quantity] ; 



Enfait j'ai comme résultat pour l'instant :
-----------------------------------------------

Selection DATE = aucune commande a la date de hier on affiche $tab[$i]['quantity] a sa valeur max:

<tableau>
[Produit 1] = Quantité 50
[Produit 2] = Quantité 40
[Produit 3] = Quantité 10
[Produit 4] = Quantité 20
</tableau>


Si pour demain j'ai une commande (inscrite dans la DB)
---------------------------------------------------------------------------
[Produit 1] = Quantité 10 
[Produit 2] = Quantité 5 
[Produit 4] = Quantité 10


Je sélectionne tous les produits qui ont été commandés pour cette date.
Il m'en sort 3 (voir l'array de mon message précédent).
C'est a dire le Produit 1 , 2 et 4

Je récupère les infos de ces produits via la requête SQL que j'ai indiqué plus haut et je place le tout dans un AUTRE tableau que j'ai appellé $quantityLeft[$i]

Je récupère l'id , la quantité max et la quantité commandé dans le tableau $quantityLeft[$i]

dans mon array il me sort en toute logique via la soustraction :

$tab[$i]['quantity']=
$quantityLeft[$i]['quantity'] - $quantityLeft[$i]['productQuantity'];


Produit 1 = Quantité 50 - Quantité 10   => sa fonctionne
Produit 2 = Quantité 40 - Quantité 5    => sa fonctionne aussi
Produit 3 = On ne doit pas l'updater => Il n'update pas, normal
Produit 4 = Il arrête la boucle au produit 3 donc l'update ne se fait pas pour 4 


Voila le fond de ma question est pourquoi il n'update pas le produit 4 et arrete la boucle au produit 3 , et surtout comment le forcer a continuer.


La boucle au grand complèt ressemble a

for ($i=1; isset($quantityLeft[$i]); $i++) {		
   for ($i=1; isset($tab[$i]); $i++) { 
      
       if($tab[$i]['productID']==$quantityLeft[$i]['productID']) {
	  $tab[$i]['quantity']=
            $quantityLeft[$i]['quantity'] - $quantityLeft[$i]['productQuantity'];
	}
	else {
		$tab[$i]['quantity'];
	}



En gros il fait 2 fois le IF pour les deux premiers produits, puis il fait une fois le ELSE pour le 3ème , et je cherche a ce qu'il retourne au IF pour le 4ème.

Challenge Challenge ^^ , merci en tout cas :-)
0
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
15 nov. 2009 à 14:43
Hum déjà es-tu sûr que l'indice de tous tableaux commencent bien à 1 et pas à zéro. Ce qui est curieux d'ailleurs étant donné que par défaut les tableaux PHP sont zero based index même si on peut forcer l'index


En utilisant ce code ca fonctionne :


<?php

$tab=array();

$item["productID"] = '1';
$item["productName"] = 'Layout';
$item["quantity"] = 156;
// $tab[]=$item;   // Si zero based index
$tab[1]=$item;

$item["productID"] = '2';
$item["productName"] = 'Hiver';
$item["quantity"] = 18;
$tab[2]=$item;

$item["productID"] = '3';
$item["productName"] = 'Divers';
$item["quantity"] = 120;
$tab[3]=$item;

$item["productID"] = '4';
$item["productName"] = 'Chaise';
$item["quantity"] = 40;
$tab[4]=$item;


$quantityLeft=array();

$item["productID"] = '1';
$item["productName"] = 'Layout';
$item["quantity"] = 156;
$item["productQuantity"] = 1;
$item["shipDate"] = '2009-11-15';
$quantityLeft[1]=$item;

$item["productID"] = '2';
$item["productName"] = 'Hiver';
$item["quantity"] = 18;
$item["productQuantity"] = 1;
$item["shipDate"] = '2009-11-15';
$quantityLeft[2]=$item;

$item["productID"] = '4';
$item["productName"] = 'Chaise';
$item["quantity"] = 40;
$item["productQuantity"] = 7;
$item["shipDate"] = '2009-11-15';
$quantityLeft[3]=$item;

echo "<pre><p>Avant</p>";
var_dump($tab);
echo "</pre>";



for ($i=1; isset($quantityLeft[$i]); $i++) 
{		
	for ($j=1; isset($tab[$j]); $j++) 
	{ 
		if($tab[$j]['productID']==$quantityLeft[$i]['productID']) 
		{
			$tab[$j]['quantity'] = $quantityLeft[$i]['quantity'] - $quantityLeft[$i]['productQuantity'];
			$tab[$j]['updated']= true;
		}
		else 
		{
			$tab[$j]['quantity'];
		}
	}
}

echo "<pre><p>Avant</p>";
var_dump($tab);
echo "</pre>";	


?>


par contre si j'utilise $i dans les 2 boucles j'obtiens bien une erreur PHP
Notice: Undefined offset: 4 ce qui ne m'étonne pas
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maverickz Messages postés 49 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 10 août 2011 18
15 nov. 2009 à 15:52
Extraordinaire, puissant, finalement c'était bien ces $j qui posaient problème le var_dump($tab) en dehors de la double boucle fonctionne a merveille avec les éléments dans la DB.

Franchement merci du coup de main la tu m'as permis de finaliser mon projet.

Reste plus qu'a assigner mes nouvelles variables au système de template et c'est banco, merci encore et passe un bon dimanche ;-)))
0