Comparazione date php/mysql

di il
1 risposte

Comparazione date php/mysql

Ciao a tutti,
sto cercando di creare un sistema che mi permetta di creare una specie di regalo di accesso giornaliero per il mio gioco. Praticamente ogni giorno se il giocatore effettua l'accesso al gioco (ovviamente dopo l'ora di reset del giorno), può ricevere un premio per il suo primo accesso giornaliero.
Nonostante sia un neofita di PHP e MySql, ho cercato di stendere del codice. La prima parte sembra funzionare correttamente, ma sto riscontrando problemi nella stesura della seconda parte di codice.
<?php
// dati accesso database
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "dailybonus";

// Create connection
$mysqli = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($mysqli->connect_error) {
    die("Connessione fallita");
}

if(isset($_GET["idgiocatore"])) echo $_GET["idgiocatore"]."<br>"; // echo per debug personale

// Controllo se il giocatore è gia presente nel database, o se è il suo primo login in assoluto
$check = $mysqli->query('SELECT * FROM bonus WHERE idgiocatore = "'.$_GET["idgiocatore"].'"');
// Se è il suo primo login
if($check->num_rows == 0) {
	echo "Primo login del giocatore!<br>";
	// Inserisco il suo id e la data/ora corrente nel database
	$now = new DateTime();
	$update = $mysqli->query('INSERT INTO bonus (idgiocatore,ultimoaccesso) VALUES ("'.$_GET["idgiocatore"].'","'.date_format($now, 'd-m-Y H:i:s').'")'); // provato a togliere now();
	// Se non ci sono errori restituisco "true" per l'assegnazione del bonus
	if ($update) {
		echo "true";
	// Altrimenti restituisco l'errore
	} else { die("ERRORE");}
} else {
	// Altrimenti se il giocatore è già presente nel database
	
	
	$now = new DateTime();
	$resetTime = new DateTime();
	date_time_set($resetTime, 12, 00, 00);
	$a = $mysqli->query('SELECT ultimoaccesso FROM bonus WHERE idgiocatore = "'.$_GET["idgiocatore"].'"');
	$lastLogin = new DateTime((string)$a);
	echo "LastLogin: " . date_format($lastLogin, 'd-m-Y H:i:s') . "<br>";
	echo "Reset time: " . date_format($resetTime, 'd-m-Y H:i:s') . "<br>";
	echo "time: " . date_format($now, 'H') . "<br>";
	
	if ($resetTime < $now) {
		echo "ok1<br>";
		if ($resetTime < $lastLogin) {
			echo "ok2";
		}
	}
	

	
	$update = $mysqli->query('UPDATE bonus SET ultimoaccesso=NOW() WHERE idgiocatore="'.$_GET["idgiocatore"].'"');
	if ($update) {
		 echo "Aggiornato";
	 } else { die("ERRORE");}
}

$mysqli->close(); 
?>
Attualmente non riesco a comparare le date perchè una delle due date non è una stringa, e non so come poterla convertire. Ovviamente non sono certo che quello che sto utilizzando sia il metodo più semplice/veloce per ottenere il risultato che voglio.

Sapete darmi una mano o qualche indicazione?

1 Risposte

  • Re: Comparazione date php/mysql

    Ciao devi innanzitutto effettuare una ricerca per time_zone MySQL e php se entrambe sono impostate a UTC+2 comunichi lo stesso spazio temporale in alternativa é possibile impostare tramite query il fuso orario da scegliere e da php 5.1.2 puoi impostare a livello globale il fuso orario (così puoi calcolare diversi fusi orari se attualmente il giocatore non é nel tuo fuso orario).
    Le date in MySQL sono nel formato americano AAAA-MM-GG (opzionalmente con frazione di sei cifre in millesecondi) e il loro valore può essere trasformato in numero se si fa una operazione aritmetica (si riferisce sempre alla sintassi SQL).

    Quindi per l'ora attuale se il time_zone é su Roma ti basterebbe recuperare il timestamp con la funzione time di php altrimenti dovresti calcolare la differenza da UTC+0 al tuo fuso orario , compresa l'ora legale, l'anno bisestile.

    Dovresti fare in modo di passare l'ID via POST anziché GET e se é numerico che inizia da 0 a infinito (numero intero) devi convertirlo in $var = (int) $_POST['idgiocatore']; ovviamente anche in MySQL il tipo deve essere intero.
    Successivamente controlli se l'ID non sia fake solo allora verifichi se é presente nella tabella bonus supponendo che già dal principio inserisci ultimo accesso (quando il giocatore si registra o comunque inizia il tuo gioco) ti basta verificare con la clausola WHERE DATE_SUB(CURDATE(), INTERVAL 1 DAY) >= `my_column` AND idgiocatore=2 di MySQL inserendo -24 ore con la data corrente (CURDATE e ultimo accesso my_column type DATE in MySQL) se é presente ancora non ha diritto al bonus altrimenti prosegui verificando che quel id sia presente nella tabella bonus quindi update se non presente insert into.
    Se non vuoi farlo tramite sintassi sql puoi calcolare con php il start $star_b = time();
    $end_b = $start_b + (60*60*24);
    un nuovo oggetto Date_Time con il suffisso @ ad esempio "@{$end_b}".
    I numeri nella sintassi SQL o in php non vanno racchiusi da apici.
    Quando dovrai stampare a video la data puoi scegliere DATE_FORMAT di MySQL o oggetto format di DateTime php per convertirli da Americano a Europeo.GG-MM-AAAA
Devi accedere o registrarti per scrivere nel forum
1 risposte