mac: If/Else Funktion klappt nicht

Hallo,

ich bastle gerade einen kleinen Klickzähler mit IP-Sperre. Dazu möchte ich in eine txt-Datei schreiben und lesen. In dieser Datei wird der Permalink des Beitrages und die IP-Adresse des Besuchers gespeichert. Jetzt passiert aber immer folgendes, obwohl die Zeichenfolge bei "if" vorhanden ist, wird immer "else" ausgeführt. Wo könnte denn der Wurm drin sein?

MUSTER permalink.txt:
http://link1.de|XXX.XXX.XXX.1
http://link2.de|XXX.XXX.XXX.1
http://link2.de|XXX.XXX.XXX.2

CODE:

$weiter = true;  
$text = $plink; // Permalink des Beitrages  
$ip = $_SERVER["REMOTE_ADDR"]; //IP des Besuchers  
  
// Feststellen, ob Button schon einmal geklickt wurde (IP-Sperre)  
$datei = ($_SERVER['DOCUMENT_ROOT']."counter/db/permalink.txt");  
$userdatei = fopen($datei,"a+");  
while($weiter && !feof($userdatei))  
   {  
   $zeile = fgets($userdatei);  
   $zeile = explode('|', $zeile);  
   if ($text == $zeile[0] && $ip == $zeile[1]) { // passenden Permalink und IP suchen  
   header("Location:" .$url);  
   exit("Gesperrt");  
   } else {  
   $weiter = false; // beendet die Schleife  
   fwrite($userdatei , $text."|".$ip."\n"); // Permalink und IP in Datei ergänzen  
   }  
   }  
fclose($userdatei);

Danke und Gruß
mac

  1. Hello,

    ich bastle gerade einen kleinen Klickzähler mit IP-Sperre. Dazu möchte ich in eine txt-Datei schreiben und lesen. In dieser Datei wird der Permalink des Beitrages und die IP-Adresse des Besuchers gespeichert. Jetzt passiert aber immer folgendes, obwohl die Zeichenfolge bei "if" vorhanden ist, wird immer "else" ausgeführt. Wo könnte denn der Wurm drin sein?

    Warum benutzt Du kein serialisiertes Array dafür? Da könntest Du den Link auch als Index benutzen und darauf dann direkt zugreifen.

    $zeile = fgets($userdatei);
       $zeile = explode('|', $zeile);

    Der Fehler liegt hier oben versteckt. Der lässt sich aber nur schwer finden.
    Allerdings sollte Dir die Anzahl der Zeichen zu denken geben, wenn Du dir die Elemente von $zeile mal mit var_dump() anzeigen lassen würdest.

    http://de.php.net/manual/en/function.var-dump.php

    if ($text == $zeile[0] && $ip == $zeile[1]) { // passenden Permalink und IP suchen

    folglich kann der Vergleich (zweiter Teil) auch nicht wahr werden...

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Mir fällt da noch was auf.

      Falls das if nicht zutrifft, d.h. die Zeile passt nicht, sollte ja eigentlich weitergesucht werden.
      Wenn der else-Zweig ausgeführt wird, wird $weiter auf false gesetzt und somit die Schleife beendet.
      Das heißt, weitere Zeilen außer der ersten werden gar nicht durchsucht.
      Da stimmt noch was mit der Logik nicht.

      1. Hello,

        Mir fällt da noch was auf.

        Falls das if nicht zutrifft, d.h. die Zeile passt nicht, sollte ja eigentlich weitergesucht werden.
        Wenn der else-Zweig ausgeführt wird, wird $weiter auf false gesetzt und somit die Schleife beendet.
        Das heißt, weitere Zeilen außer der ersten werden gar nicht durchsucht.

        Da stimmt noch was mit der Logik nicht.

        Da scheinst Du Recht zu haben.

        Mac will ja wohl nur dann abbrechen, wenn er einen passenden Eintrag gefunden hat.
        Das $weiter = false würde also in den if-Zweig gehören.
        Und das Hinzufügen einer Zeile gehört gar nicht in die Schleife, denn es soll ja erst nach fruchtlosem Ablauf der Schleife durchgeführt werden, wenn ich die Aufgabenstellung jetzt richtig verstanden habe.

        Aber wenn er/sie such nicht wieder meldet, lohnt sich das Rätselraten nicht.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo

          Mir fällt da noch was auf.

          Falls das if nicht zutrifft, d.h. die Zeile passt nicht, sollte ja eigentlich weitergesucht werden.
          Wenn der else-Zweig ausgeführt wird, wird $weiter auf false gesetzt und somit die Schleife beendet.
          Das heißt, weitere Zeilen außer der ersten werden gar nicht durchsucht.

          Da stimmt noch was mit der Logik nicht.

          Da scheinst Du Recht zu haben.

          Mac will ja wohl nur dann abbrechen, wenn er einen passenden Eintrag gefunden hat.
          Das $weiter = false würde also in den if-Zweig gehören.
          Und das Hinzufügen einer Zeile gehört gar nicht in die Schleife, denn es soll ja erst nach fruchtlosem Ablauf der Schleife durchgeführt werden, wenn ich die Aufgabenstellung jetzt richtig verstanden habe.

          Aber wenn er/sie such nicht wieder meldet, lohnt sich das Rätselraten nicht.

          Tom hat Recht. Allerdings habe ich ja im if-Zweig ein exit stehen, sodass eh abgebrochen wird. Den Schleifenabruch $weiter = false habe ich im else, damit nicht 1000+1mal eingetragen wird. Aber stimmt, ich könnte die Zeile auch außerhalb der Schleife hinzufügen, löst aber mein Problem nicht.

          Gruß
          mac

          1. Hello,

            Mir fällt da noch was auf.

            Falls das if nicht zutrifft, d.h. die Zeile passt nicht, sollte ja eigentlich weitergesucht werden.
            Wenn der else-Zweig ausgeführt wird, wird $weiter auf false gesetzt und somit die Schleife beendet.
            Das heißt, weitere Zeilen außer der ersten werden gar nicht durchsucht.

            Da stimmt noch was mit der Logik nicht.

            Da scheinst Du Recht zu haben.

            Mac will ja wohl nur dann abbrechen, wenn er einen passenden Eintrag gefunden hat.
            Das $weiter = false würde also in den if-Zweig gehören.
            Und das Hinzufügen einer Zeile gehört gar nicht in die Schleife, denn es soll ja erst nach fruchtlosem Ablauf der Schleife durchgeführt werden, wenn ich die Aufgabenstellung jetzt richtig verstanden habe.

            Aber wenn er/sie such nicht wieder meldet, lohnt sich das Rätselraten nicht.

            Tom hat Recht. Allerdings habe ich ja im if-Zweig ein exit stehen, sodass eh abgebrochen wird. Den Schleifenabruch $weiter = false habe ich im else, damit nicht 1000+1mal eingetragen wird. Aber stimmt, ich könnte die Zeile auch außerhalb der Schleife hinzufügen, löst aber mein Problem nicht.

            Löse erstmal das Datenbeschaffungsproblem, also die Umwandlung des Streams aus der Datei in "Zeilen" und dann der "Zeilen" in einzelne "Datenfelder".

            Und lass dir das dann mal formatiert ausgeben zur Kontrolle.

            Du hast über das von Dir selbst erkannt Problem, das von Encoder zusätzlich erwähnte, noch ein drittes zu lösen. Du willst doch die Klicks zählen, also nicht nur nur immer hinten anhängen. Es soll doch also bestimmt bei einem vorhandenen Link und gleicher IP noch ein Zähler heraufgesetzt werden, oder?

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hallo,

              »»Es soll doch also bestimmt bei einem vorhandenen Link und gleicher IP noch ein Zähler heraufgesetzt werden, oder?

              Das ist schon erledigt, der eigentliche Zähler folgt auf dem geposteten Codeschnippsel. Das Zählen beim Anklicken klappt auch, nur die IP-Sperre nicht. Es soll einfach nicht endlos geklickt werden können.

              Gruß
              mac

              1. Hello,

                Hallo,

                »»Es soll doch also bestimmt bei einem vorhandenen Link und gleicher IP noch ein Zähler heraufgesetzt werden, oder?

                Das ist schon erledigt, der eigentliche Zähler folgt auf dem geposteten Codeschnippsel. Das Zählen beim Anklicken klappt auch, nur die IP-Sperre nicht. Es soll einfach nicht endlos geklickt werden können.

                Du möchstest also einen Klick von jeder IP nur einmal registrieren? Und wenn der Klicker dann morgen mit derselben IP wiederkommt, oder morgen mit derselben IP ein anderer Klicker kommt, dann soll der auch nicht registriert werden?

                Eine IP ist kein geeignetes Mittel, einen Client zu identifizieren. Unabhängig davon würde ein Verfahren, dass eine IP nur eine bregrenzte Zeit lang von der Zählung ausschließt für deine statistischen Zwecke noch hinreichend genau sein können. Mit der IP zu arbeiten ist also nicht generell unsinnig.

                Nur eine IP, die schon einmal aufgetreten ist, generell auszuschließen, wäre hier unsinnig!

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Du möchstest also einen Klick von jeder IP nur einmal registrieren? Und wenn der Klicker dann morgen mit derselben IP wiederkommt, oder morgen mit derselben IP ein anderer Klicker kommt, dann soll der auch nicht registriert werden?

                  Das "Risiko" nehm ich in Kauf ;). So stark wird meine Seite nicht frequentiert sein. (Der gleiche Besucher am nächsten Tag soll auch nicht gewertet werden!)

                  Eine IP ist kein geeignetes Mittel, einen Client zu identifizieren. Unabhängig davon würde ein Verfahren, dass eine IP nur eine bregrenzte Zeit lang von der Zählung ausschließt für deine statistischen Zwecke noch hinreichend genau sein können. Mit der IP zu arbeiten ist also nicht generell unsinnig.

                  Nur eine IP, die schon einmal aufgetreten ist, generell auszuschließen, wäre hier unsinnig!

                  Du hast Recht, 100% ist das nicht. Die Kombination IP + Permalink sollte aber für mich ausreichen. (Das Ganz soll eine Art "Gefällt mir" Button für Beiträge werden, wo darunter die Anzahl der Klicks steht.)

                  Gruß
                  mac

                  1. Hello Mac,

                    Du hast Recht, 100% ist das nicht. Die Kombination IP + Permalink sollte aber für mich ausreichen. (Das Ganz soll eine Art "Gefällt mir" Button für Beiträge werden, wo darunter die Anzahl der Klicks steht.)

                    Ich habe Dir nochmal eine Lösung gebastelt, die mit einem serialisierten Array arbeitet. Du kannst sie ja mal ausprobieren (Habe ich noch nicht) und den Code sicherlich auch noch etwas zusammenfassen an einigen Stellen.

                    Du siehst, dass diese Lösung ganz ohne explizite Schleifen auskommt. Die sind alle versteckt in den PHP-Funktionen und -Funktionalitäten.

                    <?php    ### linkcounter.php ###

                    $filename = '.ht_clickcounter.txt';

                    Zur Installation Kommentarzeichen entfernen

                    touch($filename)

                    define('IP_BLOCKINGTIME', 3600);  ## Blockintime 1 Hour

                    ----------------------------------------------------

                    $ip = $_SERVER['REMOTE_ADDR'];
                    $link = $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];

                    ggf. noch ergänzen um den Query-String

                    /*
                    if (isset($_SERVER['QUERY_STRING']))
                    {
                        $link = $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] .'?'. $_SERVER['QUERY_STRING'];
                    }
                    */

                    eventuell X_FORWARDED_FOR berücksichtigen

                    if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
                    {
                        $ip .= ';' . $_SERVER['HTTP_X_FORWARDED_FOR'];
                    }

                    $time = time();

                    ----------------------------------------------------

                    Aufbau eines Records, $link ist Index

                    #$_linklist = array();
                    #$_linklist[$link] = array();
                    #$_linklist[$link][$ip] = array();
                    #$_linklist[$link][$ip]['lasttime'] = 0;
                    #$_linklist[$link][$ip]['clicks'] = 0;

                    Daten holen

                    $fh = @fopen($filename, 'rb+');
                    if (!$fh) exit;

                    if (!flock($fh, LOCK_EX)) exit;

                    $stream = fread($fh, filesize($filename));
                    $_linklist = unserialize($stream);
                    unset($data);

                    if (!is_array($_linklist)) exit;

                    Ist der Link bereits in der Liste?

                    if (isset ($_linklist['$link']))
                    {
                        ## Ist der Link schon von der IP aufgerufen worden?
                        if (isset ($_linklist[$link][$ip]))
                        {
                            ## Wie lange ist es her, dass der Link aufgerufen wurde?
                            if ($time - $_linklist[$link][$ip]['lasttime'] > IP_BLOCKINGTIME )
                            {
                                ## Aufrufzähler hochzählen und Aufrufzeit nachtriggern
                                $_linklist[$link][$ip]['clicks'] ++;
                                $_linklist[$link][$ip]['lasttime'] = $time;
                            }
                            else
                            {
                                ## Nur Letzte Aufrufzeit nachtriggern
                                $_linklist[$link][$ip]['lasttime'] = $time;
                            }
                        }
                        else
                        {
                            ## Neue IP für den Link eintragen,
                            ## letzte Aufrufzeit setzen und
                            ## Klickzähler hochsetzen
                            $_linklist[$link][$ip] = array();
                            $_linklist[$link][$ip]['lasttime'] = $time;
                            $_linklist[$link][$ip]['clicks'] = 1;
                        }
                    }
                    else
                    {
                        ## Datensatz für Link komplett neu anlegen
                        $_linklist[$link] = array();
                        $_linklist[$link][$ip] = array();
                        $_linklist[$link][$ip]['lasttime'] = $time;
                        $_linklist[$link][$ip]['clicks'] = 1;
                    }

                    Array serialaisieren

                    $stream = serialize ($_linklist);

                    Daten wegschreiben

                    fseek($fh, 0, SEEK_SET);
                    fwrite($fh, $stream);
                    ftruncate($fh, strlen($stream));
                    fclose($fh);

                    ?>

                    Wenn Du es zum Laufen gebracht hast und verstanden hast, was wie gedacht ist, dann kannst Du daraus auch eine Funktion machen, die dann an passender Stelle aufgerufen werden kann. Die "exit"-Anweisungen solltest Du dann gegen "return" austauschen. Dann bekommt das Ganze so langsam Struktur.

                    Dein Lösungsweg ist allerdings dann besser geeignet, wenn die gesammelten Datenmengen groß werden sollen, die Datei also nicht vollständig in den Speicher passt.

                    Guten Rutsch
                    und liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    Ich gehe jetzt Silvester feiern

                    1. Hallo Tom,

                      Ich habe Dir nochmal eine Lösung gebastelt, die mit einem serialisierten Array arbeitet. Du kannst sie ja mal ausprobieren (Habe ich noch nicht) und den Code sicherlich auch noch etwas zusammenfassen an einigen Stellen.

                      Danke Tom! Ich werd das morgen mal probieren.

                      Dir auch einen guten Rutsch und schönes Feiern
                      Viele Grüße
                      mac

                      1. Hello @ all,

                        Ich habe noch ein paar Fehler beseitigt und bin gerade dabei, die zusätzlich benötigten Funktionen für den "Click-Counter mit IP-Sperre" zusammenzustellen.

                        Dabei bin ich auf eine kleine Denksportaufgabe zu Arrays gestoßen.

                        Die Struktur des Arrays soll folgendermaßen aussehen.

                        $_linklist[$link] = array();
                                $_linklist[$link][$ip] = array();
                                $_linklist[$link][$ip]['lasttime'] = $time;
                                $_linklist[$link][$ip]['clicks'] = 1;

                        Dabei werden die Keys erster und zweiter Ebene aus den Daten abgeleitet. Darin kann also alles mögliche und unmögliche stehen...

                        Wie kann ich nun feststellen, ob in der dritten Ebene die Keys ['lasttime'] und ['clicks'] vorhanden sind? Gesucht wird hierfür eine möglichst simple Funktion :-)

                        Mir fiel da nur dieses wilde Konstrukt ein...

                        if (!isset($_linklist[key($_linklist)][key($_linklist[key($_linklist)]]['clicks']),
                                       $_linklist[key($_linklist)][key($_linklist[key($_linklist)]]['lasttime'])
                            {
                                fclose($fh);
                                return false;
                            }

                        Wer kann mir da mal helfen, den Knoten aufzulösen?

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                         ☻_
                        /▌
                        / \ Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
                        1. Hello,

                          Hello @ all,

                          Ich habe noch ein paar Fehler beseitigt und bin gerade dabei, die zusätzlich benötigten Funktionen für den "Click-Counter mit IP-Sperre" zusammenzustellen.

                          Dabei bin ich auf eine kleine Denksportaufgabe zu Arrays gestoßen.

                          Die Struktur des Arrays soll folgendermaßen aussehen.

                          $_linklist[$link] = array();
                                  $_linklist[$link][$ip] = array();
                                  $_linklist[$link][$ip]['lasttime'] = $time;
                                  $_linklist[$link][$ip]['clicks'] = 1;

                          Dabei werden die Keys erster und zweiter Ebene aus den Daten abgeleitet. Darin kann also alles mögliche und unmögliche stehen...

                          Wie kann ich nun feststellen, ob in der dritten Ebene die Keys ['lasttime'] und ['clicks'] vorhanden sind? Gesucht wird hierfür eine möglichst simple Funktion :-)

                          Mir fiel da nur dieses wilde Konstrukt ein...

                          if (!isset($_linklist[key($_linklist)][key($_linklist[key($_linklist)]]['clicks']),
                                         $_linklist[key($_linklist)][key($_linklist[key($_linklist)]]['lasttime'])
                              {
                                  fclose($fh);
                                  return false;
                              }

                          nochmal neu mit passender Klammersetzung:

                          if (!isset($_linklist[key($_linklist)][key($_linklist[key($_linklist)])]['clicks'],
                                         $_linklist[key($_linklist)][key($_linklist[key($_linklist)])]['clicks']))
                              {
                                  fclose($fh);
                                  return 'klappt nicht';
                              }

                          Das würde ich gerne klarer schreiben. Wer kann mir da mal helfen, den Knoten aufzulösen?

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

                          --
                           ☻_
                          /▌
                          / \ Nur selber lernen macht schlau
                          http://bergpost.annerschbarrich.de
                          1. Hello,

                            Hello,

                            Hello @ all,

                            Ich habe noch ein paar Fehler beseitigt und bin gerade dabei, die zusätzlich benötigten Funktionen für den "Click-Counter mit IP-Sperre" zusammenzustellen.

                            Dabei bin ich auf eine kleine Denksportaufgabe zu Arrays gestoßen.

                            Die Struktur des Arrays soll folgendermaßen aussehen.

                            $_linklist[$link] = array();
                                    $_linklist[$link][$ip] = array();
                                    $_linklist[$link][$ip]['lasttime'] = $time;
                                    $_linklist[$link][$ip]['clicks'] = 1;

                            Dabei werden die Keys erster und zweiter Ebene aus den Daten abgeleitet. Darin kann also alles mögliche und unmögliche stehen...

                            Wie kann ich nun feststellen, ob in der dritten Ebene die Keys ['lasttime'] und ['clicks'] vorhanden sind? Gesucht wird hierfür eine möglichst simple Funktion :-)

                            Mir fiel da nur dieses wilde Konstrukt ein...

                            if (!isset($_linklist[key($_linklist)][key($_linklist[key($_linklist)]]['clicks']),
                                           $_linklist[key($_linklist)][key($_linklist[key($_linklist)]]['lasttime'])
                                {
                                    fclose($fh);
                                    return false;
                                }

                            nochmal neu mit passender Klammersetzung:

                            if (!isset($_linklist[key($_linklist)][key($_linklist[key($_linklist)])]['clicks'],
                                           $_linklist[key($_linklist)][key($_linklist[key($_linklist)])]['lasttime']))
                                {
                                    fclose($fh);
                                    return 'klappt nicht';
                                }

                            Das würde ich gerne klarer schreiben. Wer kann mir da mal helfen, den Knoten aufzulösen?

                            Liebe Grüße aus dem schönen Oberharz

                            Tom vom Berg

                            Liebe Grüße aus dem schönen Oberharz

                            Tom vom Berg

                            --
                             ☻_
                            /▌
                            / \ Nur selber lernen macht schlau
                            http://bergpost.annerschbarrich.de
                      2. Hello,

                        Danke Tom! Ich werd das morgen mal probieren.

                        Den aktuellen Stand findest Du unter
                        http://selfhtml.bitworks.de/snippets/clickcounter/linkcounter.php

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                         ☻_
                        /▌
                        / \ Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
                        1. Hallo Tom,

                          danke für die Neufassung! Wie binde ich dein Script überhaupt korrekt ein ich möchte den Button "Gefällt mir" klicken, und unter dem Button steht dann die Anzahl der Klicks.

                          Ich bin leider noch nicht zum testen gekommen. (verhindert wegen Krankheit) Ich melde mich, sobald es wieder geht.

                          Gruß + Ein tolles neues Jahr
                          mac

                          1. Hallo Mac,

                            danke für die Neufassung! Wie binde ich dein Script überhaupt korrekt ein ich möchte den Button "Gefällt mir" klicken, und unter dem Button steht dann die Anzahl der Klicks.

                            Bastele mal als erstes eine valide HTML-Seite mit den Links.
                            Die Einbindung erfolgt dann ganz einfach durch includieren der Funktionen und das Ausgeben der gewünschten Information an der geeigneten Stelle.

                            Poste dann mal einen Link auf die Seite, dann zeig ich Dir, wie Du die Funktionen einbinden musst. Aber bau nicht gleich so eine Monsterseite, sondern nur erst ein einfaches Beispiel mit z.B. drei Links "gefällt mir"

                            Die Funktionen könnte man auch noch weiterentwickeln. Wenn z.B. die Links "gefällt mir" und "gefällt mir nicht" geklickt werden sollen

                            link?vote=gut
                               link?vote=schlecht

                            dann kann man die mit den Funktionen von Tom zwar getrennt zählen, aber im Moment nicht verhindern, dass jemand sowohl gut, als auch schlecht votet.

                            CU
                            Peter

                            1. Hello Peter,

                              danke für die Anregung.

                              Die Funktionen könnte man auch noch weiterentwickeln. Wenn z.B. die Links "gefällt mir" und "gefällt mir nicht" geklickt werden sollen

                              link?vote=gut
                                 link?vote=schlecht

                              dann kann man die mit den Funktionen von Tom zwar getrennt zählen, aber im Moment nicht verhindern, dass jemand sowohl gut, als auch schlecht votet.

                              Ich habe mir das gleich angeschaut, ob man es "mal eben" erweitern kann. Das ist leider etwas aufwändiger, wenn man die übrigen Optionen erhalten will. Wenn ich wieder zuhause bin, werde ich mich vielleicht mal damit beschäftigen. Dann würde ich es vermutlich auch als Klasse basteln - wenn auch widerwillig ;-)

                              Liebe Grüße aus dem sonnigen Süden

                              Tom vom Berg

                              --
                               ☻_
                              /▌
                              / \ Nur selber lernen macht schlau
                              http://bergpost.annerschbarrich.de
                  2. Hallo,

                    @ Tom & für alle die es interessiert, so klappt der Code jetzt.

                      
                    $link = $_SERVER['QUERY_STRING']; // Permalink des Beitrages  
                    $ip = $_SERVER["REMOTE_ADDR"]; //IP des Besuchers  
                    $string = $link."|".$ip;  
                      
                    // Feststellen, ob Button schon einmal geklickt wurde (IP-Sperre)  
                    $datei = ($_SERVER['DOCUMENT_ROOT']."counter/db/ipsperre.txt");  
                    $userdatei = fopen($datei,"a+");  
                    while(!feof($userdatei))  
                       {  
                       $zeile = fgets($userdatei); // Zeilenweise lesen  
                       $zeile = explode("\n", $zeile);  
                       if ($string == $zeile[0]) { // wenn Permalink|IP = Permalink|IP aus der txt-Datei  
                       //echo "Sie haben bereits gew&auml;hlt.";  
                       header("Location:" .$url); // Zurück zur Ausgangsseite  
                       exit;  
                       }  
                       }  
                       fwrite($userdatei, $string."\n"); // Permalink und IP ergänzen  
                    fclose($userdatei);
                    

                    Gruß
                    mac

    2. Hallo,

      $zeile = fgets($userdatei);
         $zeile = explode('|', $zeile);

      Der Fehler liegt hier oben versteckt. Der lässt sich aber nur schwer finden.

      Eigentlich müsste doch alles funktionieren, was sollte dabei schiefgehen?

      Allerdings sollte Dir die Anzahl der Zeichen zu denken geben, wenn Du dir die Elemente von $zeile mal mit var_dump() anzeigen lassen würdest.

      var_dump($zeile) gibt folgendes aus:
      array(2) { [0]=> string(63) "http://example.de/archives/2010/01/entry-2.html" [1]=> string(14) "XX.XXX.XXX.XX2" }
      also auch soweit i.O.

      Gruß
      mac

      1. Hello,

        Hallo,

        $zeile = fgets($userdatei);
           $zeile = explode('|', $zeile);

        Der Fehler liegt hier oben versteckt. Der lässt sich aber nur schwer finden.

        Eigentlich müsste doch alles funktionieren, was sollte dabei schiefgehen?

        Allerdings sollte Dir die Anzahl der Zeichen zu denken geben, wenn Du dir die Elemente von $zeile mal mit var_dump() anzeigen lassen würdest.

        var_dump($zeile) gibt folgendes aus:
        array(2) { [0]=> string(63) "http://example.de/archives/2010/01/entry-2.html" [1]=> string(14) "XX.XXX.XXX.XX2" }
        also auch soweit i.O.

        Glaub ich nicht.

        Das kann mMn aber nicht für alle Einträge zutreffen, wenn Du mehr als einen Eintrag in der Datei hast. Lies dir mal die Beschreibung von fgets() genau durch
        http://de3.php.net/manual/en/function.fgets.php

        "Reading ends when length - 1 bytes have been read,
         on a newline (which is included in the return value),
         or on EOF (whichever comes first)... "

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo,

          Das kann mMn aber nicht für alle Einträge zutreffen, wenn Du mehr als einen Eintrag in der Datei hast. Lies dir mal die Beschreibung von fgets() genau durch
          http://de3.php.net/manual/en/function.fgets.php

          "Reading ends when length - 1 bytes have been read,
          on a newline (which is included in the return value),
          or on EOF (whichever comes first)... "

          Die Zeilen in der txt werden nach jedem Eintrag umgebrochen.
          Da ich keinen Wert angegeben habe, müsste eigentlich folgendes zutreffen: "Lesen endet, ... bei einem Zeilenumbruch (der im Rückgabewert enthalten ist) ... Wurde keine Länge übergeben wird aus dem Stream gelesen, bis das Zeilenende erreicht wird."

          Gruß
          mac

          1. Hello,

            Das kann mMn aber nicht für alle Einträge zutreffen, wenn Du mehr als einen Eintrag in der Datei hast. Lies dir mal die Beschreibung von fgets() genau durch
            http://de3.php.net/manual/en/function.fgets.php

            "Reading ends when length - 1 bytes have been read,
            on a newline (which is included in the return value),
            or on EOF (whichever comes first)... "

            Die Zeilen in der txt werden nach jedem Eintrag umgebrochen.

            Da ich keinen Wert angegeben habe, müsste eigentlich folgendes zutreffen:

            "Lesen endet, ... bei einem Zeilenumbruch (der im Rückgabewert enthalten ist) ... "

            Stimmt: "...der im Rückgabewert enthalten ist..."!

            Und was machst Du dann anschließend damit?

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de