Counter-Funktioniert leider nicht
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
adresse
benutzer
besucher
counter
date
eintrag
gast
guest
insert
limit
listen
mitglied
order
result
set
uhrzeit
update
versuch
vortag
zeitwert
-
Huhu,
Ich habe mir die tage mal versucht selbst einer Counter zu basteln, allerdings gibt es wohl in dem Script kleinere Fehler da er immer Heute 1 und Vortag 1 ausgibt sowie bei jedem aufruf die Einträge löscht. Bitte um Hilfe und danke im Voraus.
Code:
<?php //Zeitwerte //UhrZeit und Datum als Int-Wert $timestamp=time(); //Datum Heute als 01.01.2001 $today_date=time(\'d.m.Y\'); //Datum Gestern als 01.01.2001 $yesterday_date=time(\'d.m.Y\', -(24 * 60 * 60)); //ZeitWerte mit Minus Einer und Zwei Minuten fürn Online Stats $one_min_minus=time()-(60 * 60); $two_min_minus=time()-(120 * 60); $exact_date=time(\'H:i d.m.Y\'); $exact_date_one_min_minus=time(\'H:i d.m.Y\', $one_min_minus); $exact_date_two_min_minus=time(\'H:i d.m.Y\', $$two_min_minus); //CounterFunktionen //Löschung alle Einträge älter als 2Tage mysql_query(\"DELETE FROM `counter` WHERE `date` != \'$yesterday_date\' AND `date` != \'$today_date\'\") OR die(mysql_error()); //Ip Adresse des Benutzer in eine Variable gespeichert $user_ip=$_SERVER[\'REMOTE_ADDR\']; //Überprüfung ob User schon auf der Liste steht,wenn ja wann eingetragen und die Id des eintrags $ip_exist=false; $result=mysql_query(\"SELECT * FROM `counter` WHERE `ip`=\'$user_ip\'\"); if(mysql_num_rows($result)!=\"0\"){ $ip_exist=true; } if($ip_exist){ $result = mysql_query(\"SELECT * FROM `counter` WHERE `ip` = \'$user_ip\' ORDER BY `id` desc LIMIT 1\"); while ($array = mysql_fetch_array($result)) { $db_ip_date=time(\"d.m.Y\", $array[\'date\']); $db_entry_id=$array[\'id\']; } } //Wenn User nicht auf Liste steht eintragen,wenn doch ob Heute dann Update,wenn Gestern Neuer Eintrag if($ip_exist && $db_ip_date==$today_date){ mysql_query(\"UPDATE `counter` SET `date` = \'$timestamp\' WHERE `id` = \'$db_entry_id\' LIMIT 1;\"); } else{ $query=\"INSERT INTO `counter` (`id`, `ip`, `date`) VALUES (\'\', \'$user_ip\', \'$timestamp\')\"; mysql_query($query); } //Zählungen ;-) //Besucher Gestern gespeichert in $yesterday $sql_yesterday = \"SELECT id FROM `counter` WHERE `date`=\'$yesterday_date\'\"; $count_yesterday = mysql_query($sql_yesterday); $yesterday = mysql_num_rows($count_yesterday); //Besucher Heute gespeichert in $today $sql_today = \"SELECT id FROM `counter` WHERE `date`=\'$today_date\'\"; $count_today = mysql_query($sql_today); $today = mysql_num_rows($count_today); //Besucher Online gespeichert in $online $online=\"0\"; $result = mysql_query(\"SELECT * FROM `counter`\"); while ($array = mysql_fetch_array($result)){ $db_online_date=time(\"H:i d.m.Y\", $array[\'date\']); if($db_online_date==$exact_date OR $db_online_date==$exact_date_one_min_minus OR $db_online_date==$exact_date_two_min_minus){ $online++; } } //Mitglieder Online gespeichert in $member_online $member_online=\"0\"; $result = mysql_query(\"SELECT * FROM `user`\"); while ($array = mysql_fetch_array($result)){ $db_online_date=time(\"H:i d.m.Y\", $array[\'logintime\']); if($db_online_date==$exact_date OR $db_online_date==$exact_date_one_min_minus OR $db_online_date==$exact_date_two_min_minus){ $member_online++; } } //Gäste gespeichert in $guests $guests=$online-$member_online; ?>
Beitrag geändert: 23.9.2007 20:18:01 von ghostrider -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo,
ich nehme mal an, dass diese Abfrage fehl schlägt...
if(mysql_num_rows($result)!=\"0\"){ // mysql_num_rows gibt ein Integer zurück und kein String $ip_exist=true; }
weil mysql_num_rows() ein Integer zurück gibt und kein String.
Dadurch ist deine Prüfung immer wahr und er versucht ein Update auf ein nicht existierenden DS.
Grüßle -
das kann ich mir leider nicht vorstellen da ich genau diese Abfrage auch schon in frühren Scripten verwendet habe und es nie zu fehlern kam. Bin leider aber langsam echt am verzweifeln weil fast alles geht bis auf dieser duslige Counter hehe... selbst das Forum da kann es doch net an sonem Zähler hapern *schon wieder aufreg*
sry aber wäre euch für hilfe sehr verbunden.
mfG
Chris -
Es ist mir neu, dass man time() mit Parametern aufrufen kann, ich denke eher, dass du date() benutzen willst. Vll ist das schon der Fehler?
-
Stimmt ist mir auch gerade aufgefallen... Ich habe es mal fix geändert. Um jetz nicht über den alten Code noch zu reden poste ich nochmal fix den neuen, denn leider funktioniert es immer noch net ganz. und danke schonma für diese Meldung
Code:
<?php //Zeitwerte //UhrZeit und Datum als Int-Wert $timestamp=time(); //Datum Heute als 01.01.2001 $today_date=date('d.m.Y'); //Datum Gestern als 01.01.2001 $yesterday_term=time()-(24 * 60 * 60); $yesterday_date=date('d.m.Y', $yesterday_term); //ZeitWerte mit Minus Einer und Zwei Minuten fürn Online Stats $one_min_minus=time()-(1 * 60); $two_min_minus=time()-(2 * 60); $exact_date=date('H:i d.m.Y'); $exact_date_one_min_minus=date('H:i d.m.Y', $one_min_minus); $exact_date_two_min_minus=date('H:i d.m.Y', $two_min_minus); //CounterFunktionen //Löschung alle Einträge älter als 2Tage mysql_query("DELETE FROM `counter` WHERE `date` != '$yesterday_date' AND `date` != '$today_date'") OR die(mysql_error()); //Ip Adresse des Benutzer in eine Variable gespeichert $user_ip=$_SERVER['REMOTE_ADDR']; //Überprüfung ob User schon auf der Liste steht,wenn ja wann eingetragen und die Id des eintrags $ip_exist=false; $result=mysql_query("SELECT * FROM `counter` WHERE `ip`='$user_ip'"); if(mysql_num_rows($result)!="0"){ $ip_exist=true; } if($ip_exist){ $result = mysql_query("SELECT * FROM `counter` WHERE `ip` = '$user_ip' ORDER BY `id` desc LIMIT 1"); while ($array = mysql_fetch_array($result)) { $db_ip_date=date("d.m.Y", $array['date']); $db_entry_id=$array['id']; } } //Wenn User nicht auf Liste steht eintragen,wenn doch ob Heute dann Update,wenn Gestern Neuer Eintrag if($ip_exist && $db_ip_date==$today_date){ mysql_query("UPDATE `counter` SET `date` = '$timestamp' WHERE `id` = '$db_entry_id' LIMIT 1;"); } else{ $query="INSERT INTO `counter` (`id`, `ip`, `date`) VALUES ('', '$user_ip', '$timestamp')"; mysql_query($query); } //Zählungen ;-) //Besucher Gestern gespeichert in $yesterday $sql_yesterday = "SELECT id FROM `counter` WHERE `date`='$yesterday_date'"; $count_yesterday = mysql_query($sql_yesterday); $yesterday = mysql_num_rows($count_yesterday); //Besucher Heute gespeichert in $today $sql_today = "SELECT id FROM `counter` WHERE `date`='$today_date'"; $count_today = mysql_query($sql_today); $today = mysql_num_rows($count_today); //Besucher Online gespeichert in $online $online="0"; $result = mysql_query("SELECT * FROM `counter`"); while ($array = mysql_fetch_array($result)){ $db_online_date=date("H:i d.m.Y", $array['date']); if($db_online_date==$exact_date OR $db_online_date==$exact_date_one_min_minus OR $db_online_date==$exact_date_two_min_minus){ $online++; } } //Mitglieder Online gespeichert in $member_online $member_online="0"; $result = mysql_query("SELECT * FROM `user`"); while ($array = mysql_fetch_array($result)){ $db_online_date=date("H:i d.m.Y", $array['logintime']); if($db_online_date==$exact_date OR $db_online_date==$exact_date_one_min_minus OR $db_online_date==$exact_date_two_min_minus){ $member_online++; } } //Gäste gespeichert in $guests $guests=$online-$member_online; ?>
Resultat:
Online: 1
⇒Mitglieder: 0
⇒Gäste: 1
Heute: 0
Vortag: 0
Angem. Benutzer: 0
dauerhaft stehen dort die gleichen werte also funktioniert zumindestens die Vortag und Heute funktion nicht. Es sind tatsächlich keine Benutzer angemeldet also darüber nicht wundern :P
mfG
Chris -
Du trägst in die Datenbank einen Timestamp ein, vergleichst beim Auslesen von User-heute und User-gestern den Timestamp aber mit einem Datum im Format d.m.Y, da kann er natürlich keine Übereinstimmung finden (Zeile 46 und 50 hier im Forum).
Und was soll das hier bringen?
<? if($ip_exist){ $result = mysql_query("SELECT * FROM `counter` WHERE `ip` = '$user_ip' ORDER BY `id` desc LIMIT 1"); while ($array = mysql_fetch_array($result)) { $db_ip_date=date("d.m.Y", $array['date']); $db_entry_id=$array['id']; } } ?>
Ich vermute du willst den letzten Eintrag mit dieser IP auslesen. Wofür dann die Schleife, wenn du LIMIT eh 1 gesetzt hast? In dem Block darüber hast du die Abfrage ja außerdem schon, dann kannst du von dort auch gleich das Ergebnis nehmen. Das schont die Datenbank. -
Ich stimme tct zu.
Vergleiche die beiden unveränterden Timestamps, mit denen kannst du auch ganz normal rechnen und vergleichen.
Das Datum kompliziert die Sache nur.
Beitrag geändert: 7.10.2007 23:03:03 von funcartoons -
warum verwendest du niicht einfach google analytics und machst dir da nicht so viel stress...
-
Weil ich hatte bisher auch nen fertigen Counter und wollte diesmal selber was versuchen nur sieht man ja leider wozu das führt..... naja das ist ein anderes Thema.... leider habe ich im Bereich timestamp() nicht soviel erfahrung wie müsste ich die dann mit einander vergleichen?
-
Da du ja die Tage aus der Datenbank auslesen willst (heute und gestern), kannst du auch einfach dein Query ein bissel verändern, indem du den Timestamp in der Datenbank direkt von MySQL noch in dein Datumsformat umrechnen lässt.
Ich hab keine Ahnung, ob das funktioniert, aber ich würde es so versuchen:
<? $sql_yesterday = "SELECT id FROM `counter` WHERE FROM_UNIXTIME(`date`,'%d.%m.%Y')='$yesterday_date'"; ?>
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage