Nuovo controllo Punti
20/04/2013 15:55:11
leoblacksoul ha scritto: 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.
Scusami Leo, ma se setta le query al log-in come dicevo io, invece che così come sono, non dovrebbero consumare di più... o sto dicendo follie in preda al delirio mistico di programmatore mancato? XD
20/04/2013 15:58:15
Ma al login del personaggio stesso, il controllo da eseguire è diverso.
Dovresti controllare di quanti "intervalli di 7 giorni" il PG che rientra non ha preso punti.
Ora lo sto provando nel login.php, ma volendo, inserirlo in un file php che parte ogni giorno, a mezzenotte (per esempio) non è un problema. E in questo modo il controllo cmq non è tanto "lavoro"...
20/04/2013 15:59:05 e modificato da sgc carter il 20/04/2013 16:12:02
Cmq, Overlord, tu come dicevi di eseguire l'UPDATE del peronaggio nella tabella personaggio? Sempre con una query separata, no?
CMQ, nella 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
lanciata direttamente in DB, come prova, mi dice:
#1054 - Unknown column 'P1.LastPunti' in 'having clause'
E infatti, togliendo il "P1." funziona ^^
20/04/2013 16:10:44
Eh, io non vado mai d'accordo con i Cron Job, per quanto utili su alcuni server danno noie, o di funzionamento, o di pagamento, vedi su Altervista. Comunque sì, l'update, da quello che so almeno, puoi farlo solo separatamente.
20/04/2013 16:13:26
Io con i cronjob ho risolto "tanti" problemi"...
L'aumentare dei punti salute, nel tempo (quindi i malati si riprendono un tot all'ora...) e insomma, se impostati bene, funzionano.
Ora provo il codice per intero poi lo posto qui... in caso servisse ad altri ^^
20/04/2013 16:25:26
Ed ecco il codice, bellu pulito e pronto, da inserire in un cronjob o in login.php:
mysql_query("
UPDATE Personaggio AS P INNER JOIN (SELECT Max(DataEvento) AS LastPunti, Nome
FROM Punti
GROUP BY Nome HAVING DATE_ADD(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)
");
Grazie a tutti :-)
20/04/2013 19:58:36
My bad, ho spostato avanti e indietro quella condizione having e mi era rimasto un pezzo di una versione vecchia :P
comunque overlord: quelle query messe nel login rubano più risorse perchè vengono eseguite a ogni singolo login fatto, e ogni giorno di sono decine se non centinaia di login. Il controllo è di natura settimanale, non ha senso eseguirlo così spesso. In un cron viene eseguito solo quella volta al giorno in cui lo imposti.
Inoltre è meglio fare una sola query grossa piuttosto che tante piccole query per ogni utente
09/05/2013 22:22:02
Errata corrige:
Il codice da me postato in precedenza:
sgc carter ha scritto:
mysql_query("
UPDATE Personaggio AS P INNER JOIN (SELECT Max(DataEvento) AS LastPunti, Nome
FROM Punti
GROUP BY Nome HAVING DATE_ADD(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)
");
NON funziona.
In particolare NON aggiorna la Tabella "Punti" pertanto una volta che passano 7 giorni dagli ultimi punti presi, i PG perdono 1 punto per ogni esecuzione del login/chron job.
Qualche idea su come far aggiornare la tabella punti in modo tale che una volta PERSO un punto se ne riperda un'altro SOLO dopo altri 7 gg e non dopo il prossimo login/chron job?
Grazie a tutti
10/05/2013 00:44:19
semplice oltre a togliere 1 punto nella stessa query imposti la DataEvento (quella su cui fai il check) ad oggi.
10/05/2013 01:12:49
quel controllo c'è già O.o è la condizione specificata dopo la parola chiave HAVING.
Io l'ho appena testata sul mio db e gli utenti vengono selezionati correttamente, l'inserimento avviene correttamente e se rieseguo la query l'insieme risulta vuoto.
Se dici che non ti aggiunge le righe dentro a Punti vuol dire che c'è un errore nella query, hai provato a stampare gli errori con mysql_error()? Probabilmente i campi aggiuntivi che hai nella tabella Punti non sono settati correttamente o hai chiavi primarie duplicate
Discussione seguita da
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Fallen Gods ↗
New Orleans ↗
Neverness to Everness ↗
Storie di Agarthi ↗
AlterEgo ↗
World of the Sea Battle ↗
Exclusive Villa GdR ↗
State of Survival ↗
Cafuné ↗