[PHP] Intercettare ed aggiornare campi di un database

Discussione in 'PHP' iniziata da piero60, 12 Settembre 2018.

Tag (etichette):
  1. piero60

    piero60 Utente Attivo

    Registrato:
    26 Gennaio 2015
    Messaggi:
    71
    Mi Piace Ricevuti:
    2
    Punteggio:
    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
     
  2. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.164
    Mi Piace Ricevuti:
    94
    Punteggio:
    48
    Occupazione:
    free lance
    Località:
    Lombardia
    non potrà mai essere …..
    forse è vero il contrario

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

    piero60 Utente Attivo

    Registrato:
    26 Gennaio 2015
    Messaggi:
    71
    Mi Piace Ricevuti:
    2
    Punteggio:
    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>";
    ?>
     
  4. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.164
    Mi Piace Ricevuti:
    94
    Punteggio:
    48
    Occupazione:
    free lance
    Località:
    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
     
  5. Rikk73

    Rikk73 Utente Attivo

    Registrato:
    7 Aprile 2015
    Messaggi:
    118
    Mi Piace Ricevuti:
    5
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    .NET Software Developer
    Località:
    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)
     
Sto caricando...

Condividi questa Pagina