Visualizzazione risultati 1 fino 5 di 5

Discussione: Problemi con la gestione di query in php

  1. #1
    islacalina non è connesso Neofita
    Data registrazione
    28-04-2016
    Messaggi
    3

    Unhappy Problemi con la gestione di query in php

    Salve a tutti!
    Spero di non disturbare e ringrazio in anticipo chi avrà la pazienza e la voglia di aiutarmi con il mio problema. Premetto che non sono esattamente un esperta in programmazione, anzi, il termine migliore che potrei usare per me stessa è autodidatta, ma frana probabilmente è quello più corretto.

    In questi giorni sto cercando di sviluppare una piccola pagina che vada ad aggiornarmi una variabile nel database a seconda del suo stesso valore ed il tempo trascorso dall'ultimo aggiornamento. Posto il codice e mi spiego meglio.
    Codice:
    <?
    $result = gdrcd_query("SELECT ultimomana, (DATE_ADD(ultimomana, INTERVAL 3 MINUTE) < NOW()) AS tempo,DATE_ADD(ultimomana, INTERVAL 3 MINUTE) AS time FROM mana WHERE nome = '".$_SESSION['login']."' LIMIT 1", 'result'); 
    $record_exists = gdrcd_query($result, 'num_rows');
    $record = gdrcd_query($result, 'fetch');
    $tempo_ok=$record['tempo'];
    $ultimomana=$record['ultimomana'];
    $time=$record['time'];
    
    
    $result = gdrcd_query("SELECT * FROM mana WHERE nome = '".$_SESSION['login']."'  LIMIT 1", 'result'); 
    $record_exists = gdrcd_query($result, 'num_rows');
    $record = gdrcd_query($result, 'fetch');
    $mana=$record['mana'];
    $maxmana=$record['maxmana'];
    
    
    if ($tempo_ok ==1) {
    
    
    	if (intval($maxmana) <= intval($mana)) {
    	$query = "UPDATE mana SET ultimomana = NOW() WHERE nome = '".$_SESSION['login']."' LIMIT 1";
    	$result = gdrcd_query($query,'result');
    
    	} else {
        
        $recupero=120;
        $tempotrascorso =  strtotime($ultimomana);
        $inttemporale= $recupero+$tempotrascorso;
        while (($inttemporale < time())&&(intval($mana) <= intval($maxmana))) {
       			$query = "UPDATE mana SET mana = mana+1 WHERE nome = '".$_SESSION['login']."' LIMIT 1";
    			$result = gdrcd_query($query,'result');
    			$mana=$mana+1;
                $inttemporale=$intemporale+120;		
    		}
            $query = "UPDATE mana SET ultimomana = NOW() WHERE nome = '".$_SESSION['login']."' LIMIT 1";
    		$result = gdrcd_query($query,'result');
    	}
    
    } else {
    
    
    }
    ?>
    Ogni volta che mi si riaggiorna il sito, questa pagina avrebbe il compito di controllare ad ogni utente online quanto mana possiede, e se tale valore è inferiore alla variabile maxmana a lui assegnata, aggiornare la variabile mana di un punto. Nel caso in cui un utente al momento del logout aveva meno mana del suo massimale invece, incrementare la variabile mana di un punto per ogni tre minuti che questi è stato assente dal sito.

    Ora... questo in pratica è quello che sogno di notte di riuscire a fargli fare, mentre materialmente... sono riuscita semplicemente a fargli incrementare la variabile mana sino al maxmana (e anche male visto che me la supera di un punto)... quindi... ho davvero bisogno di un aiutino. >.<

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Mh, non sarebbe più semplice avere solo uno script che diminuisce di un 1 punto il valore mana associato ad i personaggi connessi, effettuando invece l'aggiunta di punti mana nel momento in cui un personaggio di connette?

    Detta a grandi linee e senza conoscere la struttura della base di dati, in pseudo codice intendo qualcosa di questo tipo:
    Codice:
    // Da chiamare periodicamente
    UPDATE giocatore SET mana = mana - 1 WHERE status = connesso
    
    // Da chiamare quando un giocatore si connette
    $giocatore <- SELECT * FROM giocatore WHERE id = $id;
    $recupero = (time() - $giocatore->tempo_disconnessione) / 120;
    $giocatore->mana += $recupero;
    UPDATE giocatore SET status = connesso, mana = $giocatore->mana WHERE id = $id

  3. #3
    islacalina non è connesso Neofita
    Data registrazione
    28-04-2016
    Messaggi
    3

    Predefinito

    il mana viene scalato nel momento in cui un utente in chat esegue un determinato comando, ed una volta che non ne possiede a sufficienza non può più eseguire quella determinata azione, dovendo così aspettare di recuperarne a sufficienza con il passaggio del tempo.
    Quindi non potrei aspettare che rifaccia il login e basta per il suo recupero di mana, in quanto se dovesse attendere il tempo sufficiente, ancora connesso, in chat, dovrebbe poter riusare quella stessa azione. >.<

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Quindi il mana viene recuperato anche quando si è connessi, sempre col criterio di 1 punto ogni 3 minuti?
    In questo caso basta "chiamare" questo pseudo codice ogni qualvolta l'utente cerca di compiere un'azione:
    Codice:
    $giocatore <- SELECT * FROM giocatore WHERE id = $id;
    $timestamp = time();
    $recupero = ($timestamp - $giocatore->timestamp_ultima_azione) / 120;
    $giocatore->mana = min($giocatore->mana + $recupero, $giocatore->maxmana);
    UPDATE giocatore SET timestamp_ultima_azione = $timestamp, mana = $giocatore->mana WHERE id = $id
    Anziché avviare una procedura ogni tre minuti per ciascun giocatore (cosa piuttosto dispendiosa!), l'idea è di farlo una volta sola al bisogno, ad esempio quando cerca di compiere un'azione o si connette. Quando e come lanciarla, dipende dalle regole.

  5. #5
    islacalina non è connesso Neofita
    Data registrazione
    28-04-2016
    Messaggi
    3

    Predefinito

    Non sò davvero come ringraziarvi per la disponibilità e l'aiuto, purtroppo non sono riuscita ad utilizzare le vostre soluzioni, suppongo per mia incompetenza, ma grazie alle vostre risposte sono riuscita ad elaborare un metodo alternativo considerando il tutto da un altra angolazione. Perciò davvero. Grazie!!

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •