[PHP] Variable défaillante temporairement ?

Résolu/Fermé
Nethan Messages postés 9 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 18 mars 2009 - 20 avril 2007 à 17:00
Nethan Messages postés 9 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 18 mars 2009 - 25 avril 2007 à 20:48
Bonjour,

Voilà je me lance en PHP, du coup je rencontre des problèmes parfois... surprenants.

J'ai une variable array qui contient des infos d'une base SQL. Ce tableau est constitué des valeurs suivantes (c'est un exemple) :

donnees[0] = C'est le Nom de l'objet
donnees[1] = 1353 (un des besoins)
donnees[2] = 396 (un autre)
donnees[3] = 227
donness[etc...] = Etc...

Chacune de ces valeurs est multiplié sur lui-même par une quantité (1 pour l'exemple) :
/* Calcul des quantités de ressources */
for($operande = 1; $operande < 9; $operande++) { 
$donnees["$operande"] = number_format(($donnees["$operande"] * $quantite), 0, ',',' ');
}
Le but est d'utiliser les résultats obtenus pour un calcul de coût. Chacun de ces nombres sera, encore une fois, multiplié par une variable propre : ress1_achat = 2.43, ress2_achat = 10, ress3_achat = 26.90, etc...

L'ennui est simple :
echo "$donnees[0]"; << Affiche le nom << OK
echo "$donnees[1]"; << Affiche 1353 << Histoire d'être sûr :)

$calcul3 = $donnees[3] * ress3_achat; << Ça donne 227 * 26.90 = 6106.30 << OK
$calcul2 = $donnees[2] * ress2_achat; << Ça donne 396 * 10 = 3960 << OK
$calcul1 = $donnees[1] * ress3_achat; << Ça donne 1353 * 2.43 = 2.43 << Gné ?

Là ça voudrait dire qu'en fait j'ai multiplié 1 par 2.43... Pourtant le écho plus haut CONFIRME que $donnees[1] = 1353

Ce qui voudrait donc dire que $donnees[1] vaut 1 ET 1353 ? Et il intervertit quand ça l'arrange ?

En cherchant, j'ai remarqué que virer la boucle for (pour la quantité) réglait le problème pour $donnees[1]. C'est bien mais j'en ai besoin de la quantité...

Le plus fort, c'est si je commence la boucle for par $donnees[2], donc par 2, et non 1, voir même par 3, $calcul2 et 3 correspondent exactement à ce que j'attend, soit 3960/6106...

Bref, quand c'est 1, il attribue un 1 temporaire à $donnees[1].

Ma question est donc simple :

Caykoic'délire ? :)

Cordialement,
Nethan
A voir également:

6 réponses

bbar Messages postés 436 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 31 octobre 2008 140
20 avril 2007 à 17:41
salut, là je t'avoue que je trouve ton truc un peu obscur avec juste ce petit bout de code. Si tu pouvais faire passer le reste, ça m'évitera de l'inventer et ça ira certainemeent plus vite.
0
Nethan Messages postés 9 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 18 mars 2009
22 avril 2007 à 02:27
Je pensais être explicite :-/ Voilà le truc, ultra-basique, normal vu que je débute :
http://membres.lycos.fr/tkocgif/phpfun.zip
0
bbar Messages postés 436 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 31 octobre 2008 140
24 avril 2007 à 18:08
salut, tout d'abord merci pour tes fichiers. Pour te rassurer, je te les ai demandé non parce que tes explications n'étaient pas claires, mais parce que le pb ne vient pas du bout de code que tu as donné dans ton premier post : je l'ai essayé avec un jeu de test, je n'ai aucun pb, les calculs se font bien, et je n'ai pas réussi à reproduire ton pb.
Une chose que tu peux faire, c'est de modifier ta boucle for comme suis pour avoir un affichage de la valeur des chacune de tes variables :
for($i = 1; $i < 9; $i++) 
{ 
echo $i.") ". $donnees["$i"] ." * ".$quantite." = ";
$donnees["$i"] = number_format(($donnees["$i"] * $quantite), 0, ',',' ');
echo $donnees["$i"]."\n";
}

ce qui devrait t'afficher pour chaque passage dans la boucle :
1 ) donnees1 * quantité = donnees1_modifiees
8fois, avec donnees1 la valeur avant passage dans la boucle, et avec donnees1_modifiees, la valeur après la boucle.
Je pense que le résultat risque de ne pas être complètement inintéressant.
Je ne peux pas le fair par moi même, il me manque des fichiers que tu inclus dans le production-2.php.
Voilà, j'espère que ça pourra t'aider. Dis moi ce qu'il en est
0
Nethan Messages postés 9 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 18 mars 2009
25 avril 2007 à 19:54
Bonsoir,

Merci de cette réponse.

J'ai revérifié le ZIP, il n'en manque aucun : 4 PHP (2 à la racine et 2 dans un sous-répertoire commun), et 1 SQL pour les données à utiliser. Ultra-basique :) L'idée commençait tout juste avant le constat du problème.

J'ai refait un fichier et réuploadé, sous le même nom, par acquis de conscience.



Voilà, j'ai utilisé ton aménagement pour voir les résultats. Comme indiqué premier post, on constate bien le soucis.

La colonne "Rapporté Achat" avait déjà été modifié, pour n'afficher que le résultat de la colonne "Tritanium" * Quantité * 2,43 (il en fait davantage normalement).

C'est troublant. Suivant la quantité, le résultat est de pire en pire :
* Quantité1, on voit bien qu'il ne tient pas compte de $donnees[1], il fait 1 * 1 * 2.43 :
http://membres.lycos.fr/tkocgif/Quantite1.png
* Quantité 2, on voit que le calcul de la boucle est bon pour la quantité, mais qu'il fait 1 * 2 *2.43:
http://membres.lycos.fr/tkocgif/Quantite2.png
* Quantité 3, le calcul de la boucle est toujours bon, mais le résultat est incohérent. 1 * 3 * 2.43 != 9.72 mais à 7.29...
http://membres.lycos.fr/tkocgif/Quantite3.png
* Quantite 10, calcul boucle toujours bon, résultat délirant :
http://membres.lycos.fr/tkocgif/Quantite4.png

Le 2.43, quand je met quantité 10, a muté en 3.159 ? Ce nombre augmente graduellement jusqu'à la quantité 739. Au delà, il retourne à 2,43. Pourquoi 739 ? Alors là, aucune idée...

De même, en poussant plus loin les tests, j'ai constaté que ce n'est pas toujours $donnees[1] qui est touché.

Quand je met en quantité 1, c'est $donnees[1]
Quand c'est 3, c'est $donnees[1] ET $donnees[2]
Quand c'est 5, le [3] est aussi concerné...



Mon serveur devient fou ? =) Il ne sait plus compter en tout cas =)

(Apache_2.0.59 + PHP 4.4.4 + Mysql-Essential-4.1.22)
0

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

Posez votre question
bbar Messages postés 436 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 31 octobre 2008 140
25 avril 2007 à 20:33
salut,
ok, mea giga culpa, j'avais pas vu les fichiers, j'aivais les yeux dans ma poche.
j'ai trouvé ton pb : il est dans ta boucle for, sise ligne 41 de ton fichier production-2.php :
$donnees["$i"] = number_format(($donnees["$i"] * $quantite), 0, ',',' ');

il n'arrive pas à effectuer les opérations avec des nombres dont les milliers sont séparés par des espaces.
Sur ton exemple de quantité3.png, la valeur de $donnees[1] = 4 059, et si tu divise 9.72 par 2.43, tu retombes sur ... 4. fait le calcule pour les autres cas, tu veras.
J'ai fait un essai en modifiant le contenu de la boucle for comme suit :
$donnees["$i"] = $donnees["$i"] * $quantite;

et là, no prob, il me fait tous les calculs nikel, simplement la valeur de tes éléments n'est plus mise en forme. A toi de voir où tu veux recaser le formatage avec un séparateur pour les milliers.
0
Nethan Messages postés 9 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 18 mars 2009
25 avril 2007 à 20:48
...

...

L'erreur de DEBUTANT ULTIME ! Je suis honteux :(

Le formatage ne devait servir que pour le calcul final, celui de $prodachat qui permet l'affichage au tableau.

Seulement j'ai changé les opérations pour intégrer un calcul de quantité, et j'ai fait un copier/coller de trop à ce moment... Et je n'ai pas réalisé.

Effectivement tout fonctionne dès lors qu'on retire le formatage sur les calculs intermédiaires, et ton explication montre bien que le résultat obtenu était en fait... normal.

Merci pour ton aide :) Je vais pouvoir progresser, en me plantant moins j'espère ^^

Cordialement,
Nethan
0