Nuovo controllo Punti
Nuovo controllo Punti postato il 20/04/2013 13:51:16 nel forum programmazione, open source e hosting
Buongiorno a tutti,
vi scrivo per un problema di programmazione, che in realtà è composto da più parti...
L'idea: Creare una pagina php, che verrà richiamata con un chronjob una volta al giorno, che controllo la data degli ultimi punti esperienza ricevuti da ogni PG e inserisce, nel caso la data sia più vecchia di una settimana, un malus (-1 punto esperienza) a quel PG.
Il motivo: I Punti esperienza in gioco "equivalgono" al grado di preparazione fisico e mentale dei PG. Essendo un'ambientazione militare, ci si addestra, ci si allena, si impara a sparare e si cerca di mantenere l'allenamento. A rigor di logica, se i punti salgono, man mano che il PG "migliora" in riflessi, forza fisica, prontezza ecc ecc sarebbe solo logico che se un PG non si muove per 2 settimane, questo sia "meno preparato" fisicamente e mentalmente di quanto non fosse prima.
Come fare: Il GDR è basato su GDR-CD, anche se ormai ben poco è rimasto del vecchio codice, cmq, la struttura della Tabella "Punti" non è cambiata moltissimo. Ci sono alcuni campi in più, ma per ora ignoriamoli e diamo per contato che i campi che ci interessano sono:
"Nome" (Il nome del personaggio), "DataEvento" (La data dell'ultima assegnazione dei punti) e "Esperienza" (I punti esperienza assegnati).
Il controllo dovrebbe essere:
if DataEvento < NOW-7gg
INSERT nuova riga con Nome = NomePG controllato, DataEvento = NOW e Esperienza = -1
I problemi:
- Come controllo TUTTI i PG iscritti?
- Come inserisco il valore di ID (La chiave primaria della tabella Punti) che deve "autoincrementarsi"?
Grazie a tutti ^^
20/04/2013 13:58:11
Ultima considerazione:
Pensavo di lavorare su qualcosa tipo:
UPDATE Punti
SET ID=AUtoIncrement
Nome=NomePG
Esperienza=-1
DataEvento=Now()
IDMessaggioAraldo=100
D1=0
Malus=0
WHERE DATE_ADD(DataEvento, INTERVAL 1 WEEK) <= Now()
Che ne dite?
20/04/2013 13:58:45 e modificato da overlord il 20/04/2013 14:07:03
Mi viene da pensare ad una soluzione migliore, perché invece di scomodare i job a tempo, non fai il controllo al login dell'utente? Non consumeresti neanche query in più. Quando richiami dal DB tutti i dati per la verifica che l'utente è vero, con un Join richiami anche la data ultimo evento di assegnazione PX, poi fai una verifica con IF (ovviamente XD) su questo valore, e se più vecchio di tot tempo, assegni il malus.
20/04/2013 14:12:37 e modificato da leoblacksoul il 20/04/2013 14:21:32
Una query per domarli:
INSERT INTO Punti (Nome, DataEvento, Esperienza)
(SELECT Nome, NOW(), -1 FROM
(SELECT Max(DataEvento) AS LastPunti, Nome
FROM Punti
GROUP BY Nome
HAVING DATE_ADD(LastPunti,INTERVAL 7 DAY)<NOW()) AS P1)
Dovrebbe andare, ma solamente con gli utenti che hanno avuto almeno una volta un inserimento di punti nella tabella Punti. Inoltre questa query non tiene conto del fatto che (presuppongo) i punti exp non possano scendere sotto lo 0
Non puoi usare un'update dato che vuoi inserire un nuovo record, non modificarne uno vecchio.
Gli ID impostati come autoincrement non devono venire specificati nelle query di insert.
E infine non puoi fare il controllo su righe singole, altrimenti inizieresti a inserire un sacco di righe duplicate, il controllo va fatto sulle righe aggregate.
20/04/2013 14:43:07 e modificato da sgc carter il 20/04/2013 14:46:47
OK...
Ora però, mi sono "reso conto" che inserire una riga in "Punti" non è l'unica cosa che devo fare... C'è da "togliere" un punto anche alla voce "Esperienza" della tabella "Personaggio" dove il "Nome" equivale al nome del PG "fuori allenamento" XD
Quindi,
uso un INSERT nella tabella Punti affinché il prossimo "punto" lo toglie quando passa un'altra settimana dall'ultimo controllo. E va bene
E poi devo togliere un punto exp dalla Tabella Personaggio...Any hint?
Quanto a:
"Devono aver ricevuto almeno una volta dei punti exp" certo... se non ne hanno nessuno, non possono ricevere sottrazioni, va bene.
"Non possono scendere sotto lo 0" Beh, tencicamente possono... non è un valore utile, ma in teoria, potrebbero.
20/04/2013 14:59:05 e modificato da leoblacksoul il 20/04/2013 15:00:55
una è un'update, l'altra è una insert, non si possono fare nella stessa query. Quindi devi necessariamente farle in due passi.
Fai prima:
UPDATE Personaggio AS P INNER JOIN (SELECT Max(DataEvento) AS LastPunti, Nome
FROM Punti
GROUP BY Nome HAVING DATE_ADD(P1.LastPunti,INTERVAL 7 DAY)<NOW()) AS P1 ON P.Nome=P1.Nome
SET P.Esperienza=P.Esperienza-1
E Poi:
INSERT INTO Punti (Nome, DataEvento, Esperienza)
(SELECT Nome, NOW(), -1 FROM
(SELECT Max(DataEvento) AS LastPunti, Nome
FROM Punti
GROUP BY Nome
HAVING DATE_ADD(LastPunti,INTERVAL 7 DAY)<NOW()) AS P1)
Vanno fatte in questo ordine, perchè la seconda query modifica l'insieme degli utenti selezionati usando la query aggregata. Non l'ho testata però
20/04/2013 15:01:20
Quando fai l'INSERT del -1 lanci anche un UPDATE della tabella personaggio per sottrarre 1 al suo valore totale di esperienza, e che ci vuole :D
20/04/2013 15:05:09 e modificato da sgc carter il 20/04/2013 15:11:35
Hmm, quindi inserendo questo:
mysql_query("
UPDATE Personaggio AS P INNER JOIN (SELECT Max(DataEvento) AS LastPunti, Nome
FROM Punti
GROUP BY Nome HAVING DATE_ADD(P1.LastPunti,INTERVAL 7 DAY)<NOW()) AS P1 ON P.Nome=P1.Nome
SET P.Esperienza=P.Esperienza-1
");
mysql_query("
INSERT INTO Punti (Nome, DataEvento, Esperienza)
(SELECT Nome, NOW(), -1 FROM
(SELECT Max(DataEvento) AS LastPunti, Nome
FROM Punti
GROUP BY Nome
HAVING DATE_ADD(LastPunti,INTERVAL 7 DAY)<NOW()) AS P1)
");
in login.php,
ogni qual volta entri un personaggio, la query controlla chi non ha preso punti negli ultimi 7 gg e sottrae un punto esperienza a chi non ne ha ricevuti, per poi inserire in tabella Punti una nuova riga utile per il prossimo controllo... giusto?
20/04/2013 15:14:14 e modificato da leoblacksoul il 20/04/2013 15:15:10
Si esatto. Io la farei in un cron però, al login viene eseguita molte più volte di quanto sia necessario e le query aggregate sono pesantucce.
Ricordati di testarle prima metterle per davvero sul tuo gdr, io non le ho testate per davvero ;)
20/04/2013 15:16:51
Sto testando or ora e...
Funziona la parte dell'inserimento della riga in "punti" ma non sottrae il punto al Personaggi nella tabella Personaggio...
20/04/2013 15:42:02
Domanda... ma perché proprio in quell'ordine?
Ho controllato i vari dati, nome tabella, nomi campi ecc ecc, e sono tutti giusti... può essere che il problema sia nel "Join" dei dati?
Discussione seguita da
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
World of Tanks ↗
Fallen Gods ↗
Seconda Era ↗
Neverness to Everness ↗
State of Survival ↗
Hero Wars ↗
Enlisted ↗
New Orleans ↗