Countdown läuft nicht nach Übergabe von PHP

jdgf

Mitglied
Hallo,

ich habe jetzt mein Script fertiggestellt. Die Zeiten ergänzen sich mit der Atomzeit. Nur der Countdown zählt nicht mehr runter, sondern läßt sich wie bei PHP lediglich mit F5-Taste aktualisieren. Meine Ausgangsüberlegung war, dass das Javascript unter Berücksichtigung der Zeitkorrektur weiterzählt.

PHP:
<?php
//Atomzeit abrufen
function query_time_server ($timeserver, $socket) {
$fp = fsockopen($timeserver,$socket,$err,$errstr,5);
if ($fp) {
fputs($fp,"\n");
$timevalue = fread($fp,49);
fclose($fp);
} else {
$timevalue = " ";
}
$ret = array();
$ret[] = $timevalue;
$ret[] = $err;
$ret[] = $errstr;
return($ret);
}
$array = query_time_server('ts2.univie.ac.at', 13); // Uni Wien
sscanf($array[0], "%s %s %d %d:%d:%d %d", $t_tag, $t_monat, $tag, $stunde, $minute, $sekunde, $jahr);
$timeservertime = strtotime($array[0]);
echo "<br><br>";
//Atomzeit aktuell
echo "Tag:  " .$tag. "<br>";
echo "Stunde:  ".$stunde."<br>";
echo "Minute:  " .$minute. "<br>";
echo "Sekunde:  " .$sekunde. "<br>";
echo "Jahr:  " .$jahr. "<br>";
echo "<br><br>";

//Differenzzeit
echo "Zeitdifferenz in Sekunden: ".(time() - $timeservertime);
$differenz = time() - $timeservertime;
?> 


<script language="Javascript">
<!--
//Countdown-Script
var CountdownJahr = 2007;
var CountdownMonat = 12;
var CountdownTag = 31;
var CountdownStunde = 24;
var CountdownMinute = 0;
var CountdownSekunde = 0;

function CountdownAnzeigen()
{

   // var Jetzt = new Date();
   //Zeit nach Atomzeit einstellen
   <?
echo("var Jetzt=new Date(".date("Y,m,d,H,i,s",(time()-$differenz)).");");
?> 
    var Countdown = new Date(CountdownJahr, CountdownMonat-1, CountdownTag, CountdownStunde, CountdownMinute, CountdownSekunde);
	
	
    var MillisekundenBisCountdown = Countdown.getTime()-Jetzt.getTime();
    var Rest = Math.floor(MillisekundenBisCountdown/1000);
    var CountdownText = "";

    if(Rest >= 31536000)
    {
        var Jahre = Math.floor(Rest/31536000);
        Rest = Rest-Jahre*31536000;

        if(Jahre > 1 || Jahre == 0)
        {
            CountdownText += Jahre + " Jahre ";
        }
        else if(Jahre == 1)
        {
            CountdownText += Jahre + " Jahr ";
        }
    }
    if(Rest >= 86400)
    {
        var Tage = Math.floor(Rest/86400);
        Rest = Rest-Tage*86400;

        if(Tage > 1 || Tage == 0)
        {
            CountdownText += Tage + " Tage ";
        }
        else if(Tage == 1)
        {
            CountdownText += Tage + " Tag ";
        }
    }
    if(Rest >= 3600)
    {
        var Stunden = Math.floor(Rest/3600);
        Rest = Rest-Stunden*3600;

        if(Stunden > 1 || Stunden == 0)
        {
            CountdownText += Stunden + " Stunden ";
        }
        else if(Stunden == 1)
        {
            CountdownText += Stunden + " Stunde ";
        }
    }
    if(Rest >= 60)
    {
        var Minuten = Math.floor(Rest/60);
        Rest = Rest-Minuten*60;

        if(Minuten > 1 || Minuten == 0)
        {
            CountdownText += Minuten + " Minuten ";
        }
        else if(Minuten == 1)
        {
            CountdownText += Minuten + " Minute ";
        }
    }

    if(Rest > 1 || Rest == 0)
    {
        CountdownText += Rest + " Sekunden ";
    }
    else if(Rest==1)
    {
        CountdownText += Rest + " Sekunde ";
    }

    document.getElementById('Countdown').innerHTML = CountdownText;
    window.setTimeout("CountdownAnzeigen()", 1000);
}
//-->
</script>

Das Countdownscript habe ich von webmaster-resource.

Danke und Gruß,
Dietmar
 
Das Problem ist, dass durch den rekursiven Aufruf immer wieder die Ausgangswerte verwendet werden. Notiere mal die Jetzt-Variable als globale Variable außerhalb der Funktion.
 
Sooo...
Ich hab jetzt mal den Anfang gemacht...
Den Rest darfste selber machen! :)
Also der Counter läuft soweit!
Die aktuelle Zeit wird nicht hochgezählt und die Differenz ist auch nicht korrekt!
Zuviel möchte ich dir auch nicht machen! :)

Alles was ich verändert habe ist fett und kursiv...

