Forum Doku Wiki Blog

Forumsarchiv 2009, Februar
slebst geschriebener Counter

archivierte Beiträge lesen

  1. (PHP) slebst geschriebener Counter von Ariste, 26. 02. 2009, 16:03

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 16:03 Uhr von Ariste veröffentlicht.

Hallo,

ich bin mir gerade dabei einen eigenen PHP Counter zumachen. Es scheint nur, dass der Counter nie mehr als ein zählt bzw. wird nur mein IP Adresse in die MySQL Datenbank eingetragen.

Woran liegt es? Hier mein PHP Code:

<?php
mysql_connect('localhost','....','....') or die("Verbindung fehlgeschlagen.");
mysql_select_db('.....') or die("Datenbank nicht vorhanden.");

$jahr = date("d.m.Y");
$uhr = date("H:i:s");

$sql_check1 = "SELECT * FROM `zaehler` WHERE `IP` = '".$_SERVER['REMOTE_ADDR']."'";
$erg_check1 = mysql_query($sql_check1);
$row = mysql_num_rows($erg_check1);
if($row == "0")
{
mysql_query("INSERT INTO `zaehler` SET `IP` = '".$_SERVER['REMOTE_ADDR']."', `ZEIT` = '$jahr - $uhr'");
}
else
{
mysql_query("UPDATE `zaehler` SET `ZEIT` = '$jahr - $uhr' WHERE `IP` = '".$_SERVER['REMOTE_ADDR']."'");
}

$sql_jetzt = "SELECT * FROM `zaehler`";
$erg_jetzt = mysql_query($sql_jetzt);
$jetzt = mysql_num_rows($erg_jetzt);
echo "<b>".$jetzt."</b>";
?>


Vielen Dank.
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 16:23 Uhr von Felix Riesterer veröffentlicht.

Lieber Ariste,

1.) Warum MySQL? Reicht nicht eine simple Textdatei?
2.) Warum so kompliziert? Du willst doch "Datum + Uhrzeit", sowie die IP?

zu 2. Für den "Zeitpunkt" genügt ein Timestamp - damit kannst Du dann mittels der date-Funktion wieder Tagesdatum und Stunde/Minute ermitteln.

Mein Vorschlag: Benutze eine Textdatei, in die Du pro Zeile (als Zeilenende schreibst Du "\r\n") Deine Daten durch Kommata getrennt notierst. Das könnte so aussehen (erste Zeile steht fest!):

Datei "counter.csv":
IP,Timestamp
127.0.0.1,1234598520
192.168.0.1,1236985205

Das Auslesen geht dann ziemlich leicht (das csv-Format wird auch von "Excel" verstanden). Aber dazu kommen wir beim nächsten Mal.

Liebe Grüße,

Felix Riesterer.
--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 16:37 Uhr von Ariste veröffentlicht.

Lieber Felix,

erstmal danke für Deine Antwort. Aber das ich es mit MySQL mache, hat einfach den Grund, dass ich die Tabelle jeden Tag um 22 Uhr leeren will.

Das mache ich mit Cron-Jobs. Ich wußte erstmal nicht, dass mein Anbieter für mich sowas anbietet.

Aber zurück zu mein PHP Code; ich habe leider den Fehler nicht entdeckt, es wäre für mich viel einfacher alles in MySQL zu haben.

Ich hatte auch zuerst überlegt eine Datei zu erstellen, anstelle von MySQL. Aber ich habe mich für MySQL entschieden....

Vielen Dank
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 16:41 Uhr von Felix Riesterer veröffentlicht.

Lieber Ariste,

> Aber das ich es mit MySQL mache, hat einfach den Grund, dass ich die Tabelle jeden Tag um 22 Uhr leeren will.

??? Was hindert Dich daran, um 22.00 Uhr die CSV-Datei durch eine neue zu ersetzen? Und warum um 22.00 Uhr? Traditionell werden solche Dinge zwischen 2.00 und 4.00 Uhr nachts erledigt...

> ich habe leider den Fehler nicht entdeckt,

Ich auch nicht. Wie äußert sich denn der Fehler? Was liefert Dir MySQL und was machst Du damit?

> es wäre für mich viel einfacher alles in MySQL zu haben.

Das ist ein Glaubenssatz, keine Tatsache. Nur weil Du Dir das einbildest, stimmt es noch lange nicht!

> Ich hatte auch zuerst überlegt eine Datei zu erstellen, anstelle von MySQL. Aber ich habe mich für MySQL entschieden....

Diese Entscheidung ist für die gewählte Aufgabe nicht wirklich gut getroffen. MySQL ist für diese Aufgabe extremst überdimensioniert!

Liebe Grüße,

Felix Riesterer.
--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 16:52 Uhr von Ariste veröffentlicht.

Lieber Riesterer,

naja, mir ist MySQL bequemlicher und ich mag es auch nicht so gerne, wenn viele Sachen, die ich nur sehen will, als Dateien so auf dem Webserver rumliegen. Da ist eine MySQL Datenbank in der hinsicht etwas angehnehmer.

So nun zu mein Problem :-)
Mein Code ist der gleiche geblieben wie in mein erstes Posting. Mir ist halt aufgefallen, dass nur die IP Adresse von dem ersten "gezählt" wird, der die Seite aufruft.

Ich bin hier in Berlin und habe in Köln einen Rechner stehen. Über TightVNC habe ich auf den Rechner zugegriffen und die gleiche Seite aufgerufen. Und da ist mir halt aufgefallen, dass der Counter nur die erste IP Adresse "zählt". Nichtmal in die Tabelle wird die zweite IP Adresse eingetragen.

Daher, muss ich echt blöd was übersehen in mein Code.

LG
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 17:46 Uhr von Ariste veröffentlicht.

Hallo,

mir ist jetzt auch noch aufgefallen, dass immer die gleiche IP Adresse in der Datenbank steht. Egal von wo ich aus "Deutschland" die Seite aufrufe. Bezieht sich $_SERVER['REMOTE_ADDR'] darauf beim wem der Webserver ist bzw. die Datei rumliegt?

Gruß
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 17:52 Uhr von Ariste veröffentlicht.

Hallo,

ich habe jetzt mal alles so reduziert, so dass "jede Seite" gezählt wird:

<?php
mysql_connect('localhost','d00a30e2','nV6CswQfSvtAqcYP') or die("Verbindung fehlgeschlagen.");
mysql_select_db('d00a30e2') or die("Datenbank nicht vorhanden.");

$jahr = date("d.m.Y");
$uhr = date("H:i:s");

$sql_check1 = "INSERT INTO `zaehler` SET `IP` = '".$_SERVER['REMOTE_ADDR']."', `ZEIT` = '$jahr - $uhr'";
$erg_check1 = mysql_query($sql_check1);

$sql_jetzt = "SELECT * FROM `zaehler`";
$erg_jetzt = mysql_query($sql_jetzt);
$jetzt = mysql_num_rows($erg_jetzt);
echo "<b>".$jetzt."</b>";
?>


Mein Problem ist immernoch das immer die gleiche IP Adresse jedesmal angezeigt wird. Egal wo ich in Deutschland bin.

Wie verhindere ich eine Doppelzählung? Daher hatte ich vorhin die geschichte mit dem UPDATE

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 17:54 Uhr von Ariste veröffentlicht.

SHIT, jetzt habe ich ausversehen vergessen Datenbanknamen und Passwort rauszunehmen. kann man jetzt auswendig machen bei wem ich kunde bin und kann man jetzt an meine datenbank hacken?

gruß
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 18:00 Uhr von Shadowcrow veröffentlicht.

hi $name,

> SHIT, jetzt habe ich ausversehen vergessen Datenbanknamen und Passwort rauszunehmen. kann man jetzt auswendig machen bei wem ich kunde bin und kann man jetzt an meine datenbank hacken?

bei wem du kunde bist? wohl kaum, solange man deine webadresse nicht kennt, aber ich würde das kennwort schleunigst ändern (wenn möglich auch den DB namen).
gruss
shadow
--
Vor dem Parser und auf hoher See sind wir allein in Gottes Hand

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 18:11 Uhr von Ariste veröffentlicht.

super tausend dank

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 22:12 Uhr von Ariste veröffentlicht.

Hallo,

ich habe gerade stundenlang mit dem Support von meinen "Webserver" telefoniert.

Das Problem ist, dass mein Counter funktioniert, aber:

Wie man dort sehen kann steht auch dort: '".$_SERVER['REMOTE_ADDR']."' aber das Problem ist, dass ich immer die SERVER_ADDR erhalte nie die REMOTE_ADDR.

Ich will ja nicht böse gegenüber dem Herrn von den Support sein, aber er hat mir wirklich nicht geholfen.

Ich hoffe ich bekomme hier bessere hilfe.

