probleme d'additions !!!!

Eléphant du PHP | 93 Messages

24 oct. 2005, 23:20

Je savais que j'étais mauvais en maths mais quand même !

J'ai demandé dans un script de mise en culture de terres que l'ordi ajoute des terres à des terres déjà mises en culture...

Rien de bien compliqué, des additions !

Et bien, j'hallucine , l'ordi ajoute 100 à 100, soit 200 ( bravo ordi )
puis il ajoute 50 à 200 soit 250 ( waoo il est fort ! ) et là, je continue, et il ajoute 100 à 250 soit 95 par exemple !
ARRRRGGGHHH !!!!

Voilà le code entier, j'ai tout vérifié, et j'ai même compliqué les choses en enlevant mes opérations de la requête UPDATE et la remplaçant par une variable calculée avant, mais rien n'y fait !

Où est-ce que je pêche ?
Je mets l apage entière, parce que ça vient peut-être de mes multiples requêtes AVANT !
En sachant que c'est une page de traitement d'un formulaire....
<?session_start();?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>traitement des terres</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	    <link rel="stylesheet" href="style/location.css" type="text/css" />
   </head>
   <body> 
<div id="bas">
<?
// on se connecte à MySQL 
$db = mysql_connect('localhost', 'root', ''); 

// on sélectionne la base 
mysql_select_db('colons',$db); 

// on crée la requête SQL 
$sql = "SELECT saison, annee FROM temps";

// on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 

$data = mysql_fetch_assoc($req); 
{ 
$saison=$data['saison'];
$annee=$data['annee'];
} 

// on crée la requête SQL 
$sql= "SELECT coutmiseculture FROM gestion";

// on envoie la requête 
$req= mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 

$data= mysql_fetch_assoc($req); 
{ 
$coutmiseculture=$data['coutmiseculture'];
}  

// on crée la requête SQL 
$sql= "SELECT argent, ble, chasse, peche, bois, cueillette, terres_vierges FROM informations";

// on envoie la requête 
$req= mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 

$data= mysql_fetch_assoc($req); 
{ 
$argent=$data['argent'];
$ble=$data['ble'];
$chasse=$data['chasse'];
$peche=$data['peche'];
$bois=$data['bois'];
$cueillette=$data['cueillette'];
$terres_vierges=$data['terres_vierges'];
}  

if(isset($_POST)  &&  $terres_vierges <=($_POST['ble'] + $_POST['chasse'] + $_POST['peche'] + $_POST['bois'] + $_POST['cueillette'])) { 
extract($_POST); 

$somme= ($_POST['ble']*$coutmiseculture) + ($_POST['chasse']*$coutmiseculture) + ($_POST['peche']*$coutmiseculture) + ($_POST['bois']*$coutmiseculture) + ($_POST['cueillette']*$coutmiseculture);
$newble=($ble)+ ($_POST['ble']);
$newchasse=($chasse)+ ($_POST['chasse']);
$newpeche=($peche)+ ($_POST['peche']);
$newbois=($bois)+ ($_POST['bois']);
$newcueillette=($cueillette)+ ($_POST['cueillette']);

// on envoie les données dans la table informations
mysql_query("UPDATE informations SET terres_vierges='$terres_vierges' - ('".$_POST['ble']."' + '".$_POST['chasse']."' + '".$_POST['peche']."' + '".$_POST['bois']."' + '".$_POST['cueillette']."') WHERE login='".$_SESSION['login']."'");
mysql_query("UPDATE informations SET ble='$newble' WHERE login='".$_SESSION['login']."' ");
mysql_query("UPDATE informations SET chasse='$newchasse' WHERE login='".$_SESSION['login']."' ");
mysql_query("UPDATE informations SET peche='$newpeche' WHERE login='".$_SESSION['login']."' ");
mysql_query("UPDATE informations SET bois='$newbois' WHERE login='".$_SESSION['login']."' ");
mysql_query("UPDATE informations SET cueillette='$newcueillette' WHERE login='".$_SESSION['login']."' ");

echo '<p>Vous avez engagé les indiens d\'HOCHELAGA pour travailler sur vos terres et cela vous coûte la somme de '.$somme.' écus.</p><br/>
<span class="double"><a href="location.PHP"> REVENEZ A VOS TERRES </a></span>';}

else { 
echo '<p>Vous ne disposez pas des terres suffisantes pour donner ces ordres.<br/>
<span class="double"><a href="location.PHP"> REVENEZ A VOS TERRES </a></span>'; 
exit; 
}

mysql_query("UPDATE informations SET argent=argent-$somme WHERE login='".$_SESSION['login']."' ");
mysql_query("INSERT INTO paiements(id, date, payeur, beneficiaire, motifdepense, sommedepense) VALUES('','$saison $annee','".$_SESSION['login']."','AUTRE','mise en gestion des terres','$somme')");  

// on ferme la connexion à mysql 
mysql_close(); 
?> 
<br/>
</div>
   </body>
</html>
MERCI DE M'AIDER !!!! :cry:

Mammouth du PHP | 19672 Messages

24 oct. 2005, 23:56

J'ai pas trouvé l'erreur, mais rendre ton code plus lisible t'aidera peut-être. Un détail que j,ai noté, tu commences par une requête pour récupérer des valeurs existantes... sans clause WHERE (J'ai ajouté un commentaire)

Ensuite, pourquoi faire 5 ou si requêtes de mise à jour là ou une seule suffirait ?
<?session_start();?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>traitement des terres</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <link rel="stylesheet" href="style/location.css" type="text/css" />
   </head>
   <body>
<div id="bas">
<?
// on se connecte à MySQL
$db = mysql_connect('localhost', 'root', '');

// on sélectionne la base
mysql_select_db('colons',$db);

// on crée la requête SQL
$sql = "SELECT saison, annee FROM temps";

// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

$data = mysql_fetch_assoc($req);
{
    $saison=$data['saison'];
    $annee=$data['annee'];
}

// on crée la requête SQL
$sql= "SELECT coutmiseculture FROM gestion";

// on envoie la requête
$req= mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

$data= mysql_fetch_assoc($req);
{
    $coutmiseculture=$data['coutmiseculture'];
}

// on crée la requête SQL (Pas de clause WHERE ??)
$sql= "SELECT argent, ble, chasse, peche, bois, cueillette, terres_vierges FROM informations";

// on envoie la requête
$req= mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

$data= mysql_fetch_assoc($req);
{
    $argent         = $data['argent'];
    $ble            = $data['ble'];
    $chasse         = $data['chasse'];
    $peche          = $data['peche'];
    $bois           = $data['bois'];
    $cueillette     = $data['cueillette'];
    $terres_vierges = $data['terres_vierges'];
}

if(isset($_POST)  &&  $terres_vierges <= ($_POST['ble'] + $_POST['chasse'] + $_POST['peche'] + $_POST['bois'] + $_POST['cueillette']))
{
    extract($_POST);

    $somme  = ($_POST['ble']        * $coutmiseculture);
    $somme += ($_POST['chasse']     * $coutmiseculture);
    $somme += ($_POST['peche']      * $coutmiseculture);
    $somme += ($_POST['bois']       * $coutmiseculture);
    $somme += ($_POST['cueillette'] * $coutmiseculture);
    
    $newble        = $ble        + $_POST['ble'];
    $newchasse     = $chasse     + $_POST['chasse'];
    $newpeche      = $peche      + $_POST['peche'];
    $newbois       = $bois       + $_POST['bois'];
    $newcueillette = $cueillette + $_POST['cueillette'];
    
    $terres_restant = $terres_vierges - ($_POST['ble'] + $_POST['chasse'] + $_POST['peche'] + $_POST['bois'] + $_POST['cueillette']);

    // on envoie les données dans la table informations
    $sql_maj = "UPDATE informations ".
               "SET terres_vierges='". $terres_restant ."', ".
                   "ble='". $newble ."', ".
                   "chasse='". $newchasse ."', ".
                   "peche='". $newpeche ."', ".
                   "bois='". $newbois ."', ".
                   "cueillette='". $newcueillette ."' ".
               "WHERE login='".$_SESSION['login']."'";
    mysql_query($sql_maj);

    echo '<p>Vous avez engagé les indiens d\'HOCHELAGA pour travailler sur vos terres et cela vous coûte la somme de '.$somme.' écus.</p><br/>
<span class="double"><a href="location.PHP"> REVENEZ A VOS TERRES </a></span>';
}
else
{
    echo '<p>Vous ne disposez pas des terres suffisantes pour donner ces ordres.<br/>
<span class="double"><a href="location.PHP"> REVENEZ A VOS TERRES </a></span>';
    exit;
}

mysql_query("UPDATE informations SET argent=argent-$somme WHERE login='".$_SESSION['login']."' ");
mysql_query("INSERT INTO paiements(id, date, payeur, beneficiaire, motifdepense, sommedepense) VALUES('','$saison $annee','".$_SESSION['login']."','AUTRE','mise en gestion des terres','$somme')");

// on ferme la connexion à mysql
mysql_close();
?>
<br/>
</div>
   </body>
</html>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 93 Messages

25 oct. 2005, 00:02

Merci Cyrano.

Je vais déjà tester ce code plus clair.

Sinon, pourquoi je fais plusieurs requêtes ?

Ben parce que j'ai besoin d'informations venant de plusieurs tables.

Alors je les mets en variables en m'ataquant aux tables une à une...

Et après je m'occupe de mon formulaire, ayant toutes les données pour travailler dessus...

Mammouth du PHP | 19672 Messages

25 oct. 2005, 00:06

Je te parle de la requête update, regade comme j'ai réduit le code à une seule requête de mise à jour
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 93 Messages

25 oct. 2005, 00:08

Oui, j'ai vu, beau boulot lol


sinon, tu as raison pour un problème !

Je n'ai pas mis de clause WHERE !!!!

avant, dans les autres requêtes, c'était normal, ce sont des tables à données fixes, mais là où tu as mis un commentaire, effectivement, je dois signaler à partir de qui ça prend les infos lol, je vais voir si ça vient de là !

Normalement, OUI...

Eléphant du PHP | 93 Messages

25 oct. 2005, 00:17

Bon, voilà le problème rencontré maintenant :

je demande d'ajouter 100 blé et 100 chasse.

Il ajoute 200 aux deux et retire bien la somme à terres vierges.

Je demande d'ajouter 100 à blé.
Il réactualise la page, et ajoute 200 à blé.

Mais il n'enlève plus que 200 à terres vierges.

Donc j'ai d'une part un problème du fait qu'il réactualise la page et d'autre part le problème qu'il double les sommes.

La solution ne doit pas être loin...

Mammouth du PHP | 19672 Messages

25 oct. 2005, 00:22

Il doit manquer un test de validation quelque part :-k
Vu l'heure, je suis plus là, mais tu es proche de la solution à mon avis. Et fais des concaténations propres Chaines SQL / PHP, ça peut aider à relire le code aussi
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 93 Messages

25 oct. 2005, 00:30

Merci.

Je vais chercher...

:cry: lol

Mammouth du PHP | 1885 Messages

25 oct. 2005, 00:45

Quel est le type de ton champ?
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Eléphant du PHP | 93 Messages

25 oct. 2005, 00:45

C'est vraiment bête !

Bon voilà ce que j'ai fait :

je me suis dit, on dirait qu'il ne prend pas l'ancien montant de blé ( $ble )

or, je lui dis d'ajouter à l'ancien montant $ble le montant à ajouter, soit $_post[ble]

OR, les deux ont le même nom !

Donc il prenait le montant à ajouter et l'ajoutait à lui-même, et du coup il ne tenait pas compte du montant précédent.

Donc, j'ai testé un changement de nom sur l'ajout de blé :
( exemple avec blé seul )
if(isset($_POST)  &&  $terres_vierges >= $_POST['ajoutble']) 
{ 
    extract($_POST); 

    $somme  = ($_POST['ajoutble']        * $coutmiseculture);  
     
    $newble        = $ble        + $_POST['ajoutble']; 
     
    $terres_restant = $terres_vierges - $_POST['ajoutble']; 
ça fonctionne.

Désormais il n'ajoute plus blé à blé, soit le montant demandé dans le formulaire à lui même mais bien l'ancien montant blé plus le nouveau.

MERCI à toi Cyrano, l'éléphant poète !
Grâce à ta clarification de mon code, ça a sauté aux yeux.

Et en plus, tu m'as appris à mettre ensemble plusieurs update ( je ne savais pas faire ça :oops: ) et aussi j'ai apprécié ta manière d'ajouter des sommes avec le fameux += qui m'a étonné...

BRAVO !!

Et merci !

Ce fut encore une fois rapide avec vous, alors que j'ai passé mon après midi et ma soirée à chercher désespéremment !!!!

Mais bon, ça fait du bien de se creuser la tête aussi... lol

Mammouth du PHP | 19672 Messages

25 oct. 2005, 08:31

Je crois que j'ai compris le problème, tu l'as souligné peut-être sans le savoir : si la directive register_globals est à ON, il peut y avoir conflit entre $ble et $_POST['ble'] précisément parce qu'avec la directive à ON, on a pas besoin d'utiliser obligatoirement les super-globales pour récupérer les valeurs d'un formulaire. Il peut donc y avoir conflit et il est préférable d'utiliser une convention de nommage qui tienne compte de ce problème.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: