php non prende l'orario del server? Eppure uso timestamp()

Malware

Utente Attivo
19 Lug 2012
112
0
0
Buona sera e buona estate a tutti voi:rolleyes:

Come sempre i titoli delle mie discussioni saltano agli occhi:hammer:

Allora, tento di spiegare nel miglior modo possibile.
Sto scrivendo un browsergame, e sono incappato in un problema che mai pensavo di avere.
In questo BG c'è un edificio, l'accademia.
All'interno dell'accademia posso inserire degli scienziati che mi diano un tot di punti ricerca l'ora, e fin qui tutto bello e perfetto.
Il problema arriva quando il solito giocatore furbo porta avanti l'orario del suo pc, ricarica la pagina, e i punti ricerca prendono il volo e salgono magicamente.
Direte voi: certo, devi usare l'orario del server. Embè, lo sto facendo :)
Sicuramente sbaglio io, ma dove?

Quando un giocatore inserisce dei scienziati, prendo il timestamp del momento, lo salvo nel db nel suo bel record.
Quando ricarica la pagina, prendo il timestamp attuale, faccio la differenza tra questo e quello precedente salvato nel db, e mi calcolo i punti ricerca da dare al giocatore.
Ecco il codice che mi aggiorna i punti ricerca:

PHP:
function update_research_points() {

$playerid=$_SESSION['playerid'][prefix_s]; //prefix_s è in base al numero del server di gioco

$query="SELECT SUM(cittadini_acca), puntiscienza, ora FROM ".prefix_tb."ricerche, ".prefix_tb."citta WHERE id = idproprietario AND id = $playerid";

$esegui=mysql_query($query) or die(mysql_error());

$risultato=mysql_fetch_row($esegui);

$scienziati=$risultato[0];
$puntiscienza=$risultato[1];
$ora=$risultato[2]; //precedente timestamp

$mktime=mktime(); //timestamp attuale
$secondi_trascorsi = $mktime - $ora; 		//secondi trascorsi dal momento in cui il giocatore visita game.php al momento precedente

if ($ora != 0 and $scienziati != 0 and $secondi_trascorsi > 19 ) { //l'ultima condizione perchè non aggiorno i punti ad ogni secondo, ovviamente:)
	
	$ore_trascorse = $secondi_trascorsi/3660;				//ore trascorse... " "
	
	$punti_nuovi = $scienziati * $ore_trascorse;			//punti da aggiungere al giocatore
	
	$query="UPDATE ".prefix_tb."ricerche SET ora = $mktime , puntiscienza=puntiscienza + $punti_nuovi WHERE id = ".$_SESSION["playerid"][prefix_s];
	mysql_query($query);

} 

}
Un grazie in anticipo:fonzie:


EDIT
Nel titolo ho scritto timestamp(), ma la funzione è mktime()
 

Malware

Utente Attivo
19 Lug 2012
112
0
0
Se potessi scavare una buca e nascondermi dentro, lo farei.
Ho sempre provato in locale, quindi modificando l'ora del pc anche quella del server si adattava:incazz2:

Scusate, ma a volte l'età fa questi scherzi.
Un grazie comunque:)
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
per leggere la data devi usare
time()
PHP:
$mktime=time(); //timestamp attuale
mktime(ore,min,sec,mese,giorno,anno) dove ore, min ecc... numeri interi
serve per trasformare una data in formato "umano" in data timestamp
 

Malware

Utente Attivo
19 Lug 2012
112
0
0
ciao
per leggere la data devi usare
time()
PHP:
$mktime=time(); //timestamp attuale
mktime(ore,min,sec,mese,giorno,anno) dove ore, min ecc... numeri interi
serve per trasformare una data in formato "umano" in data timestamp
Ciao
Mmmm io con
PHP:
$mktime=mktime(); //timestamp attuale
mi raco il timestamp del momento...

Ora vado a vedere cosa fa questop time()

Grazie:)
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
mktime() senza parametri ha la stessa funzione di time()
mi sono permesso di testare la velocita di entrambe le funzioni
time() è nettamente piu veloce

PHP:
<?php
    $data = date('Y-m-d H:i:s');
    $time_start = microtime(true);
    for ($i = 0; $i < 1000; $i++) {
    $time_attuale = time();
    }
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo "Script eseguito in " . substr($time, 0, 6) . " secondi -> time() " . time() . "<br/>";
    
    $data = date('Y-m-d H:i:s');
    $time_start = microtime(true);
    for ($i = 0; $i < 1000; $i++) {
    $time_attuale = mktime();
    }
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo "Script eseguito in " . substr($time, 0, 6) . " secondi -> mktime() " . mktime();
    ?>
output
Codice:
Script eseguito in 0.0030 secondi -> time() 1374763809
Script eseguito in 0.0324 secondi -> mktime() 1374763809
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
C'è un metodo ancora più veloce : $_SERVER['REQUEST_TIME']
PHP:
$data = date('Y-m-d H:i:s');
$time_start = microtime(true);
for ($i = 0; $i < 1000; $i++) {
    $time_attuale = $_SERVER['REQUEST_TIME'];
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Script eseguito in " . substr($time, 0, 6) . " secondi";
output
Codice:
Script eseguito in 0.0007 secondi