Vielen Dank
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 27. 02. 2009, 11:48 Uhr von Christoph Jeschke veröffentlicht.

Guten Tag,

> Wie man dort sehen kann steht auch dort: '".$_SERVER['REMOTE_ADDR']."' aber das
> Problem ist, dass ich immer die SERVER_ADDR erhalte nie die REMOTE_ADDR.

Kann es sein, dass es einen Proxy auf dem Server gibt, der jeden Aufruf weiterleitet? Bei welchem Provider bist du denn? Wird Werbung des Providers auf der Seite eingeblendet?

Gruß
Christoph Jeschke
--
Zend Certified Engineer
Certified Urchin Admin

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 17:58 Uhr von Shadowcrow veröffentlicht.

hi $name,

> Wie verhindere ich eine Doppelzählung? Daher hatte ich vorhin die geschichte mit dem UPDATE

prüfe einfach ob die IP schon in der datenbank ist, falls ja - kein eintrag.
du musst nur entscheiden für wie lange eine IP "gesperrt" ist - also evtl. mit dem datum abgleichen, oder solange sperren bis die DB geleert wird.
gruss
shadow
--
Vor dem Parser und auf hoher See sind wir allein in Gottes Hand

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 18:19 Uhr von Ariste veröffentlicht.

Hallo shaddow,

die Datenbank wird über ein Cron-Job geleert. Das ist kein Problem. Aber wie kriege ich es mit der Prüfung hin?

ich hatte ja eine if anfrage hat aber so nicht geklappt gehabt. muss ich mysql_fetch_object(bbbb) oder mysql_fetch_assoc(bbbb) benutzen?

Ich habe ja das Problem noch, das immer die gleiche IP Adresse steht, egal wo man in Deutschland oder auf der Welt die Seite aufruft?

Liegt es an $_SERVER['REMOTE_ADDR'] ????

Gruß
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 18:31 Uhr von Vinzenz Mai veröffentlicht.

Hallo Felix,

> 1.) Warum MySQL? Reicht nicht eine simple Textdatei?

ich möchte sowas *nie* mit einer simplen (?) Textdatei umsetzen, weil mir das Locking und das Dateihandling viel zu kompliziert ist. Ich griffe, so ich einen Counter benötigte, *immer* zur supereinfachen(!) datenbankbasierten Lösung,

Einfacher als eine scheinbar simple Textdatei ist die Datenbanklösung immer.


Freundliche Grüße

Vinzenz

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 17:03 Uhr von Bademeister veröffentlicht.

Hi Ariste,

> Es scheint nur, dass der Counter nie mehr als ein zählt bzw. wird nur mein IP Adresse in die MySQL Datenbank eingetragen.

Ich versteh diesen "Satz" ehrlich gesagt nicht, also weiss ich auch nicht, ob das folgende wirklich Dein Problem loest. Aber davon ausgehend, dass der Spaltentyp von ZEIT ein geeigneter ist, ist das Format Deiner Zeitangaben problematisch, und zwar sowohl wegen

> $jahr = date("d.m.Y");

als auch wegen

'$jahr - $uhr'

Generelle Sache: Du solltest immer pruefen, ob Datanbankabfragen auch wie gewuenscht funktionieren. Und zwar in erster Instanz, indem Du den Rueckgabewert auswertest, und erst in zweiter, indem Du in einem Forum nachfragst. Was sagt denn mysql_error() zu den Datenbankabfragen?


viele Gruesse,
der Bademeister

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 17:42 Uhr von Ariste veröffentlicht.

Hallo Bademeister,

dieser Satz ist wie folgt gemeint:

> »» Es scheint nur, dass der Counter nie mehr als ein zählt bzw. wird nur mein IP Adresse in die MySQL Datenbank eingetragen.

Mir ist aufgefallen, das in der Datenbank nur die IP Adresse von denjenigen eingetragen wird, der als erster die Seite aufruft. Alle anderen danach, die die Seite aufrufen werden nicht "gezählt" bzw. die IP Adressen werden nicht eingetragen.

Das mit der Zeit ist echt kein Problem. Das funktioniert super. Da mäckert MySQL auch nicht.

Ich hatte schonmal mysql_error() eingefügt, aber hat kein Fehler angezeigt.

Gruß
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 17:24 Uhr von dedlfix veröffentlicht.

echo $begrüßung;

> ich bin mir gerade dabei einen eigenen PHP Counter zumachen. Es scheint nur, dass der Counter nie mehr als ein zählt bzw. wird nur mein IP Adresse in die MySQL Datenbank eingetragen.

Was möchtest du tun, wenn die $_SERVER['REMOTE_ADDR'] ein zweites Mal erscheint und was macht ein UPDATE?


echo "$verabschiedung $name";

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 17:38 Uhr von Ariste veröffentlicht.

Hallo dedlfix,

eigentlich, wollte ich mit der Update geschichte verhindern, das die IP Adresse zweimal in der Datenbank steht und doppelt gezählt wird. Ansetelle davon soll nur die Zeit geändert werden.

Gruß
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 18:45 Uhr von dedlfix veröffentlicht.

echo $begrüßung;

> eigentlich, wollte ich mit der Update geschichte verhindern, das die IP Adresse zweimal in der Datenbank steht und doppelt gezählt wird. Ansetelle davon soll nur die Zeit geändert werden.

Aha. Und wie soll bei einem Zeit-Ändern etwas hochzählen?


echo "$verabschiedung $name";

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 18:56 Uhr von Ariste veröffentlicht.

Hallo,

na er zählt mir dann noch die zeilen in der Datenbank. Damit habe ich meine Besucherzehl....

Gruß
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 19:43 Uhr von dedlfix veröffentlicht.

echo $begrüßung;

> na er zählt mir dann noch die zeilen in der Datenbank. Damit habe ich meine Besucherzehl....

Das müsstest du dazusagen, dass du nur die Anzahl der unterschiedlichen Besucher haben möchtest. Im Allgemeinen zählt man die Anzahl der Zugriffe, wovon ich auch ausging.


echo "$verabschiedung $name";

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 19:41 Uhr von Vinzenz Mai veröffentlicht.

Hallo Ariste,

> ich bin mir gerade dabei einen eigenen PHP Counter zumachen. Es scheint nur, dass der Counter nie mehr als ein zählt bzw. wird nur mein IP Adresse in die MySQL Datenbank eingetragen.

wenn ich Dich richtig verstehe, ist Deine Logik wie folgt:

a) Du speicherst
   - IP-Adressen und
   - einen zugehörigen Zeitpunkt

b) Jede IP-Adresse darf nur einmal in der Tabelle vorkommen.
   Dazu wird der Zeitpunkt des letzten Zugriffes gespeichert.

c) Die Anzahl der Tabelleneinträge ist der Counterwert

d) Deine Tabelle wird täglich zu einem bestimmten Zeitpunkt geleert.

Habe ich das richtig verstanden?

Zu a)
  Für IP-Adressen bietet sich eine VARCHAR-Spalte an (CHAR ginge auch).
  Für den Zeitpunkt ist es sinnvoll, sich beim Sortiment von MySQL zu bedienen:
  Du benötigst automatische Aktualisierung, nimm daher TIMESTAMP.
  Verzichte auf Dein selbst gewähltes Format!

Zu b)
  Wenn Du eine Spalte mit einem eindeutigen Index versiehst, so verhindert
  das Datenbankmanagementsystem, dass Werte doppelt eingetragen werden können.
  Versieh' also die IP-Spalte mit einem solchen Index, hier bietet sich sogar
  ein PRIMARY KEY an.

  Versuche einfach ein INSERT, schlägt dieses wegen Indexverletzung fehl, so
  aktualisiere den Datensatz. Ist eine vernünftige Strategie, dafür gibt es

      INSERT ... ON DUPLICATE KEY UPDATE

Zu c)
  Um die Datensätze zu zählen, bietet sich die Funktion COUNT() an:

      SELECT COUNT(*) Anzahl FROM zaehler

Dies ergibt *immer* genau einen Datensatz mit einer Spalte, die den Namen Anzahl trägt, in der die Anzahl der Datensätze steht, die Zahl, an der Du interessiert bist. Es ist keine gute Idee, PHP alle Datensätze abholen zu lassen, nur um ihre Anzahl zu ermitteln.

Zu d)
  Wenn Du *nicht* die InnoDB-Engine verwendest - bei Shared Hosting hat man
  fast immer nur die MyISAM-Engine zur Verfügung - böte sich

    TRUNCATE zaehler

  dafür an.

Nochmals zur Zusammenfassung: Vereinfache Deinen PHP-Code aufgrund meiner Ausführungen:


1. Baue Verbindung zur DB auf.
2. Führe das INSERT ... ON DUPLICATE KEY UPDATE aus.
3. Führe SELECT COUNT(*) aus.
4. Gib das Ergebnis von Schritt 3 aus.

