[PHP] Intercettare ed aggiornare campi di un database

piero60

Utente Attivo
26 Gen 2015
71
2
8
Non riesco a risolvere un problema, lo spiego:

In un database ho un campo che si chiama "selected" ed è di tipo "enum" che può valere 0 oppure 1, per defaul vale 0
Un secondo campo che si chiama "deseleziona" che è un "int(15)" nel quale scrivo l'ora presa dal sistema creando la variabile $ora = time();
La variabile la creo perchè poi mi serve per altro e la utilizzo anche per questa esigenza.

Fin qui nessun problema l'utente seleziona un oggetto, viene aggioranato il database, il campo "selected" viene settato a 1 e sul campo "deseleziona" viene scritta l'ora attraverso la variabile "$ora" prima creata.

Il problema nasce nel momento in cui devo aggiornare questi 2 campi:
L'esigenza è quella di rimettere a 0 tutti i record in cui il campo "selected" è uguale a 1 ed il campo "deseleziona" contiene un valore di tempo rispetto al quale l'ora attuale del sistema è superiore di 120 secondi o più,
se è inferiore o uguale non devo aggiornare nulla

Il tempo scritto nei vari campi "deseleziona" è sicuramente differente nei vari record perchè dipende dal momento in cui è stata effettuata la selezione e conseguentemente aggiornato il database.

Ho provato e riesco a settare tutto a 0 se superato il tempo stabilito di 120 secondi, quello che non riesco a fare è settare a zero i 2 campi solo nei record nei quali effettivamente il tempo salvato nel campo "deseleziona"
è superiore di 120 secondi o più rispetto all'ora attuale del sistema.

Qualche idea?

Grazie
 

marino51

Utente Attivo
28 Feb 2013
2.674
135
63
Lombardia
il tempo salvato nel campo "deseleziona"
è superiore di 120 secondi o più rispetto all'ora attuale del sistema
non potrà mai essere …..
forse è vero il contrario

ps, considera che time restituisce il tempo UTC non locale, (può essere un vantaggio, basta saperlo)
 

piero60

Utente Attivo
26 Gen 2015
71
2
8
Ieri sera ho fatto alcune considerazioni ed ho risolto come da codice allegato, sembrerebbe funzionare.

PHP:
<?php
$ora = time();
$sel = "0";   
$azzeratime = 0;
$ip1 = "";
 
$sql = "SELECT * FROM evento1 WHERE selected ='1'" ;
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    while($row = mysqli_fetch_assoc($result)) {   
          $id = $row['id'];   
          $calcola = $row['deseleziona'];     
          
$diff = $ora - $calcola;
    
//se ora attuale > di tempo di attesa azzero il record selezionati   
if ($diff > 120 ) {

    $sql = "UPDATE evento1 SET selected='$sel', deseleziona='$azzeratime', ip_registrazione='$ip1' WHERE id='$id' ";       
      mysqli_query($conn, $sql);   
    
echo "AZZERAMENTO RECORD EFFETTUATO <br>";       
  }
 }
}
echo "NESSUN RECORD DA AZZERARE <br>";
?>
 

marino51

Utente Attivo
28 Feb 2013
2.674
135
63
Lombardia
avresti potuto risolvere anche con una sola query
Codice:
$ora = time() - 120;

$sql = "UPDATE evento1 SET selected='0', deseleziona=0, ip_registrazione='' WHERE selected='1' and deseleziona<".$ora;       

.....
con attenzione agli apici da evitare per i campi numerici
 

Rikk73

Utente Attivo
7 Apr 2015
133
6
18
Arezzo
Scusa una domanda, ma perchè tutte queste interazioni con il db? appesantisci il network rallentando anche l'app e facendo lavorare quasi inutilmente il db. Potresti utilizzare le sessioni per salvare le informazioni temporanee ed andare ad agire nel db aggiornando il time solo quando serve (a meno che non mi sfugga qualcosa, non conoscendo l'architettura del software, ma così ottimizzeresti molto)