Code:
<?php
echo "<body onload='CountdownAnzeigen();'>"; //Dass die Funktion auch ausgeführt wird 
//Atomzeit abrufen 
function query_time_server ($timeserver, $socket) { 
$fp = fsockopen($timeserver,$socket,$err,$errstr,5); 
if ($fp) { 
fputs($fp,"\n"); 
$timevalue = fread($fp,49); 
fclose($fp); 
} else { 
$timevalue = " "; 
} 
$ret = array(); 
$ret[] = $timevalue; 
$ret[] = $err; 
$ret[] = $errstr; 
return($ret); 
} 
$array = query_time_server('ts2.univie.ac.at', 13); // Uni Wien 
sscanf($array[0], "%s %s %d %d:%d:%d %d", $t_tag, $t_monat, $tag, $stunde, $minute, $sekunde, $jahr); 
$timeservertime = strtotime($array[0]); 
echo "<br><br>"; 
//Atomzeit aktuell
echo "Tag:  " .$tag. "<br>"; 
echo "Stunde:  ".$stunde."<br>"; 
echo "Minute:  " .$minute. "<br>"; 
echo "Sekunde:  " .$sekunde. "<br>"; 
echo "Jahr:  " .$jahr. "<br>"; 
echo "<br><br>"; 
echo "<div id='Countdown'>";
echo "</div>";//Irgendwo muss es ja auch reingeschrieben werden!
echo "<br><br>"; 
//Differenzzeit 
$differenz = time() - $timeservertime; 
echo "Zeitdifferenz in Sekunden: $differenz";
echo "</body>";
?>  


<script language="Javascript"> 
<!-- 
//Countdown-Script 
var CountdownJahr = 2007; 
var CountdownMonat = 12; 
var CountdownTag = 31; 
var CountdownStunde = 24; 
var CountdownMinute = 0; 
var CountdownSekunde = 0; 

   <?php 
    echo("var Aktuell=new Date(".date("Y,m,d,H,i,s",(time()-$differenz)).");"); 
    ?>//Hier wie oben Gumbo schon beschrieben hat

function CountdownAnzeigen() 
{ 

   // var Jetzt = new Date(); 
   //Zeit nach Atomzeit einstellen 
    
    
    Jetzt=new Date(Jetzt.getTime()+1000); //Aktuelle Zeit muss hochgezählt werden und darf nicht gleich bleiben

    
    var Countdown = new Date(CountdownJahr, CountdownMonat, CountdownTag, CountdownStunde, CountdownMinute, CountdownSekunde); 
     
     
    var MillisekundenBisCountdown = Countdown.getTime()-Jetzt.getTime(); 
    var Rest = Math.floor(MillisekundenBisCountdown/1000); 
    var CountdownText = ""; 

    if(Rest >= 31536000) 
    { 
        var Jahre = Math.floor(Rest/31536000); 
        Rest = Rest-Jahre*31536000; 

        if(Jahre > 1 || Jahre == 0) 
        { 
            CountdownText += Jahre + " Jahre "; 
        } 
        else if(Jahre == 1) 
        { 
            CountdownText += Jahre + " Jahr "; 
        } 
    } 
    if(Rest >= 86400) 
    { 
        var Tage = Math.floor(Rest/86400); 
        Rest = Rest-Tage*86400; 

        if(Tage > 1 || Tage == 0) 
        { 
            CountdownText += Tage + " Tage "; 
        } 
        else if(Tage == 1) 
        { 
            CountdownText += Tage + " Tag "; 
        } 
    } 
    if(Rest >= 3600) 
    { 
        var Stunden = Math.floor(Rest/3600); 
        Rest = Rest-Stunden*3600; 

        if(Stunden > 1 || Stunden == 0) 
        { 
            CountdownText += Stunden + " Stunden "; 
        } 
        else if(Stunden == 1) 
        { 
            CountdownText += Stunden + " Stunde "; 
        } 
    } 
    if(Rest >= 60) 
    { 
        var Minuten = Math.floor(Rest/60); 
        Rest = Rest-Minuten*60; 

        if(Minuten > 1 || Minuten == 0) 
        { 
            CountdownText += Minuten + " Minuten "; 
        } 
        else if(Minuten == 1) 
        { 
            CountdownText += Minuten + " Minute "; 
        } 
    } 

    if(Rest > 1 || Rest == 0) 
    { 
        CountdownText += Rest + " Sekunden "; 
    } 
    else if(Rest==1) 
    { 
        CountdownText += Rest + " Sekunde "; 
    } 

    document.getElementById('Countdown').innerHTML = CountdownText; 
    window.setTimeout("CountdownAnzeigen()", 1000); 
} 
//--> 
</script>

Du musst natürlich deine Aktuelle Zeit in JS auch hochzählen lassen, ansonsten ist klar, dass die Werte immer gleich bleiben, da sich PHP nur einmal die Zeit holt!
Desweiteren muss deine funktion mit <body onload="funktionsname"> auch mal aufgerufen werden! Warum beim monat, bei der counterzeit Erfassung, -1 steht... k.A.
Und wenn du ein document.getElementById['ID_NAME'].... machst, brauchst du auch ein Objekt mit diesen ID_NAMEN - In diesem Fall wäre, wie ich es gemacht habe ein div-container am besten! siehe <div id='countdown'></div>

Für den Rest, darfst du dir erstmal selbst den Kopf einwenig zerbrechen! :)

Gruß!
 
Zuletzt bearbeitet:
Hallo Gumbo und Hansi,

vielen Dank für die Hilfe. Mit euren Hinweisen und etwas googlen war es leicht, die Lösung zu finden. Der div-Bereich war schon vorhanden; aufgrund des CMS befindet er sich im Contentbereich. Das Script läuft jetzt einwandfrei, zu sehen unter meiner Webseite rechte Spalte rechts oben.

Das einzige was mir nicht klar ist, warum es mit einer globalen Variable und nicht mit der lokalen V. funktioniert. Der Unterschied ist doch im wesentlich, dass die lokale V. auf die Funktion beschränkt ist. Der Zählvorgang müßte doch in beiden Varianten gleich sein?

Gruß, Dietmar
 
Die lokale Variable wird jedoch bei jedem Aufruf der Funktion mit demselben Wert initialisiert. Daher gab es keine Veränderung.
 

Neue Beiträge

Zurück