Allgemein:
Kümmere Dich noch um die Fehlerbehandlung (Datenbanken stehen nicht immer zur Verfügung, SQL-Abfragen können auch fehlschlagen) und die Behandlung von Eingabedaten im SQL-Kontext.


Freundliche Grüße

Vinzenz

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 20:17 Uhr von Ariste veröffentlicht.

Hallo Vinzenz Mai,

ja, du hast mich richtig verstanden. Ich danke Dir sehr herzlich für Deine Mühe. Tausend Dank.

Ich habe da noch ein Problem. Ich hatte schon seit längerem sowas wie

<?PHP echo"$_SERVER['REMOTE_ADDR']"; ?>

auf meiner Webseite stehen, nicht versteckt oder so. Jeder konnte seine IP Adresse sehen.

Komischerweise seit zwei tagen steht da immer eine feste IP Adresse, undzwar genau die, wo ich meine Seite habe. Ich hatte vorhin mit dem Support telefoniert und habe der Frau am Telefonein mein Problem geschildert. Sie meinte, es kann nicht sein, da die nichts verändert haben.

Der Fehler kann auch nicht bei mir sein bzw. im Skript, weil wie gesagt, vor zwei tagen funktionierte es ja noch?

Haben die vielleicht doch was bei mir umgestellt und halten mich für blöd?

Vielen Dank
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 22:32 Uhr von Vinzenz Mai veröffentlicht.

Hallo,

> ja, du hast mich richtig verstanden. Ich danke Dir sehr herzlich für Deine Mühe. Tausend Dank.

bitte. Ich helfe gerne. Setze meine Anregungen auch um.

> Ich habe da noch ein Problem. Ich hatte schon seit längerem sowas wie
>
> <?PHP echo"$_SERVER['REMOTE_ADDR']"; ?>
> Komischerweise seit zwei tagen steht da immer eine feste IP Adresse, undzwar genau die, wo ich meine Seite habe.

Schau Dir die Ausgabe von phpinfo() an. Schau im Abschnitt

    Apache Environment

nach, ob Du dort Deine (öffentliche) IP-Adresse entdecken kannst.


Freundliche Grüße

Vinzenz

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 22:48 Uhr von Ariste veröffentlicht.

Hallo und Guten Abend Vinzenz,

das habe ich schon gemacht. Undzwar steht bei REMOTE_ADDR meine richtige IP Adresse, die ich auch eigentlich angezeigt haben will. Aber die IP-Adresse, die ich angezeigt bekomme ist die SERVER_ADDR obwohl ich in mein PHP CODE <?PHP echo"$_SERVER['REMOTE_ADDR']"; ?> stehen hab.

Komisch oder?? Ich habe auch mit dem Support telefoniert, die haben mir auch gesagt, dass seit den letzten 15 Tagen nichts upgedatet wurde und der Server auch die letzten 15 Tage un unterbrochen läuft.

Liebe Grüße
Ariste

slebst geschriebener Counter

Der folgende Beitrag wurde am 27. 02. 2009, 01:15 Uhr von Vinzenz Mai veröffentlicht.

Hallo,

> das habe ich schon gemacht. Undzwar steht bei REMOTE_ADDR meine richtige IP Adresse, die ich auch eigentlich angezeigt haben will.

ich habe es noch nie erlebt, dass mir phpinfo() bei einer Umgebungsvariablen etwas anderes angezeigt hat als

> Aber die IP-Adresse, die ich angezeigt bekomme ist die SERVER_ADDR obwohl ich in mein PHP CODE <?PHP echo"$_SERVER['REMOTE_ADDR']"; ?> stehen hab.

der Zugriff auf den korrespondierenden Eintrag im Array $_SERVER.
Was zeigt Dir folgender Code:

<?php print_r($_SERVER); ?php>

(am besten in <pre> eingepackt)?


Freundliche Grüße

Vinzenz

slebst geschriebener Counter

Der folgende Beitrag wurde am 26. 02. 2009, 22:27 Uhr von Der Dicki veröffentlicht.

Hallihallo!

Das Folgende ist nur ein Schuss ins Blaue:

Hast Du vielleicht ein Problem dieser Art, oder lässgt es sich mit den auf der verlinkten Seite erklärten Schritten beheben?

Viele liebe Grüße,
Der Dicki

PS: die Seite habe ich gefunden per Googlesuche

© 1998-2013 SELFHTMLImpressumSoftware: Classic Forum 3.4