Contare totale risultati tabella in un periodo di tempo

  • Creatore Discussione Creatore Discussione miagy
  • Data di inizio Data di inizio

miagy

Utente Attivo
2 Nov 2014
83
1
8
Ciao ragazzi, sto iniziando ad avere dei problemi con un codice che fino a settimana scorsa ha sempre funzionato alla perfezione e che non ho più toccato.
Passo qui di seguito a spiegare sommariamente.
Il mio sito è composto di diverse chat, le quali hanno uno specifico ID. Il sistema deve prendere tutti i dati raccolti di uno specifico user e, se superiori a 4 in quella specifica chat, viene assegnato un premio. Il premio può essere dato una sola volta al giorno (dunque se dopo aver ricevuto il premio cambio chat e scrivo altre 4 volte, il premio non viene dato, ma bisognerà aspettare il giorno dopo).

1) La prima cosa che faccio è valorizzare la data ultima di quando un utente ha ricevuto il premio:

PHP:
$result_premio = query("SELECT last_date_premio FROM user WHERE nome = '".$_SESSION['login']."'");
$last_date_premio = $result_premio['last_date_premio'];

2) La seconda cosa che ho fatto, è stabilire il range temporale. Il sistema deve calcolare tutti i risultati che partono dalle 6:00 AM alle 5:59 AM del giorno dopo (e non dalle 00:00 alle 23:59).

PHP:
//setto gli estremi temporali//
            $now = time();
            $this_morning = strtotime('today 6:00');
            $last_action = strtotime($last_date_premio);

3) Da qui parto con il conteggio:

PHP:
$check_actions = query("SELECT * FROM windows WHERE id_chat = ". $_SESSION['id_chat'] ." && user = '". $_SESSION['login'] ."' && DATE_ADD(ora, INTERVAL 12 HOUR)  >= NOW()", 'result');
            if(query($check_actions, 'num_rows') >= 4) {
//vedi spiegazione sotto
}

Se i risultati sono superiori o uguali a 4 (dunque nell'if num_rows), vedo se il premio non è stato assegnato nel range 6:00-5:59:


PHP:
if ($now - $last_action >= (24 * 60 * 60) || ($last_action < $this_morning && $now >= $this_morning))
            {
//assegno il premio e modifico il campo $last_date_premio a NOW()
            } else {
//Non assegno nulla perché il premio è già stato dato
}

Qui nasce il problema, perché credo non mi riconosca più il range temporale stabilito (6:00-5:59). Siccome non saprei spiegare precisamente il problema, lo illustro fornendo degli esempi:

28/11/2022

Inizio conversazione: 22:00
Quarto risultato: 00:30
-> Premio assegnato

29/11/2022

Inizio conversazione: 21:00
Quarto risultato: 23:30
-> Premio NON assegnato (e dovrebbe invece assegnarlo perché rientra nel nuovo giorno (6:00-5:59)

30/11/2022

Inizio conversazione: 15:00
Quarto risultato: 16:30
-> Premio assegnato (E questo mi fa capire che il problema del 29/11 credo nasca dal premio assegnato dopo la mezzanotte del 28/11)

C'è per caso un errore nel calcolo del range?
 
Ultima modifica:
Ciao, in questa riga mi pare ci sia un typo :
PHP:
if(query($check_actions, 'num_rows') => 4) {
l'operatore "maggiore o uguale" dovrebbe essere >=, nelle altre parti è scritto correttamente ma qui hai invertito i caratteri
 
Ciao, in questa riga mi pare ci sia un typo :
PHP:
if(query($check_actions, 'num_rows') => 4) {
l'operatore "maggiore o uguale" dovrebbe essere >=, nelle altre parti è scritto correttamente ma qui hai invertito i caratteri
Ho sbagliato io a copiare, in realtà è >= anche nel file.
Dunque deduco che l'errore non sia nel calcolo del giusto, ma altrove.
Il calcolo del giorno 6:00-5:59 è giusto?
 
Ok, ho la certezza che il bug nasca per la questione mezzanotte. Nello specifico, questo:

28/11/2022

Inizio conversazione: 22:00
Quarto risultato: 00:30 (dunque siamo al 29/11)
-> Premio assegnato

29/11/2022

Inizio conversazione: 21:00
Quarto risultato: 23:15
-> Premio NON assegnato (e dovrebbe invece assegnarlo perché rientra nel nuovo giorno (6:00-5:59)

30/11/2022

Inizio conversazione: 15:00
Quarto risultato: 16:30
-> Premio assegnato (E questo mi fa capire che il problema del 29/11 credo nasca dal premio assegnato dopo la mezzanotte del 28/11)

Quindi credo che, a questo punto, il problema sia nel calcolo del giorno del 28/11, che il sistema lo valuta come 29 ma che nell'ottica del range temporale appartiene ancora al 28/11 (perché il nuovo giorno l'ho settato dalle 6:00 alle 5:59). Nello specifico, ritengo sia qui:


PHP:
//setto gli estremi per il px//
            $now = time();
            $this_morning = strtotime('today 6:00');
            $last_action = strtotime($last_date_premio);

if ($now - $last_action >= (24 * 60 * 60) || ($last_action < $this_morning && $now >= $this_morning)) {
   
    //assegno il premio
}

Sono disperato!
Come posso specificare che se il premio viene ricevuto dopo la mezzanotte, questo fa parte del giorno prima, perché il giorno "nuovo" deve essere calcolato dalle 6 del mattino?
Vi prego :(
 
2) La seconda cosa che ho fatto, è stabilire il range temporale. Il sistema deve calcolare tutti i risultati che partono dalle 6:00 AM alle 5:59 AM del giorno dopo (e non dalle 00:00 alle 23:59).
come dire che oggi alle ore 14 del 16/12, puoi calcolare i risultati tra le 5.59 del 16/12 e le 6.00 del 15/12
non potendo aver registrato risultati nel "futuro" ovvero dopo le ore 14 di oggi
devi cioè calcolare i risultati tornando indietro non in avanti (non esistono)

ovvero il premio conseguito tra le 6.00 di oggi 16/12 e le 5.59 di domani 17/12 posso assegnarlo solo dopo le 5.59 di domani
mentre mi sembra che ragioni in avanti ......
 
Ultima modifica:
come dire che oggi alle ore 14 del 16/12, puoi calcolare i risultati tra le 5.59 del 16/12 e le 6.00 del 15/12
non potendo aver registrato risultati nel "futuro" ovvero dopo le ore 14 di oggi
devi cioè calcolare i risultati tornando indietro non in avanti (non esistono)

ovvero il premio conseguito tra le 6.00 di oggi 16/12 e le 5.59 di domani 17/12 posso assegnarlo solo dopo le 5.59 di domani
mentre mi sembra che ragioni in avanti ......
Quindi mi consigli di agire così?

PHP:
$now - $last_action <= (24 * 60 * 60)
 

Discussioni simili