Fehler in Script. Ich finde ihn nicht.

TimN

Erfahrenes Mitglied
Hallo,

ich habe einen Counter programmiert, bis jetzt hat auch alles immer funktioniert, doch Seit die Seite online ist, und viele Besucher drauf sind gibt es das Problem, dass der Wert von "gestern" immer auf 0 gesetzt wird.
Woran liegt das? Kann das vielleicht auch ein einer fehlerhaten mysql_abfrage liegen? Aber auf meinem PC hat noch alles funktioniert.

Hier das Script:
PHP:
<?php
if(!defined('IN_THE_PAGE'))
 header('index.php?sid='.$sid);
// Wert von "gestern" updaten und "heute" zurücksetzten
$heute_nacht = mktime(0, 0, 0, date("m"), date("d"), date("Y"));
$sql = mysql_query("SELECT * FROM counter_log WHERE time > '$heute_nacht' LIMIT 1") or die(mysql_error());
if(!$eintrag = mysql_fetch_object($sql))
{
 mysql_query("UPDATE counter SET gestern = heute LIMIT 1");
 mysql_query("UPDATE counter SET heute = 0 LIMIT 1");
}
// Alte einträge löschen
$sixhoursago = time() - 60*60*6;
mysql_query("DELETE FROM counter_log WHERE time <= '$sixhoursago'");

//reloadsperre
$sql = mysql_query("SELECT * FROM counter_log WHERE ip='".$_SERVER['REMOTE_ADDR']."'") or die(mysql_error());
if(!$t = mysql_fetch_object($sql))
{
 $c = mysql_fetch_object(mysql_query("SELECT heute, gesamt FROM counter LIMIT 1"));
 $c->heute++;
 $c->gesamt++;
 mysql_query("UPDATE counter SET heute = '$c->heute', gesamt = '$c->gesamt'");
 mysql_query("INSERT INTO counter_log(time, ip)
   VALUES('".time()."', '".$_SERVER['REMOTE_ADDR']."')");
}
$sql = mysql_query("SELECT id FROM users");
$num_users = mysql_num_rows($sql);
$counter = mysql_fetch_object(mysql_query("SELECT * FROM counter LIMIT 1"));
$template->assign_vars(array( 'COUNTER_TODAY'  => $counter->heute,
    'COUNTER_YESTERDAY' => $counter->gestern,
    'COUNTER_ALL'  => $counter->gesamt,
    'COUNTER_USERS'  => $num_users));
?>
 
Mmmh...könntest du mal den Aufbau von counter_log posten, der erschliesst sich mir nicht so recht.

Eine mögliche Ursache könnte folgendes sein(ein ähnliches Thema hatten wir gerade erst)
PHP:
if(!$eintrag = mysql_fetch_object($sql))
{
 mysql_query("UPDATE counter SET gestern = heute LIMIT 1");
 mysql_query("UPDATE counter SET heute = 0 LIMIT 1");
}
Angenommen 2 Leute sind zur selben Zeit online, der erste ruft das Skript auf, alles wird ordnungsgemäss ausgeführt.
Der 2. ruft das Skript ebenfalls auf, und zwischen dem SELECT und dem UPDATE von User#1 erfolgt das UPDATE bei User#2, dann hättest du den Salat->
Das SELECT bei User#2 vermeldet, dass er der erste am Tag ist...ist er aber nicht.
USER#1 hat in der Zwischenzeit die Tabelle geupdatet, bei heute steht 0
Jetzt kommt User#2 und schiebt heute nach gestern.... ergo: gestern==0

Zugegeben, ein recht unwahrscheinliches Scenario...aber gut möglich :-)
 
Das könnte ich mal überprüfen...

Counter-Log sieht so aus:
Code:
CREATE TABLE `counter_log` (
  `time` int(11) NOT NULL default '0',
  `ip` varchar(15) NOT NULL default ''
) TYPE=MyISAM;
 
Zurück