Financieële updates
Bij een managerspel heb je altijd inkomsten en uitgaven.
Ik probeerd dmv een cronjob (het MOET met een cronjob, want als de gebruiker 2 weken niet inlogt, moet hij nog altijd zijn wekelijkste uitgaven betalen) elke gebruiker zijn spelers te selecteren uit de database en hun salarissen bij elkaar optellen. Dit totaal zet ik weer in een andere cronjob, de cronjob die iedere onbetaald item betaald en verwijdert. Deze laatste cronjob is al helemaal klaar en werkt perfect. Enkel met de eerste heb ik wat moeilijkheden, als ik het door de user zelf laat doen dan gaat het, maar dan zit ik met het probleem, dat de inactieve gebruikers niet zullen klikken, waardoor zij geen salaris moeten betalen!
Moeilijke uitleg, maar ik heb men best gedaan!
Kan iemand me hierbij helpen?
Gewijzigd op 01/01/1970 01:00:00 door Jens
Quote:
En leg mij eens uit waarom je dat niet kunt doen wanneer de gebruiker weer inlogt...het MOET met een cronjob, want als de gebruiker 2 weken niet inlogt, moet hij nog altijd zijn wekelijkste uitgaven betalen
Een cronjob is voor zaken die absuluut op een vast moment, bv. 00:00 uur 's nachts moeten gebeuren. Het hele systeem moet bij wijze van spreken instorten mocht de job niet is uitgevoerd. Alarmbellen moeten afgaan! En dat is hier niet het geval, het zal je een rotzorg zijn, je kunt op ieder willekeurig moment de job uitvoeren, zolang de gegevens maar up-to-date zijn wanneer iemand inlogt. Iemand die niet speelt, hoeft ook niet te weten hoe de vlag er bijhangt. Dit is weer zo'n typisch voorbeeld waarbij je géén cronjobs nodig hebt.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Dus ik doe het met een Cronjob. Hoe doe ik het?
Maak een script die de update-query uitvoert en stel een cron in die dit script aanroept. En klaar is Klara.
Ik weet wel hoe ik een cronjob moet aanroepen, ik weet enkel niet hoe ik de query bij alle gebruikers moet updaten..
1. Selecteer een 'manager'
2. Selecteer elke speler die voor deze manager speelt en tel hun salarissen op.
3. Sla het bedrag op in database voor de desbetreffende gebruiker
4. Begin met de volgende gebruiker
Ik bespeur in elk geval een JOIN en een punt 4 die lichtelijk overdreven is. Het is onzinnig om per gebruiker een aparte query uit te voeren, dan kan best in 1 klap. Gebruik wel een transaction om in geval van problemen alles ongedaan te kunnen maken.
Maar zonder datamodel kan niemand je helpen.
En waarschijnlijk heb je geen CRONJOB nodig. Voer het script gewoon uit bij de eerste gebruiker van de week.
Je kunt ook als gebruiker X inlogt gebruiker X en gebruiker Y updaten. Een cron is dus niet nodig.
Stel dat hij dus 2 weken niet inlogt, dan staan er voor hem dus 2 weken salaris "te wachten" die worden bijgeteld als hij inlogt.
Martijn schreef op 16.09.2007 21:59:
Of je doet het natuurlijk zo, je registreert de salarissen voor iedere gebruiker en voert ze pas uit als hij online komt.
Stel dat hij dus 2 weken niet inlogt, dan staan er voor hem dus 2 weken salaris "te wachten" die worden bijgeteld als hij inlogt.
Stel dat hij dus 2 weken niet inlogt, dan staan er voor hem dus 2 weken salaris "te wachten" die worden bijgeteld als hij inlogt.
Misschien is het juist wel de bedoeling dat de 'manager' een mailtje krijgt waneer deze failliet gaat, of dat anderen kunnen zien of hij failliet is.
In dat laatste geval is het denk ik efficiënter om het wel in een (nep)cronjob te doen, zodat je niet bij iedere query hoeft te controleren of de salarissen al up-to-date zijn.
Ik probeer het data model zo goed mogelijk uit te leggen:
1. Selecteer alle gebruikers in de tabel gebruikers waar de actieve status gelijk is aan 1.
2. Selecteer alle spelers die voor de desbetreffende manager spelen uit de tabel spelers en tel hun salarissen op (veld salaris)
3. Sla de nieuw record op in financien met gebruiker,bedrag,betaald (0= niet betaald, 1 is wel betaald)
@ Frank, het was ook niet mijn bedoeling om alle gebruikers een voor een te updaten, was gewoon bij wijze van spreken.
Geef gewoon even een SQL-dump van de tabellen en de foreign key's, dat is 100x duidelijker dan de boel in tekst uitleggen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?
--
-- Tabel structuur voor tabel `financereports`
--
CREATE TABLE `financien` (
`id` int(255) NOT NULL auto_increment,
`persoon` varchar(255) NOT NULL default '',
`bedrag` int(255) NOT NULL default '0',
`betaald` int(255) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
--
-- Tabel structuur voor tabel `spelers`
--
CREATE TABLE `spelers` (
`id` int(255) NOT NULL auto_increment,
`naam` varchar(255) NOT NULL default '',
`leeftijd` int(255) NOT NULL default '0',
`salaris` int(255) NOT NULL default '0',
`eigenaar` varchar(255) NOT NULL default 'Geen',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
--
-- Tabel structuur voor tabel `[users]`
--
CREATE TABLE `gebruikers` (
`id` int(11) NOT NULL auto_increment,
`ip` varchar(128) NOT NULL default '',
`regdat` datetime NOT NULL default '0000-00-00 00:00:00',
`name` varchar(50) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
?>
--
-- Tabel structuur voor tabel `financereports`
--
CREATE TABLE `financien` (
`id` int(255) NOT NULL auto_increment,
`persoon` varchar(255) NOT NULL default '',
`bedrag` int(255) NOT NULL default '0',
`betaald` int(255) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
--
-- Tabel structuur voor tabel `spelers`
--
CREATE TABLE `spelers` (
`id` int(255) NOT NULL auto_increment,
`naam` varchar(255) NOT NULL default '',
`leeftijd` int(255) NOT NULL default '0',
`salaris` int(255) NOT NULL default '0',
`eigenaar` varchar(255) NOT NULL default 'Geen',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
--
-- Tabel structuur voor tabel `[users]`
--
CREATE TABLE `gebruikers` (
`id` int(11) NOT NULL auto_increment,
`ip` varchar(128) NOT NULL default '',
`regdat` datetime NOT NULL default '0000-00-00 00:00:00',
`name` varchar(50) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
?>
Waarom gebruik je geen innoDB? Dat is de enige engine in MySQL waar iets zinnigs mee is te doen.
Een INT(255) bestaat niet en (geld-) bedragen kun je meestal beter opslaan in een DECIMAL().
Verder zul je eerst eens moeten gaan normaliseren, het verband tussen de diverse tabellen is niet (goed) vastgelegd. Zie de tutorials hoe je gaat normaliseren en hoe je de foreignkeys kunt gebruiken.
Met jouw huidige opzet ga ik je niet verder helpen, heb niet zo'n zin om je met lapmiddelen van de wal in de sloot te helpen.
Ps. NOT NULL default '0000-00-00 00:00:00' slaat nergens op (eigenschap van PMA, maar goed). Je geeft óf een NOT NULL óf een default waarde op. Nooit beide, daarmee help je de NOT NULL om zeep. 'het is verplicht om een waarde op te geven, maar mocht je dat vergeten, neem dan de default waarde.'. Dan is het blijkbaar niet verplicht om een waarde op te geven!
Ik ben ook maar een beginner en ik script maar voor het plezier en om te leren.