Organisation de l'économie pour un jeu

Eléphant du PHP | 206 Messages

15 nov. 2007, 18:58

Je vois ou tu veux en venir, mais je en saisis pas tous les passages du code.

Si ça ne te dérange pas de les reprendre point par point ?
$tmp = "";
$tab = array();
pas de problème :D

Ensuite on lance la boucle


if($donnees['signe'] != $tmp)
    {
        $tmp = $donnees['signe'] ;
        $tab["$tmp"] = ''; 
    }
    $tab["$tmp"] .= $donnees['nom_type_economie'].' : '.$donnees['montant'].'< br/>';
Ici on vérifie à chaque fois si le signe n'est pas nul? Puis je ne comprend pas pourquoi on met $tab["$tmp"] = '';
Ce qui me perturbe pour la ligne suivante aussi....

Pour le foreach no prob :)


NB le <br /> ne se transforme pas en saut de ligne, et plus moyen de trouver l'équivalent tel que &nbsp;


Merci énormément pour le temps que tu utilises à répondre à mes questions :)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 nov. 2007, 12:51

c'est vrai j'aurais pu commenter :?

Initialisation des variables :
$tmp qui va récupérer les types d'économies (depense, recette ) l'un après l'autre.
$tab le résultat à afficher.
//boucle sur le résultat de la requête triée
While  ($donnees = mysql_fetch_assoc($requete)) 
{
    //  On vérifie si le "signe" de $donnees (enregistrement traité) est différent de la valeur en
    //  tampon $tmp si c'est le cas on sauvegarde ce nouveau type d'économie dans $tmp 
    //  et on initialise $tab avec avec un index correspondant au type d'économie qui est maintenant dans $tmp
    if($donnees['signe'] != $tmp)
    {
        $tmp = $donnees['signe'] ;
        $tab["$tmp"] = ''; 
    }
    // ensuite on à plus qu'à sauvegarder les données dans le tableau $tab toujours avec le même index (type d'économie) $tmp 
    $tab["$tmp"] .= $donnees['nom_type_economie'].' : '.$donnees['montant'].'< br/>';
} 
Pour le <br /> il a pour effet un saut de ligne je n'ai pas compris la question :?


En expliquant je me rends compte qu'il y a mieux
//Pas besoin de tri sur la requête = gain de performance
While  ($donnees = mysql_fetch_assoc($requete)) 
{
    $tmp = $donnees['signe'] ;   // sauvegarde du type pour une utilisation plus simple $tmp
 
    //  s'il n'y a pas encore de données (nom et montant de l'économie) dans le tableau résultat on
    //  initialise à vide pour pouvoir par la suite concaténer sans avoir une erreur lors de la 1ère
    //  concaténation avec une variable qui n'existerai pas le cas contraire.    
    if(empty($tab["$tmp"]))        
        $tab["$tmp"] = ''; 
    
    // ajout des informations dans le tableau à l'index $tmp. Premet de ranger tous les "depenses" à
    // la suite ici séparées par un saut de ligne
    $tab["$tmp"] .= $donnees['nom_type_economie'].' : '.$donnees['montant'].'< br/>';
} 

/!\ 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

17 nov. 2007, 01:20

Bonsoir,
je suis toujours en bataille avec mon internet lol...

Merci pour les commentaires :)

Pour le <br /> je disais qu'il n'est pas pris en compte sur ma page web il n'est pas remplacé par un saut de ligne... il s'affiche sous sa forme brut <br />
depense
Temporaire : 16000< br/>Entretien de la salle : 12000< br/>Salaire des joueurs : 25000< br/>Salaire des employes : 10135< br/>Transfert : 12450< br/>Publicite : 17878< br/>recette
Temporaire : 15896< br/>Billeterie : 132534< br/>Sponsors : 536464< br/>Boutique : 488< br/>Subvention : 12254< br/>Transfert : 12254125< br/>
caisse : 8797575< br/>
Je vais essayer grace à ton code de faire d'un coté les recettes et de l'autre les dépenses;...

Je reposterais demain si j'ai besoin d'aide .

En tout cas merci infiniment de tout l'aide que tu m'as apporté et que tu m'apportes..

Excellente soirée. :shock:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 nov. 2007, 02:00

Mouarf... un espace de trop pour < br/> :wink:

/!\ 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

17 nov. 2007, 10:54

bien vu, espace de merde :p

Donc pour avoir mon tableau j'ai fait ceci
    $tab["$tmp"] .= '<tr><td>'.$donnees['nom_type_economie'].' : </td><td>'.$donnees['montant'].'</td></tr>';
Donc ça me donne quelque chose de bien
Image

Mais je n'ai toujorus pas séparé en 2 colonnes distinctes :(

Car à la base mon code html ressemblait à ceci
<tr>
<td>ma premiere recette : </td> <td>'.$data1['montant].'</td> <td>ma première dépense </td> <td>'.$data1['montant'].'</td>
</tr>
<tr>
<td>ma seconde recette : </td> <td>'.$data1['montant].'</td> <td>ma seconde dépense </td> <td>'.$data1['montant'].'</td>
</tr>
Je pense que le problème c'est que je ne me sers pas du foreach.
Mais bon je ne vois pas comment placé mes tr et td dans le foreach puisque celui ci est bouclé seulement 2 fois avec les 2 grosse partie (premiere dépense seconde recette)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 nov. 2007, 14:13

essaie avec ceci (puisque tu pars sur une structure tableau) :
<?php
foreach( $tab as $key => $value)
{ 
   echo '<table style="float:left;margin-right: 20px" >';
   echo '<tr><td colspan="2">'.$key.'</td></tr>';
   echo $value; 
   echo '</table>';
}
?>

/!\ 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

20 nov. 2007, 23:34

Bonsoir !

Désolé de répondre après au temps de temps, masi toujorus mes problèmes de net :?


Mais dis donc pour ton code c'est parfait :D

Merci beaucouo !

Dernier truc à gérer, c'est le 13ème id_type_catégorie, il ne correspond à aucun des 2 ENUM (ni dépense ni recette) car ils s'agit du total.

Il faudrait donc que je l'affiche à part. Donc soit dans ma requete je met une clause comme quoi prendre seulement les 12 premiers id ? et dans ce cas je suis obliger de faire une seconde requete derneire pour récupérer la valeur ? Ou alors je joue sur ma boucle ?

MAIS en fait plus complexe que ça, car je dois récupérer la caisse de la semaine d'avant à laquel je rajoute les échéances de la semaine en cours.


Obliger de passer par une seconde requete ?



Désolé d'être si rapide, mais internet peut me couper à tout moment :(

Bonne soirée et encore merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 nov. 2007, 23:47

Tu peux déja commencer par rajouter le type d'économie "total" dans la base.

et dérouler le script pour voir ce qui se passe.

Pour la reprise des totaux passés (ancien + actuel) c'est une opération à éffectuer.... hmm... je ne sais pas quand :lol:
Faudrait revoir la requête actuelle.

/!\ 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

21 nov. 2007, 00:03

Tu peux déja commencer par rajouter le type d'économie "total" dans la base.

et dérouler le script pour voir ce qui se passe.
Tout ça est déja fait dans la table typeeconomie j'ai un champ "caisse"

et il s'affiche à la suite des autres sur ma page :)
Peut etr epour éviter qu'il ne s'affiche sans pour autant rendre plus complexe la requete on peut jouer sur le fait que son champ "signe" (ENUM(depense,recette) est vide :)

Voici la requete actuelle (simple^^)
$requete = mysql_query('SELECT typeeconomie.id_type_economie AS id_type_economie, nom_type_economie, montant, signe 
FROM economie 
LEFT JOIN typeeconomie
USING(id_type_economie)
WHERE id_equipe = '.$_SESSION['id_equipe'].' AND semaine = '.date("W")) or die (mysql_error());
POur récupérer la caisse de la semaine d'avant suffit de faire quelque chose comme.
mysql_query('SELECT typeeconomie.id_type_economie AS id_type_economie, nom_type_economie, montant, signe 
FROM economie 
LEFT JOIN typeeconomie
USING(id_type_economie)
WHERE id_equipe = '.$_SESSION['id_equipe'].' AND semaine = '.date("W").'-1 AND id_type_economie = 13') or die (mysql_error());
Mais coupler les 2 requetes seraient l'idéal :)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

21 nov. 2007, 00:16

j'aurai du te demander les tables aussi sous forme de CREATE TABLE...

A première vu 2 requetes séparées si tu ne veux que le total de la semaine passé.
Sinon avec un OR pour les deux dates
AND ( semaine = '.date("W").'-1 OR semaine = '.date("W").')
Ce qui me dis que tu ne pouras pas avoir les résultats sur 2 années puisque tu ne gardes que le numéro de semaine.

/!\ 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

21 nov. 2007, 23:26

ça pourrait être interessant en effet, mais je me dis qu'apres la table deviendrait vraiment enorme
et puis 1 ans correspondra plus ou moins a 3 saisons donc ça devrait etre suffisant :)

POur les tables toujours les meme :p

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 ;

Sinon je vais afficher les 2 dernières semaines dans 2 tableaux différents autant bouclé juste mon tout et faire tourner la boucle 2x juste en changeant le date("W") par date("W").'-1' afin d'afficher mes 2 tableaux.

C'est ce que je trouve de plus simple à faire.

---------------------------

Et pour l'histoire de la caisse, il me faut en fait prendre la valeur de la caisse de la semaine précédente a laquelle j'ajoute(ou soustrait) toutes les dépenses et revenus de la semaines actuelle afin d'afficher l'argent qu'à le joueur en caisse en ce moment :)
AND ( semaine = '.date("W").'-1 OR semaine = '.date("W").')

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 nov. 2007, 10:26

En effet c'est ce qu'il y de plus simple ceci dit tu peux modifier l'affichage pour récupérer les anciennes valeurs puis les nouvelles et avoir quelque chose du style

Code : Tout sélectionner

Temporaire : 16 000 (13 000)
avec l'ancienne entre parenthèse pour ne pas avoir 2 tableaux identiques.

Mais la requête sera avec le "OR" puisqu'il te faut les deux résultats (2 semaines)

/!\ 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

22 nov. 2007, 18:42

Bonjour :)

Donc tout marche presque bien Voici le code finalisé,
while ($add<=1)
{
$requete = mysql_query('SELECT typeeconomie.id_type_economie AS id_type_economie, nom_type_economie, montant, signe 
FROM economie 
LEFT JOIN typeeconomie
USING(id_type_economie)
WHERE id_equipe = '.$_SESSION['id_equipe'].' AND nom_type_economie <> "caisse" AND semaine = '.date("W").'-'.$add) or die (mysql_error());

?>

<div class="corps-sp1">
<h2> <?php if($add == 0) echo "Cette semaine"; else  echo "La semaine dernière"; ?></h2>
<?php

if($donnees = mysql_fetch_assoc($requete))
{
$tmp = "";
$tab = array();

//Pas besoin de tri sur la requête = gain de performance
While  ($donnees = mysql_fetch_assoc($requete)) 
{
    $tmp = $donnees['signe'] ;   // sauvegarde du type pour une utilisation plus simple $tmp
 
    //  s'il n'y a pas encore de données (nom et montant de l'économie) dans le tableau résultat on
    //  initialise à vide pour pouvoir par la suite concaténer sans avoir une erreur lors de la 1ère
    //  concaténation avec une variable qui n'existerai pas le cas contraire.    
    if(empty($tab["$tmp"]))        
        $tab["$tmp"] = ''; 
    
    // ajout des informations dans le tableau à l'index $tmp. Premet de ranger tous les "depenses" à
    // la suite ici séparées par un saut de ligne
    $tab["$tmp"] .= '<tr><td>'.$donnees['nom_type_economie'].' : </td><td>'.$donnees['montant'].'</td></tr>';
}


foreach( $tab as $key => $value)
{

   echo '<table style="float:left;margin-right: 20px" >';
   echo '<th colspan="2">'.$key.'</th>';
   echo $value; 
   echo '</table>'; 
} 
}
else echo "Vos derniers relevés de compte ne sont pas encore arrivés";
echo "</div>";

$add++;

}
Un seul problème, j'ai rajouté la condition

if($donnees = mysql_fetch_assoc($requete))

Afin de vérifier qu'il y a bien les donnes des semaines qui sont affichés (exemple : lorsque le gars est inscrit depuis moins d'une semaine, il ne peut pas voir la semaine précédente, donc un message est affiché :)
Seul défaut de cette condition, c'est que la derniere donnée de ma boucle n'est pas affiché :(

Eléphant du PHP | 445 Messages

22 nov. 2007, 18:49

Tu peux enlever ton if (c'est lui qui t'enleves un enregistrement).

Si il n'y a pas de donnéés alors le while ne se passera pas.
Donc ton $tmp sera une chaine vide.

Tu pourras alors tester si $tmp est vide et affiché ton message d'erreur.

Eléphant du PHP | 206 Messages

22 nov. 2007, 19:14

En mettant
 if(empty($tmp))        	
		echo "Vos derniers relevés de compte ne sont pas encore arrivés";
ou encore
if(empty($tab["$tmp"]))        
        $tab["$tmp"] = ''; 	
		echo "Vos derniers relevés de compte ne sont pas encore arrivés";
Le résultat n'est pas bon, j'ai le message d'erreur qui s'affiche plusieurs fois...

-------------------------------------------------------------
une seconde question me trotte par la tete, dans ce code y a t'il quelque chose qui pourrait faire en sorte que ça s'affiche mal si je modifie les valeurs de mon ENUM signe ?

je rappelle la table

Code : Tout sélectionner

-- Structure de la table `typeeconomie` -- 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 ;

Merci à tous bonne soirée