Ariste: slebst geschriebener Counter

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

  1. 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:)
    1. 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

      1. 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:)
        1. 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

          1. 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

            1. 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

              1. 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

                1. 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
                  1. super tausend dank

                    1. 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

                      1. 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
              2. 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
                1. 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

    2. 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

  2. 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

    1. 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

  3. 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";

    1. 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

      1. 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";

        1. Hallo,

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

          Gruß
          Ariste

          1. 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";

  4. 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

    [link:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html@title=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

    [link:http://dev.mysql.com/doc/refman/5.0/en/truncate.html@title=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

    1. 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

      1. 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

        1. 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

          1. 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

  5. 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