Visualizzazione risultati 1 fino 11 di 11

Discussione: Capire quando differenza tra date è uguale a 0

  1. #1
    Guest

    Predefinito Capire quando differenza tra date è uguale a 0

    Salve a tutti, ho il seguente script, dove calcolo con una query sql la differenza di tempo tra una data finale ed una iniziale, nel seguente modo:

    Codice PHP:
    $sql = "SELECT TIMEDIFF (fine, now()) FROM missioni WHERE id_giocatore = '$id_giocatore'";
    $risultato = mysql_query($sql);
    $row = mysql_fetch_row ($risultato);
    Ora, come faccio a fare in modo che quando la diffrenza fra date equivale a 00:00:00, la funzione non esegue più la differenza espunti un messaggio con scritto ad esempio: "La missione è finita!" ?

    Grazie in anticipo,

    Marco

  2. #2
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Forse ti conviene usare la funzione UNIX_TIMESTAMP al posto di TIMEDIFF, con questa sintassi:
    Codice:
    UNIX_TIMESTAMP (fine) - UNIX_TIMESTAMP ()
    In questo modo, la query ti restituirà un numero, che puoi facilmente confrontare in PHP dichiarando la missione finita quando il risultato è maggiore o uguale (attenzione!) a zero.

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  3. #3
    Guest

    Predefinito

    Il problema è che la differenza la devo anche stampare di secondo in secondo attraverso ajax, per questo devo usare per forza TIMEDIFF, poi devo fare in modo che quando la differenza è 00:00:00 invece che continuare a fare la differenza, facendo:

    -00:00:01;
    -00:00:02;
    -00:00:03;

    ecc...

    La funzioni si ferma, senza eseguire più la differenza e spunta un messaggio.

  4. #4
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Allora puoi provare così: sul file PHP che richiami via AJAX stampi il solo risultato della query, e null'altro. Quando intercetterai il testo via JavaScript (responseText), controlla se inizia con il simbolo "-" (il risultato sarà negativo se la prima data è anteriore alla seconda, o sbaglio?): in questo caso, puoi nuovamente richiamare lo script.

    Stammi bene...
    Ultima modifica di dementialsite : 25-12-2009 alle ore 20.26.36
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  5. #5
    Guest

    Predefinito

    Ora posto il codice, così magari sapete dirmi dove sbaglio...

    1) Questa è la funzione che calcola la differenza tra la fine della missione e il tempo corrente, in modo da dirti quanto manca alla fine.

    Codice PHP:
    function tempo_missione($id_giocatore)
    {

    $sql = "SELECT TIMEDIFF (fine, now()) FROM missioni WHERE id_giocatore = '$id_giocatore'";
    $risultato = mysql_query($sql);
    $row = mysql_fetch_row ($risultato);


    return
    $row[0];

    }

    2) Questo script invece calcola i secondi totali che rimangono prima che la missione sia finita, in pratica trasforma in secondi la differenza calcolata con la funzione tempo_missione.

    Codice PHP:
    $sec = explode (":", tempo_missione($_SESSION['id']));
    $secondi = ($sec[0] * 3600) + ($sec[1] * 60) + $sec[2];
    3) Ora mediante uno script ajax provo ad aggiornare il contatore con la differenza, facendo in mondo che quando arrivi a 0 spunti una img, ed il titolo della pagina cambi.

    Codice HTML:
    <script type="text/javascript">
    	//<![CDATA[
    	var countertimer = null;
    	var Targetcounter = document.getElementById( 'counter' );
    	var Secondscounter = <?php echo"$secondi"; ?>;
    
    	var TargetTimecounter = new Date();
    	var TimeBeginncounter = TargetTimecounter.getTime();
    	var TimeEndcounter = TimeBeginncounter + ( Secondscounter * 1000 );
    	TargetTimecounter.setTime( TimeEndcounter );
    
    	var Daycounter = TargetTimecounter.getDate();
    	var Monthcounter = TargetTimecounter.getMonth() + 1;
    	var Yearcounter = TargetTimecounter.getYear();
    	if(Yearcounter < 999) Yearcounter += 1900;
    	var hcounter = TargetTimecounter.getHours();
    	var mcounter = TargetTimecounter.getMinutes();
    	var scounter = TargetTimecounter.getSeconds();
    
    	var fdaycounter  = ( (Daycounter < 10) ? '0' : '' );
    	var fmonthcounter  = ( (Monthcounter < 10) ? '.0' : '.' );
    	var fhcounter  = ( (hcounter < 10) ? '0' : '' );
    	var fmcounter  = ( (mcounter < 10) ? ':0' : ':' );
    	var fscounter  = ( (scounter < 10) ? ':0' : ':' );
    
    	var EndDatecounter = fdaycounter + Daycounter + fmonthcounter + Monthcounter  + '.' + Yearcounter;
    	var EndTimecounter = fhcounter + hcounter + fmcounter + mcounter + fscounter + scounter;
    	var finished = false;
    
    
    	function CountDowncounter()
    	{
    		var CurrentDatecounter = new Date();
    		var CurrentTimecounter = CurrentDatecounter.getTime()
    		var OpenTimecounter = Math.floor( (TargetTimecounter - CurrentTimecounter) / 1000 );
    
    		var scounter = OpenTimecounter % 60;
    		var mcounter = ( (OpenTimecounter - scounter) / 60 ) % 60;
    		var hcounter = ( (OpenTimecounter - scounter - mcounter * 60) / (60 * 60) );
    		var fhcounter  = ( (hcounter < 10) ? '0' : '' );
    		var fmcounter  = ( (mcounter < 10) ? ':0' : ':' );
    		var fscounter  = ( (scounter < 10) ? ':0' : ':' );
    
    		var Timecounter = fhcounter + hcounter + fmcounter + mcounter + fscounter + scounter;
    		var OutputStringcounter = Timecounter;
    
    		if( OpenTimecounter <= 0 ) {
    			if( !finished ) {
    				var finishedcounter = document.createElement('div');
    				finishedcounter.id = 'finishedcounter';
    				finishedcounter.className = 'center';
    				finishedcounter.innerHTML = '<a href="finito.php"><img src="img/immagine.jpg" alt="" /><' + '/a>';
    				Targetcounter.parentNode.insertBefore(finishedcounter, Targetcounter);
    				finished = true;
    			}
    			window.clearTimeout( countertimer );
    		}
    
    		Targetcounter.innerHTML = ( !finished ) ? OutputStringcounter : '';
    		document.title = ( !finished ) ? OutputStringcounter : 'Finito!';
    		document.title += " - NomeGioco";
    		countertimer = window.setTimeout( "CountDowncounter()", 1000 );
    	}
    	//]]>
    	</script>
    
    Da notare è che attraverso questa riga: var Secondscounter = <?php echo"$secondi"; ?>; passo allo script i secondi totali rimanenti al termine della missione.

    Il problema è che questo script non mi stampa il countdown scrivendo questa riga:

    Codice HTML:
    <div align="center" id="counter"><script type="text/javascript">CountDowncounter();</script></div>
    Sapete dirmi come mai ?

    Grazie in anticipo,
    Marco

    P.S.: Se osservo il sorgente della pagina, la var Secondscounter contiene i secondi effettivi al termine della missione, almeno quello funziona :P

  6. #6
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    È nel punto 3 che hai tutta una serie di errori, in primis il fatto che... in realtà non stai usando AJAX. Stai semplicemente generando dinamicamente uno script attraverso PHP, che però una volta scaricato non interagisce più con il server (o, almeno, nel tuo codice non vedo i tipici costrutti AJAX).

    Bisognerebbe riprogettarlo, ma servirebbe sapere in che modo intendi gestire il cronometro:
    - chiedendo periodicamente l'aggiornamento del timer solo al server
    - chiedendo al server solo l'impostazione iniziale del timer, per poi modificarlo dinamicamente solo dal browser

    Nel primo caso avrai un timer più "accurato" (perché la base temporale è la stessa e, soprattutto, non modificabile dai tuoi utenti), ma sovraccaricherai di richieste il server: valuta questa opzione con cautela.

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  7. #7
    Guest

    Predefinito

    Non ho capito bene cosa intendi, potresti mostrarmi un esempio di script, di come risolveresti questo problema, sapendo che nel datbase ho memorizzato soltato l'id del giocatore, l'inizio della missione e la fine ?

  8. #8
    Guest

    Predefinito

    Praticamente ti sta dicendo che nell'applicazione che ci hai mostrato precedentemente non c'è nessuna traccia di utilizzo di AJAX. Per AJAX (Asynchronous Javascript And XML) si intende una tecnologia grazie alla quale si può effettuare una richiesta al server senza dover, necessariamente, ricaricare tutta la pagina. Nel tuo caso invece passi il valore di una variabile PHP a Javascript, non è assolutamente AJAX. Un esempio di come avresti potuto fare usando AJAX? Ad ogni secondo che passa Javascript richiama uno script PHP che recupera i dati dal database e restituisce il numero di secondi rimanenti per la fine della missione, quindi li visualizza.

  9. #9
    Guest

    Predefinito

    No io intendo dire anche come risolvere l'errore di quello script oppure se va cambiato completamente...

  10. #10
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Citazione Originalmente inviato da webgame Visualizza messaggio
    Non ho capito bene cosa intendi, potresti mostrarmi un esempio di script, di come risolveresti questo problema, sapendo che nel datbase ho memorizzato soltato l'id del giocatore, l'inizio della missione e la fine ?
    Se non hai mai scritto in AJAX, ti ricordo che devi avere:
    - un file PHP (o altro linguaggio server) di cui tu possa conoscere in qualche modo l'output
    - un file JavaScript (o del codice incluso nella tua pagina HTML) che lo intercetta.
    - un segnaposto (cioè un elemento con ID) HTML, dove depositerai l'output del codice JavaScript opportunamente elaborato

    Il tuo file PHP dovrebbe contenere questo codice (oltre alle operazioni necessarie per connettersi al database):
    Codice PHP:
    $query = "SELECT UNIX_TIMESTAMP (fine) - UNIX_TIMESTAMP () FROM missioni WHERE id_giocatore = '$id_giocatore'";
    $result = mysql_query ($query);
    $row = mysql_fetch_array ($result);

    echo
    $result[0];
    Questo file ti calcolerà il numero di secondi rimanenti al termine della missione.

    Nel codice JavaScript dovrai inserire due funzioni, una per inizializzare il contatore, l'altra per aggiornarlo:
    Codice:
    var time = 0;
    
    function start_counter ()
    {
       var req = new XMLHttpRequest ();
       req.onreadystatechange = function () {
          var txt = req.responseText;
          if (txt.indexOf ('-') >= 0)
             document.getElementById('cronometro').innerHTML = 'Tempo scaduto!';
          else
          {
             time = (int) txt;
             document.getElementById('cronometro').innerHTML = time;
             setTimeout (update_counter, 1000);
          }
       }
       req.open ('timer.php', 'GET', true);
       req.send (null);
    }
    
    function update_counter ()
    {
       if (--time < 0)
          document.getElementById('cronometro').innerHTML = 'Tempo scaduto!';
       else
       {
          document.getElementById('cronometro').innerHTML = time;
          setTimeout (update_counter, 1000);
       }
    }
    Infine, nel codice HTML che utilizza il JavaScript di cui sopra dovrai:
    - inserire un elemento che abbia id="cronometro" (e che verrà aggiornato dallo script, nel tuo codice può anche essere vuoto)
    - invocare, al caricamento della pagina, la funzione start_counter().

    Nel codice qui sopra ho supposto che tu abbia deciso di scaricare il timer dal server solamente quando carichi la pagina, aggiornando poi il contatore con il solo JavaScript. Se invece vuoi aggiornare il cronometro con il timer del server, devi, alla fine della funzione start_counter, mandare in timeout nuovamente la funzione start_counter (e non update_counter).

    Stammi bene...
    Ultima modifica di dementialsite : 26-12-2009 alle ore 21.56.48
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  11. #11
    Guest

    Predefinito

    Grazie mille, sempre molto disponibile, però questa volta sono riuscito a risolvere da solo utilizzando lo script postato in precedenza, solo che avevo messo il div che richiamava la funzione js nella posizione sbagliata, e per questo non me la richiamava, ora funziona tutto perfettamente.

    Grazie mille lo stesso, ora so che se ho una domanda da proporre posso farlo qui, dove troverò gente preparata :)

Regole di scrittura

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