Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/01/2012, 16h20   #1
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 89
Points : 36
Points : 36
Par défaut problème pour accéder à un élément de tableau

Bonjour,

j'ai un code avec une boucle while qui liste mes commandes

A l'intérieur de cette boucle je fais une requete pour récupérer les produits de ma commande.

Si j'ai 5000 commandes alors je fais 5000 sous-requetes ce qui n'est pas vraiment optimal ...
J'ai donc fais une fonction qui stock dans un array() la totalité des produits
Code :
1
2
3
4
5
6
7
8
9
10
11
function setTabKdoCommande()
{
	$req 	= 	$this->ewp->sqlQuery	("SELECT com_cli, kdo FROM ".EXP_PROD." WHERE prep=1 AND type=1 AND com_cli>='".$this->getMinCommande()."' ORDER BY com_cli ASC, kdo ASC");
	while($o = $this->ewp->sqlGetObj($req))
	{
		//ajout dans mon array
		//com_cli ==> id de la commande
		//kdo ==> id du produit
		$this->tabKdoCommande[$o->com_cli][]	=	$o->kdo;
	}
}
cette fonction marche bien, pas de soucis de côté là (enfin normalement !)

Dans ma boucle d'origine je remplace la requête que je faisais par un foreach sur le tableau créé précédemment
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
while(....)
{
	$nbOK	=	0;
	foreach($this->tabKdoCommande[$com_cli] as $indexTab => $numKdo)
	{
		if($this->tabKdo[$numkdo] > 0)
		{
			$this->tabKdo[$numKdo]--;
			$nbOK++;
		}
	}
}
le problème c'est que je n'arrive pas à accéder à l'élément $this->tabKdo[$numkdo] alors $numKdo est bien existant et que $this->tabKdo[$numkdo] n'est pas vide (vu avec un print_r)

ce que je ne comprends pas c'est que j'arrive à accéder à l'élément en laissant mon ancienne sous-requete
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
while(....)
{
	$nbOK	=	0;
	$req 	= 	$this->ewp->sqlQuery	("SELECT kdo FROM ".EXP_PROD." WHERE com_cli='".$com_cli."' AND prep=1 AND type=1");
	while($o = $this->ewp->sqlGetObj($req))
	{
		if($this->tabKdo[$o->kdo] > 0)
		{
			$this->tabKdo[$o->kdo]--;
			$nbOK++;
		}
	}
}
là il accède bien à $this->tabKdo[$o->kdo] ...

dans le 1er cas si $numKdo=3000 (par exemple) il n'accède pas à $this->tabKdo[$numkdo]
dans le 2e cas si $o->kdo=3000 alors il accède bien à la valeur de $this->tabKdo[$o->kdo]

je me tords les neurones dans tous les sens depuis une heure car je ne comprends pas ce qui cloche ...
j'ai vérifié les types qui sont des string pour $numKdo et $o->kdo
j'ai essayé de faire des cast (au cas où ...)

mais là je bloque désespérément !

Si vous avez une idée du pourquoi du comment je suis 100% preneur

Merci de m'avoir lu
cedrick21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 16h41   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 018
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 018
Points : 5 081
Points : 5 081
Sinon une jointure c'est pas plus simple ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 09h10   #3
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 89
Points : 36
Points : 36
ce left join serait assez compliqué à mettre en place mais j'y ai pensé.

cependant j'aimerais quand même bien comprendre pourquoi j'ai ce soucis pour accéder à un élément de mon array
cedrick21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 09h53   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
Bonjour,

il faudrait poster le code complet de ta classe je pense parce que là c'est impossible de te dire pourquoi tu as ce problème.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 17h24   #5
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 89
Points : 36
Points : 36
je ne pense pas que la classe soit utile
revoici le code qui pose soucis mais en + light

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
//ce code ne fonctionne pas
foreach($this->tabKdoCommande[$com_cli] as $numKdo)
{
		echo	$numKdo.' - '.$this->tabKdo[$numkdo].'<br />';
}
 
//ce code fonctionne
$req 	= 	$this->ewp->sqlQuery	("SELECT kdo FROM ".EXP_PROD." WHERE com_cli='".$com_cli."' AND prep=1 AND type=1");
while($o = $this->ewp->sqlGetObj($req))
{
	echo	$o->kdo.' - '.$this->tabKdo[$o->kdo].'<br />';
}
mes 2 boucles retournes le même numéro mais seule une accède à l'élément du tableau $this->tabKdo

à l'écran j'ai :
3000 -
3000 - 1

on voit bien que $numKdo dans la première boucle et $o->kdo dans la seconde renvoient 3000 (en string, j'ai vérifié)
je ne comprend donc pas pourquoi la première boucle n'accède pas à l'élément avec $this->tabKdo[$numkdo] alors que la seconde y accède avec $this->tabKdo[$o->kdo]
Pourtant les 2 valeurs renvoient bien "3000"

J'ai également testé en mettant directement $this->tabKdo[3000] et je récupère bien 1

je désespère car ça me fait tourner en bourrique
cedrick21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 09h50   #6
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 89
Points : 36
Points : 36
bon ben ...

la grosse buse que je suis n'a pas vu qu'en fait je me suis planté dans le nom de ma variable ...
je déclare $nomKdo dans le foreach et j'appelle $nomkdo dans mon array ... j'ai oublié le K majuscule dans la variable ...

Bon ben je vous ai embêté pour rien !

Merci quand même
cedrick21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h12.


 
 
 
 
Partenaires

Hébergement Web