[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
 
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>";
?>
 
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
 
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)
 

Discussioni simili