Organisation de l'économie pour un jeu

Eléphant du PHP | 206 Messages

05 nov. 2007, 22:34

ou un éléphant ? casserolle ? Smile
Enfait je pensais plus à un type ENUM ('DEPENSE','RECETTE') (comme déjà dit)
OUla on parle pas de la même chose :o

J'ai en effet utilisé comme tu me l'as conseillé un ENUM ('DEPENSE','RECETTE') dans ma table TypeEconomie.

Je disais que j'utilisais un tinyint pour mon champ semaine (celui dont je veux récupérer la valeur max)

Concernant ce champ semaine il contient le numéro de la semaine

Voici ou j'en suis
				mysql_query('UPDATE economie SET montant = montant +'.$montant.'  WHERE id_equipe='.$_SESSION['id_equipe'].' AND id_type_economie = 6 && semaine = (SELECT max(semaine) FROM economie)') or die (mysql_error()); 
L'erreur
You can't specify target table 'economie' for update in FROM clause

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

05 nov. 2007, 22:58

OUla on parle pas de la même chose :o
J'ai en effet utilisé comme tu me l'as conseillé un ENUM ('DEPENSE','RECETTE') dans ma table TypeEconomie.
Certes mais la ce n'est pas différent... Semaine1, Semaine2 ou tout autre déterminant.
Tu pourrai aussi retrouver par la suite la semaine en fonction de la semaine courante (Semaine1) et la semaine passé (Semaine2)
Tu saurais donc dans la requête quelle est la semaine courante et celle passé.

Sauvegarder le numéro de semaine oui mais pas dans un INT
You can't specify target table 'economie' for update in FROM clause
Donc tu ne peux pas faire ça... une sous requête dans un UPDATE sur la même table.
Une requete de sélection du MAX avant :-k
ou alors fournir directement le numéro de semaine enregistré par date()

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 206 Messages

05 nov. 2007, 23:09

Certes mais la ce n'est pas différent... Semaine1, Semaine2 ou tout autre déterminant.
Tu pourrai aussi retrouver par la suite la semaine en fonction de la semaine courante (Semaine1) et la semaine passé (Semaine2)
Tu saurais donc dans la requête quelle est la semaine courante et celle passé.

Sauvegarder le numéro de semaine oui mais pas dans un INT
Disons que si une saison dure 16 semaines, je comptais garder les 16 semaines d'économie de chaque équipe. D'une part pour les stats et d'autres pour pouvoir à tout moment vérifier les infos sur un membre X :)

Dans ce cas dans quel champ faut il mieux stocker cela?
Une requete de sélection du MAX avant Think
Je pensais effectivement faire ça, mais j'espérais que quelqu'un avait une solution pour m'éviter une première requete.

ou alors fournir directement le numéro de semaine enregistré par date()
utiliser DATE ? pourquoi pas mais je ne serias pas libre, je veux dire que je devrias suivre le snuméro de semaine de l'année..


je pense donc me pencher vers une premiere requete avec MAX(). Mais sachant que sur chaque page ou il y a une transaction (UPDATE sur économie) j'aurais besoin de la dernière semaine. Ce ne serait pas plus simple que je stocke la semaine en cours quelque part ? (fichier ? session? bdd ?)


Merci encore de prendre le temps de lire et de me répondre :)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

05 nov. 2007, 23:33

Si tu veux tout garder (tu semblais contre cette idée au début) en effet il n'y a plus lieu de parler de semaine1 ou semaine2.
Ce ne serait pas plus simple que je stocke la semaine en cours quelque part ?
Le numéro de semaine ne change pas en cours de script.
Ex.
Tes données sont enregistrées avec 33 (semaine 33) pour la semaine en cours. Si tu veux ces données tu pourrais le faire avec semaine = date("W");


Sinon sauvegarder une date complète donc un type DATE (de mysql) et de même travailler avec les fonctions de date

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 206 Messages

05 nov. 2007, 23:41

Sinon sauvegarder une date complète donc un type DATE (de mysql) et de même travailler avec les fonctions de date
travailler sur les fonctions date me parait compliqué la chose pour pas grand chose lol

Sinon pour l'utilisation de date("W") ça pourrait être un bon compromis mais ce qui me rebutait était la contrainte de commencer par exemple la première semaine de ma saison par une semaine 33 (correspondant au numéro de semaine de l'année)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

05 nov. 2007, 23:45

Peu importe, ce n'est pas un souci :-k

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 206 Messages

06 nov. 2007, 00:31

ok je me rabats la dessus,

Denreir problème l'UPDATE ne marche,

Je regarderais à nouveau un coup d'oeil dessus demain à tete reposé,

Voici tout d emême mon code au cas ça te tappe dans l'oeil l'erreur (car aucune erreur n'est affiché)
				mysql_query('UPDATE economie SET montant = montant +'.$montant.'  WHERE id_equipe='.$_SESSION['id_equipe'].' AND id_type_economie = 12 && semaine = date("W")') or die (mysql_error()); 
J'ai essayé comme ça aussi
				mysql_query('UPDATE economie SET montant = montant +'.$montant.'  WHERE id_equipe='.$_SESSION['id_equipe'].' AND id_type_economie = "12" && semaine ='.date("W").'') or die (mysql_error()); 
Voici ma table

Code : Tout sélectionner

-- Structure de la table `economie` -- CREATE TABLE `economie` ( `id_economie` int(11) NOT NULL auto_increment, `id_equipe` tinyint(4) NOT NULL, `id_type_economie` tinyint(4) NOT NULL, `montant` int(4) unsigned NOT NULL, `semaine` tinyint(4) NOT NULL, PRIMARY KEY (`id_economie`), KEY `id_equipe` (`id_equipe`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=2 ; -- -- Contenu de la table `economie` -- INSERT INTO `economie` VALUES (1, 1, 12, 0, 45);
A l'aide d'un echo j'ai bien vérifié que ma SESSION valait bien 1

Bonne nuit

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

06 nov. 2007, 01:49

Tu n'as pas d'erreur pas de mise à jour c'est peut être parce que tu n'entres pas les bonnes valeurs.

Affiche la requête générée :
$sql = "UPDATE ....";
echo $sql;
mysql_query(...);

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 206 Messages

09 nov. 2007, 18:40

Problème résolu merci :D

Sinon je me posais une question (sans doute bête)

Pouruqoi avoir ces2 tables

je rappelle ici leurs structure

Code : Tout sélectionner

CREATE TABLE `typeeconomie` ( `id_type_economie` tinyint(4) NOT NULL auto_increment, `nom_type_economie` varchar(255) collate latin1_german2_ci NOT NULL, `signe` enum('depense','recette') collate latin1_german2_ci NOT NULL, PRIMARY KEY (`id_type_economie`) ) ENGINE=MyISAM AUTO_INCREMENT=52 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=52 ; -- -- Structure de la table `economie` -- CREATE TABLE `economie` ( `id_economie` int(11) NOT NULL auto_increment, `id_equipe` tinyint(4) NOT NULL, `id_type_economie` tinyint(4) NOT NULL, `montant` int(4) unsigned NOT NULL, `semaine` tinyint(4) NOT NULL, PRIMARY KEY (`id_economie`), KEY `id_equipe` (`id_equipe`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=2 ;

Alors que je pourrais avoir seulement la table économie. Car la table typeeconomie ne sert que réellement à associer un nom à un id.

Car actuellement si je veux récuperer tous les criteres de la semaine actuelle je dois passer par une boucle (car je dois prendre plusieurs entrés)

Alors qu'avec une seule table cette requete suffit pour tout récupérer
SELECT ('','','','','','','')  FROM economie WHERE id_membre =$_SESSION['id'] AND semaine = date("W")


Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

09 nov. 2007, 21:16

Sert à normaliser les tables.
Travailler au maximum avec des index de type numérique.
La table typeeconomie pourrait servir ailleurs (autre table) par la suite.
..

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 206 Messages

09 nov. 2007, 22:21

Je vois ce que tu veux dire, mais alors que ça doit permettre une meilleur gestion etc.

Le fait de devoir faire une beaucoup plus grosse requete pour un même résultat n'entre 'il pas en contradiction?

(en tout cas merci de prendre le temps de répondre :))

Sinon y a t'il une fonction qui enleve le signe d'un nombre.
Afin de n'avoir que des nombres positif et seulement mettre par la suite le signe qui convient.

Bonne soirée

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

09 nov. 2007, 23:58

Petit rappel sur la normalisation
ABS() pour la valeur absolue (entier positif)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 206 Messages

14 nov. 2007, 21:34

Merci pour les 2 liens !

Désolé de répondre si tard 3 jours sans internet + taf..

Donc j'en suis a affiché l'économie de la semaine sous cette forme la.

Image

Problème quelle est la façon simple de récupérer chaque montant?

Car pour un montant je ferais
$requete = mysql_query('SELECT  montant 
FROM economie 
WHERE id_equipe = '.$_SESSION['id_equipe'].' AND semaine = '.date("W").' AND id_type_economie =1')
mais il faut que je fasse varier l'id_type_economie, j'imagine qu'il y a des moyens dans le langage SQL plus simple, que d'utiliser une boucle, et n'étant pas encore bien au points avec SQL je requiers ton aide pour m'orienter.


Merci encore et bonne soirée

Eléphant du PHP | 206 Messages

15 nov. 2007, 15:38

Bonjour,

J'ai un peu travaillé dessus ce midi, et donc j'en suis arrivé à cette requete qui me permet de lister les différentes économies de la semaine en cours :
<?php
$requete = mysql_query('SELECT typeeconomie.id_type_economie AS id_type_economie, nom_type_economie, montant 
FROM economie 
LEFT JOIN typeeconomie
USING(id_type_economie)
WHERE id_equipe = '.$_SESSION['id_equipe'].' AND semaine = '.date("W").' AND id_type_economie <> 13') or die (mysql_error());

	
?>
<div id="corps">
<h1> Bureau financier </h1>

<div class="corps-sp1">
<h2> Cette semaine </h2>
<table>

<tr>
       <th colspan="2">Revenus</th>
       <th colspan="2">Dépenses</th>
</tr>

<?php

while ($donnees = mysql_fetch_assoc($requete))
{
echo '   

<tr>
<td>'.$donnees['nom_type_economie'].' : </td> <td>'.$donnees['montant'].'</td>
</tr>
';
}
?>
Le soucis est que ça me fait une liste des 12 types d'économie, mais j'aimerais qu'ils soit rangé dans 2 colonnes différentes d'un coté ceux dont l'id_type_economie est une depense et de l'autre ceux dont l'id type economie est une recette (depense et recette sont un ENUM de mon champ signe)

Je rappelle ma table

Code : Tout sélectionner

CREATE TABLE `typeeconomie` ( `id_type_economie` tinyint(4) NOT NULL auto_increment, `nom_type_economie` varchar(255) collate latin1_german2_ci NOT NULL, `signe` enum('depense','recette') collate latin1_german2_ci NOT NULL, PRIMARY KEY (`id_type_economie`) ) ENGINE=MyISAM AUTO_INCREMENT=52 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=52 ;

Je pourrais bien sur bouclé ma requete 2x fois, mais j'imagine qu'il y a bien plus simple ?

Merci d'avance et bonne journée !

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

15 nov. 2007, 17:14

La requête est correcte...
Tu peux ajouter un tri sur "signe" pour récupérer un type d'économie puis l'autre
Quoi qu'il en soit tu devras tout d'abord parcourir tout le résultat (boucle) et construire bloc par bloc (dépenses puis recettes) avant d'afficher.

$tmp = "";
$tab = array();

While  ($donnees = mysql_fetch_assoc($requete)) 
{
    if($donnees['signe'] != $tmp)
    {
        $tmp = $donnees['signe'] ;
        $tab["$tmp"] = ''; 
    }
    $tab["$tmp"] .= $donnees['nom_type_economie'].' : '.$donnees['montant'].'< br/>';
}


foreach( $tab as $key => $value)
{
    echo $key ." <br />";
    echo $value;
}
Voilà une structure simple (sans mise en page particulière) qui devrait te renvoyer les type "depense" dans $tab["depense"] et recettes dans $tab["recette "].

De cette manière tu ne précises pas vraiment combien de types d'économies tu possèdes et reste donc assez générique pour le cas d'un autre type d'économie ajouté plus tard.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute