Counter Problem

Dimenson

Erfahrenes Mitglied
Hi Leude bin grad dabei mein eigenen Counter zu bauen, allerdings klappt er nicht:

PHP:
<?php
$timestamp=time();
$tag=date("d",$timestamp);
$monat=date("m",$timestamp);
$jahr=date("y",$timestamp);

$heute=date("d.m.y",$timestamp);

$timestamp_g=$timestamp-86400;

$tagg=date("d",$timestamp_g);
$monatt=date("m",$timestamp_g);
$jahrr=date("y",$timestamp_g);

$gestern=$tagg.".".$monatt.".".$jahrr;

$zeitzudel=$timestamp-216000;

$stats_heute=0;
$stats_gestern=0;

$my_ip= $_SERVER['REMOTE_ADDR'];


$statistik=$DB->mysql_fetch_array($DB->mysql_query("SELECT * FROM stats WHERE ip='".$my_ip."'")); 

if ($statistik['zeit']!=$heute) {
$statistik2=$DB->mysql_fetch_array($DB->mysql_query("SELECT * FROM stats_g WHERE id='1'")); 
$gr=$statistik2['besucher']+1;
$DB->mysql_query("UPDATE stats_g SET besucher='".$gr."' WHERE id='1'");
$DB->mysql_query("INSERT INTO stats (ip,zeit,datum) VALUES ('".$my_ip."','".$heute."','".$timestamp."')");
}

  $getstatistik=$DB->mysql_query("SELECT * FROM stats");
  while($statistik2=$DB->mysql_fetch_array($getstatistik)) {
		if ($statistik2['datum']<=$zeitzudel) $DB->mysql_query("DELETE FROM stats WHERE id='".$stats['id']."'");
		if ($statistik2['zeit']==$heute) $stats_heute++;	
		if ($statistik2['zeit']==$gestern) $stats_gestern++;	
  }

$stats_gesamt=$DB->mysql_fetch_array($DB->mysql_query("SELECT * FROM stats_g WHERE id='1'")); 
$stats_gesamt=$stats_gesamt['besucher'];

?>
er zählt jeden Klick wo ich mache, allerdings sollte er es aber nicht.

HIer könnt ihr nachschauen : http://dimenson.info
 
Zuletzt bearbeitet:
Sieben Datenbankabfrage um nur ein Ereignis zu speichern? Wirklich sehr ineffiziernt.
Darf ich dir etwas Besseres vorschlagen:
Code:
id          INT UNSIGNED
datetime    DATETIME
ip-addr     VARCHAR(15)
session-id  CHAR(32)
PHP:
<?php

	session_start();

	$query = '
		SELECT
		        1
		  FROM
		        …
		  WHERE
		        `ip-addr`    = "'.$_SERVER['REMOTE_ADDR'].'"
		    AND `session-id` = "'.session_id().'"
		';
	$result = mysql_real_escape_string($query)
		or die(mysql_error().'<pre>'.htmlspecialchars($query).'</pre>');
	if( mysql_num_rows($query) > 0 ) {
		$query = '
			UPDATE
			        …
			  SET
			        `datetime` >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
			  WHERE
			        `ip-addr`    = "'.$_SERVER['REMOTE_ADDR'].'"
			    AND `session-id` = "'.session_id().'"
			';
		mysql_query($query)
			or die(mysql_error().'<pre>'.htmlspecialchars($query).'</pre>');
	} else {
		$query = '
			INSERT INTO
			        …
			  SET
			        `datetime`   = NOW(),
			        `ip-addr`    = "'.$_SERVER['REMOTE_ADDR'].'",
			        `session-id` = "'.session_id().'"
			';
		mysql_query($query)
			or die(mysql_error().'<pre>'.htmlspecialchars($query).'</pre>');
	}

	// Beispielabfrage: Anzahl der heutigen Einträge
	$query = '
		SELECT
		        COUNT(*) AS `anzahl`
		  FROM
		        …
		  WHERE
		        TO_DAYS(`datetime`) = TO_DAYS(NOW())
		';

?>
 
Ich hab noch einen Fehler gefunden und ihn behoben. Meinen vorherigen Beitrag habe ich entsprechend angepasst.
 
TO_DAYS(NOW()) und das NOW() ist vergeichsweise mit time() ? Möchte nämlich auch die gestrigen Besucher anzeigen.
 
Hi,

ich habe es jetzt soweit geschafft mein Script sieht so aus:

PHP:
<?php
session_start();

$timestamp=time();
$timestamp_g=$timestamp-86400;

$gestern=date("Y",$timestamp_g)."-".date("m",$timestamp_g)."-".date("d",$timestamp_g);

if (!$DB->mysql_fetch_array($DB->mysql_query("SELECT * FROM stats_n WHERE ip='".$_SERVER['REMOTE_ADDR']."' AND `session-id`='".session_id()."' AND TO_DAYS(`datetime`) = TO_DAYS(NOW())"))) { 
$DB->mysql_query('INSERT INTO stats_n SET `datetime`   = NOW(),`ip`= "'.$_SERVER['REMOTE_ADDR'].'",`session-id` = "'.session_id().'"');
$statistik2=$DB->mysql_fetch_array($DB->mysql_query("SELECT * FROM stats_g WHERE id='1'")); 
$gr=$statistik2['besucher']+1;
$DB->mysql_query("UPDATE stats_g SET besucher='".$gr."' WHERE id='1'");
}

$getstatsheute=$DB->mysql_query("SELECT * FROM stats_n WHERE TO_DAYS(`datetime`) = TO_DAYS(NOW())");
  while($statsheute=$DB->mysql_fetch_array($getstatsheute)) {
  $stats_heute++;
  }

$getstatsgestern=$DB->mysql_query("SELECT * FROM stats_n WHERE TO_DAYS(`datetime`)='".$gestern."'");
  while($statsgestern=$DB->mysql_fetch_array($getstatsgestern)) {
  $stats_gestern++;
  }

if (empty($stats_heute)) $stats_heute=0;
if (empty($stats_gestern)) $stats_gestern=0;

$stats_gesamt=$DB->mysql_fetch_array($DB->mysql_query("SELECT * FROM stats_g WHERE id='1'")); 
$stats_gesamt=$stats_gesamt['besucher'];

?>

Das Problem ist $stats_gestern bleibt immer 0, warum?
Meine Abfrage müsste doch eigentlich stimmen !
 
Ich habs hinbekommen :

PHP:
<?php
session_start();

$timestamp=time();
$timestamp_g=$timestamp-86400;
$zeittodel=$timestamp_g-43200;

$gestern=date("Y",$timestamp_g)."-".date("m",$timestamp_g)."-".date("d",$timestamp_g);
$zeitzudel=date("Y",$zeittodel)."-".date("m",$zeittodel)."-".date("d",$zeittodel);

if (!$DB->mysql_fetch_array($DB->mysql_query("SELECT * FROM stats_n WHERE ip='".$_SERVER['REMOTE_ADDR']."' AND `session-id`='".session_id()."' AND TO_DAYS(`datetime`) = TO_DAYS(NOW())"))) { 
$DB->mysql_query('INSERT INTO stats_n SET `datetime`   = NOW(),`ip`= "'.$_SERVER['REMOTE_ADDR'].'",`session-id` = "'.session_id().'"');
$statistik2=$DB->mysql_fetch_array($DB->mysql_query("SELECT * FROM stats_g WHERE id='1'")); 
$gr=$statistik2['besucher']+1;
$DB->mysql_query("UPDATE stats_g SET besucher='".$gr."' WHERE id='1'");
}

$getstatsheute=$DB->mysql_query("SELECT * FROM stats_n WHERE TO_DAYS(`datetime`) = TO_DAYS(NOW())");
  while($statsheute=$DB->mysql_fetch_array($getstatsheute)) {
  $stats_heute++;
  }

$getstatsgestern=$DB->mysql_query("SELECT * FROM stats_n WHERE TO_DAYS(`datetime`)=TO_DAYS('".$gestern."')");
  while($statsgestern=$DB->mysql_fetch_array($getstatsgestern)) {
  $stats_gestern++;
  }

$getstatsdel=$DB->mysql_query("DELETE FROM stats_n WHERE NOT TO_DAYS(`datetime`)=TO_DAYS('".$gestern."') AND NOT TO_DAYS(`datetime`)=TO_DAYS(NOW())");


if (empty($stats_heute)) $stats_heute=0;
if (empty($stats_gestern)) $stats_gestern=0;

$stats_gesamt=$DB->mysql_fetch_array($DB->mysql_query("SELECT * FROM stats_g WHERE id='1'")); 
$stats_gesamt=$stats_gesamt['besucher'];

?>

Danke @ Gumbo
 
Ich habe auch ein Problem mit meinem Counter, will deswegen aber nicht unbedingt einen neuen Thread aufmachen:
Also, habe es so programmiert, dass IPs für eine Stunde gesperrt werden und erst dann wieder gezählt. Allerdings passiert es immer wieder, dass kurz aufeinanderfolgend fast identische IPs in der Sperre stehen also zB. 193.168.0.1, 193.168.0.2, .14, .3 usw.. Ist ja relativ ersichtlich, dass die vom gleichen Host stammen und er wie auch immer ständig die IP wechselt. Gibt es eine Möglichkeit, dies in die Sperre mit einzubeziehen? Finde es nämlich nicht schön, wenn die Statisktik dadurch so extrem gefälscht.
 
Du könntest auf die letzten Stellen eine Wildcard setzen, allerdings würdest du damit einige andere Nutzer aussperren.
Alternative wäre, dass du einfach mal schaust, woher die IPs denn kommen, z. B. bei ripe.net.
Dabei ist natürlich zu sagen, dass die meisten ISPs eine bestimmte IP Range haben, deren Anfang fix ist.
 
Zurück