Daniel: Was ist an dem Counter falsch?

Hi,

ich habe "versucht" einen Counter zu machen ... Aus bisher unerklärlichen Gründen funktioniert er nicht .. d.h. er erhöht den Counter nicht. Ich frage immer die IP ab und wenn sie schon in der Datenbank vorkommt, soll der Counter NICHT erhöht werden, sonst wird die IP eingefügt in die Datenbank.. Ein Fehler ist schonmal, dass eine IP auch doppelt eingetragen wird in die Datenbank wenn ich F5 drücke.. Eigentlich soll sie ja nur eingetragen werden, wenn sie nicht schon vorkommt... Ein zweiter Fehler ist wie gesagt, dass der Counter nicht erhöht wird in der Funktion eins() :-(. Was ist alles an dem Code falsch?

Sie sind Besucher Nummer
<?php
$datei = "counter.dat";
$fp = fopen($datei,"r+");
$var = fgets($fp,10);
if (!$var) { $var = 1; }
echo $var;
fclose($fp);

$ip = $_SERVER['REMOTE_ADDR'];
$verbindung = mysql_connect("localhost","","") or die(mysql_error());

$v = "SELECT * FROM counter WHERE IP = $ip";
$sql = mysql_query($v,$verbindung);

if ($sql <> "") {
            // hier soller nix machen, weil IP vorkommt in der Tab.
} else {

$eintrag = "INSERT INTO counter (IP) VALUES ('$ip')";
$qry = mysql_query($eintrag,$verbindung) or die(mysql_error());
eins(); }

mysql_close($verbindung);

function eins() {

$fd = fopen($datei,"w+");  // w+ wegen überschreiben ist das OK?

rewind($fd);

$p = fgets($fd,10);

$p++;

fwrite($fd,$p);

fclose($fd);

}

?>

Bitte helft mir ;-)

Danke

Daniel

  1. Hallo Daniel,

    $ip = $_SERVER['REMOTE_ADDR'];

    du weißt, dass die Zuordnung User <=> IP nicht eindeutig ist? (mehrere User können die gleiche IP haben)

    $v = "SELECT * FROM counter WHERE IP = $ip";

    ->http://www.dclp-faq.de/q/q-sql-select.html

    $sql = mysql_query($v,$verbindung);
    if ($sql <> "") {

    das wird nicht funktionieren, da der Query in $v idR immer erfolgreich ausgeführt wird, nur eben keinen Datensatz der darauf passt zurückliefert - du musst mit mysql_num_rows() (->http://de3.php.net/mysql_num_rows) prüfen, wieviele Datensätze du bekommst - wenn die Funktion eine Zahl !=0 zurückliefert, ist die IP schon in der Datenbank.

    $fd = fopen($datei,"w+");  // w+ wegen überschreiben ist das OK?

    nein, mit w+ setzt du die Länge der Datei auf 0 Byte, und hast somit keine Zahl mehr.

    rewind($fd);
    $p = fgets($fd,10);

    du solltest die Datei mit r+ öffen, den Wert auslesen, den Zeiger auf den Anfang zurücksetzen und deinen neuen Wert dann schreiben.

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    1. Hi,

      wie meinste das mit: Was ist an dem

      $v = "SELECT * FROM counter WHERE IP = $ip";

      falsch?

      Den Rest habsch so weit verbessert

      Danke

      Daniel

      1. Hallo Daniel,

        wie meinste das mit: Was ist an dem
        $v = "SELECT * FROM counter WHERE IP = $ip";
        falsch?

        bist du dem Link zu dem Text mit der Überschrift "Warum soll ich nicht SELECT * schreiben?" gefolgt? - falsch ist es nicht, aber schlecht.

        Den Rest habsch so weit verbessert

        funktioniert es jetzt?

        Grüße aus Nürnberg
        Tobias

        --
        Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        1. Hi,

          nein es funzt net :-(. Er trägt trotzdem 1000 mal dieselbe IP in die Datenbank ein .. und der Counter wird nicht erhöht... d.h. er schreibt gar nix in die counter.dat. Hier nochmal der Code:

          Sie sind Besucher Nummer
          <?php
          $datei = "counter.dat";
          $fp = fopen($datei,"r+");
          $var = fgets($fp,10);
          if (!$var) { $var = 1; }
          echo $var;
          fclose($fp);

          $ip = $_SERVER['REMOTE_ADDR'];
          $verbindung = mysql_connect("localhost","","") or die(mysql_error());

          $v = "SELECT * FROM counter WHERE IP = $ip";
          $sql = mysql_query($v,$verbindung);

          if (mysql_num_rows($sql) <> "") {

          } else {

          $eintrag = "INSERT INTO counter (IP) VALUES ('$ip')";
          $qry = mysql_query($eintrag,$verbindung) or die(mysql_error());
          eins(); }

          mysql_close($verbindung);

          function eins() {

          $fd = fopen($datei,"r+");

          $p = fgets($fd,10);

          rewind($fd);

          $p++;

          fwrite($fd,$p);

          fclose($fd);

          }

          ?>

          Danke für eure Hilfe

          Daniel

          1. Hallo Daniel,

            if (mysql_num_rows($sql) <> "") {

            das liefert immer true - du musst auf  mysql_num_rows()!=0 prüfen (bzw auf ==0 und gleich nach if(...) dann den INSERT-Teil reinschreiben (den else-Teil dann weglassen))

            function eins() {

            der Code dieser Funktion funktioniert bei mir wunderbar

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            1. Hi,

              so besser?

              Sie sind Besucher Nummer
              <?php
              $datei = "counter.dat";
              $fp = fopen($datei,"r+");
              $var = fgets($fp,10);
              if (!$var) { $var = 1; }
              echo $var;
              fclose($fp);

              $ip = $_SERVER['REMOTE_ADDR'];
              $verbindung = mysql_connect("localhost","","") or die(mysql_error());

              $v = "SELECT * FROM counter WHERE IP = $ip";
              $sql = mysql_query($v,$verbindung);

              if (mysql_num_rows($sql) == 0) {

              $eintrag = "INSERT INTO counter (IP) VALUES ('$ip')";
              $qry = mysql_query($eintrag,$verbindung) or die(mysql_error());
              eins(); }

              mysql_close($verbindung);

              function eins() {

              $fd = fopen($datei,"r+");

              $p = fgets($fd,10);

              rewind($fd);

              $p++;

              fwrite($fd,$p);

              fclose($fd);
              }
              ?>

              Er schreibt trotzdem noch jedesmal die IP in die Datenbank :-(
              Woran liegt das dieses mal

              Danke

              Daniel

          2. Hallo,

            $v = "SELECT * FROM counter WHERE IP = $ip";

            Die IP wird doch als String abgelegt, also auch so abfragen:

            $v = "SELECT * FROM counter WHERE IP = '$ip'";

            if (mysql_num_rows($sql) <> "") {

            Wie schon gesagt, wird hier ein numerischer Wert und kein String geliefert.

            MfG, Thomas

            1. Hi,

              nun wird jede IP nur noch 1 mal in die DB eingetragen :-) wie es auch sein sollte. Jedoch wird nicht in die counter.dat geschrieben.. Wieso das?

              Sie sind Besucher Nummer
              <?php
              $datei = "counter.dat";
              $fp = fopen($datei,"r+");
              $var = fgets($fp,10);
              if (!$var) { $var = 1; }
              echo $var;
              fclose($fp);

              $ip = $_SERVER['REMOTE_ADDR'];
              $verbindung = mysql_connect("localhost","","") or die(mysql_error());

              $v = "SELECT * FROM counter WHERE IP = '$ip'";
              $sql = mysql_query($v,$verbindung);

              if (mysql_num_rows($sql) == 0) {

              $eintrag = "INSERT INTO counter (IP) VALUES ('$ip')";
              $qry = mysql_query($eintrag,$verbindung) or die(mysql_error());
              eins(); }

              mysql_close($verbindung);

              function eins() {

              $fd = fopen($datei,"r+");

              $p = fgets($fd,10);

              rewind($fd);

              $p++;

              fwrite($fd,$p);

              fclose($fd);

              }

              ?>

              Danke

              Daniel

              1. Hallo Daniel,

                nun wird jede IP nur noch 1 mal in die DB eingetragen :-) wie es auch sein sollte. Jedoch wird nicht in die counter.dat geschrieben..

                bekommst du eine Fehlermeldung (bei error_reporting(E_ALL) am Anfang des Scriptes)?

                $datei = "counter.dat";

                hier definierst du den Inhalt der Variablen $datei...

                function eins() {

                hier fängt die Funktion an...

                $fd = fopen($datei,"r+");

                ...und hier willst du auf die Variable $datei zugreifen, die du aber innerhalb der Funktion noch nicht deklariert hast - du must die Variable erst innerhalb der Funktion mit "global $datei;" bekannt machen.

                Grüße aus Nürnberg
                Tobias

                --
                Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
                1. Hi,

                  hmm ich habe nun ein global $datei; eingebaut in die function

                  Hier der Code der function ...

                  function eins() {

                  global $datei;

                  $fd = fopen($datei,"r+");

                  $p = fgets($fd,10);

                  rewind($fd);

                  $p++;

                  fwrite($fd,$p);

                  fclose($fd);
                  }

                  Hmm aber es passiert trotzdem nix...

                  Es müsste ja wenigstens eine 2 erscheinen in der Datei, weil der Inhalt ja erst leer ist und dann eine 1 zugewiesen wird .. Anschließend wird der Wert um 1 erhöht. Daher müsste ja eine 2 in der Datei counter.dat stehen .. Dem ist aber net so :-((.

                  Was mach ich falsch? Ich erhalte jedoch auch keine Fehlermeldung..

                  Danke

                  Daniel

              2. hi,

                nun wird jede IP nur noch 1 mal in die DB eingetragen :-) wie es auch sein sollte. Jedoch wird nicht in die counter.dat geschrieben.. Wieso das?

                sag mal, was hältst du davon, mal selbst ein paar debug-versuche zu unternehmen (kontroll-ausgaben per echo an verschiedenen stellen einbauen, um zu sehen in welche zweige von abfragen gesprungen wird, variablenwerte zur kontrolle ausgeben lassen, etc.), anstatt hier bei jedem neuen fehlerchen erneut nachzufragen ...?

                gruss,
                wahsaga

                1. Hi Wahsaga,

                  das Problem liegt definitiv darin, dass er nicht in die Datei schreibt ... In die Datenbank wird richtig die IP eingetragen, und zwar nur einmal... so wie es sein sollte.

                  Aber wenn ich die counter.dat öffne, dann ist sie immer leer, egal ob schon 3 verschiedene User auf der Seite waren.

                  Vll wisst ihr ja woran es liegen kann, dass es so ist

                  Danke

                  Daniel

                  1. Hallo Daniel,

                    Aber wenn ich die counter.dat öffne, dann ist sie immer leer, egal ob schon 3 verschiedene User auf der Seite waren.

                    schreib mal in die counter.dat eine 0 rein (oder auch ein 1,2,...) damit dein Code was zum hochzählen hat - dann sollte es eigentlich funktionieren.

                    Grüße aus Nürnberg
                    Tobias

                    --
                    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
                    1. Hallo Daniel,

                      Hi Tobias,

                      schreib mal in die counter.dat eine 0 rein (oder auch ein 1,2,...) damit dein Code was zum hochzählen hat - dann sollte es eigentlich funktionieren.

                      Jep, genau das tut es :-). Vielen Dank an alle, die sich in diesem Thread Gedanken um mich gemacht haben. Endlich klappt es :-)

                      Grüße aus Nürnberg
                      Tobias

                      Machs gut

                      Daniel

          3. Moin!

            $v = "SELECT * FROM counter WHERE IP = $ip";
            $sql = mysql_query($v,$verbindung);
            if (mysql_num_rows($sql) <> "") {

            Also: es funktioniert, aber ich würde die variablen anders bennenn. Dir mag es egal sein, aber auch Du musst Dein Projekt mal pflegen:

            $sql wäre die bessere Variable für den SQL- String.
            $result wäre der bessere Vorschlag für das zrückgelieferte Ergebnis.
            mysql_num_rows($result) liefert ein numerisches Ergebnis, Du kannst als direkt nachschauen, ob gleich Null ist.

            Also:

            $sql = "SELECT IP FROM counter WHERE IP = $ip";
            $result = mysql_query($sql,$verbindung) OR die("<hr>Datenbankabfrage hat nicht geklappt:<br>$sql<br>mysql_error()");
            if (mysql_num_rows($result) == 0)
            {
                $sql = "INSERT INTO counter (IP) VALUES ('$ip')";
                $result2 = mysql_query($eintrag,$verbindung) or die(<hr>Datenbankeintrag hat nicht geklappt:<br>$sql<br>mysql_error()");
                eins();
                mysql_free_result($result2);
            }
            mysql_free_result($result); # Immer tapfer den Speicher wieder freigeben...

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix®

            --
            Meinereinerselbst ist auf der Suche nach Aufträgen
            1. Moin!

              $result2 = mysql_query($eintrag,$verbindung) or die(<hr>Datenbankeintrag hat nicht geklappt:<br>$sql<br>mysql_error()");

              eins();

              muss natürlich so heissen:
              $result2 = mysql_query($sql,$verbindung) or die(<hr>Datenbankeintrag hat nicht geklappt:<br>$sql<br>mysql_error()");
                  eins();

              Das sieht man gleich mal, warum es sinnvolle Namen für die Variablen gibt...

              MFFG (Mit freundlich- friedfertigem Grinsen)

              fastix®

              --
              Meinereinerselbst ist auf der Suche nach Aufträgen