Harald: warum wird diese Funktion ausgeführt?

Hallo @ all,

Ich habe schon viele möglichkeiten ausprobiert, das ausführen der Funktion zu verhindern, doch keine Funktioniert, langsam bin ich ratlos, ich hoffe daher, ihr könnt mir weiterhelfen.
Ein Versuch z.B.:

function besucher($id){
if($id=="1"){
#die eigentliche Funktion wird hier ausgeführt, wobei der wesentliche Teil aus "fopen" einer Datei besteht.
}}

Doch immer wird die Datei eingelesen, gleich ob die Variable id gar nicht gesetzt ist oder irgend eine Zahl wie z.B. 3 ist.

--------------
Mfg: Harry

  1. Hallo!

    function besucher($id){
    if($id=="1"){
    #die eigentliche Funktion wird hier ausgeführt, wobei der wesentliche Teil aus "fopen" einer Datei besteht.
    }}

    Soweit ich weiß entspeicht diese Prüfung auch if ($id==TRUE) oder if($id).

    Grüße
    Andreas

    1. Hallo Andreas,

      Danke für die Antwort, doch dann dürfte die Funktion nicht ausgeführt werden, falls $id gar nicht gesetzt ist, was es aber auch macht.
      Auch Abbrüche wie
      if($id!="1" || $id=="" || !isset($id)) return;
      in der Funktion waren nutzlos.

      -------------
      Mfg: Harry

      1. Hallo,

        Auch scheint nicht die gesamte Funktion ausgeführt zu werden, sondern nur der Teil der die Datei bearbeitet,
        ... $datei = fopen ($dateiname, "w"); ...
        ein echo "Text"; z.B. wird nur tatsächlich ausgeführt, wenn auch die Funktion "normalerweise" ausgeführt wird.

        -------------
        Mfg: Harry

        1. Hi!

          Passiert das ganze auch wenn Du es aus der Funktion rausnimmst? Lass mal die Funktion weg und teste in einer eigenen Datei. Und Poste mal den genauen Code!

          Grüße
          Andreas

          1. Hallo Andreas,

            Die etwas Verkürzte Version der Funktion (die wesentlichen Teile befinden sich drinnen, der gesamte Code ist noch um einiges länger, doch es scheitert schon an diesem kuzen Ausschnitt):

            function besucher($id)
            {
            if($id!="1" || $id=="" || !isset($id)) return;

            echo "Funktion besucher wird ausgeführt";

            // Wenn User einen Proxy verwendet
             if (getenv(HTTP_X_FORWARDED_FOR))
             {
              $ip = getenv(HTTP_X_FORWARDED_FOR);
             }
             // Normalfall
             else
             {
              $ip = getenv(REMOTE_ADDR);
             }
             // getHost
             $host = @gethostbyaddr($ip);
             // max
             $dateiname = "**dateiname**";
             $anzeintraege = 0;
             $maxeintraege = 1;
             $zaehler = 0;
             $datei = fopen ($dateiname, "r");
             if($datei)
             {
              while($dat[$zaehler++] = stripslashes(fgets($datei, 255)));
              fclose($datei);
             }
             $anzeintraege = $zaehler - 1;
             // schreiben
             $dt = date("d.m.Y H:i");
             $ipaho = "IP: $ip  Host: $host --> $dt <br>\n";
             $dat[$anzeintraege++] = "$ipaho";
             if($maxeintraege > $anzeintraege) $maxeintraege = $anzeintraege;
             $datei = fopen ($dateiname, "w");
             if($datei)
             {
              for ($zaehler = $anzeintraege-$maxeintraege; $zaehler < $anzeintraege; $zaehler++)
              {
               fputs($datei, $dat[$zaehler]);
              }
              fclose($datei);
             }

            }

            -----------
            Mfg: Harry

            1. Halllo!

              Kann das nicht nachvollziehen.

              <?
              function besucher($id) {
               if($id!="1" || $id=="" || !isset($id)) return;
               echo "wird ausgeführt";
              }

              besucher(2);
              ?>

              da wird die Funktion nicht ausgeführt, bei besucher(1); wird sie ausgeführt.

              Vielleicht solltest Du mal gucke was genau $id übergibt, evtl mal eine komplette Verschachtelung mit {} probieren, oder besser noch, _vor_ demAufruf der Funktion prüfen was mit $id los ist. Also

              if ($id == 1) {
                besucher($id);
              }

              Mehr fällt mir dazu auch nicht ein. Ich vermute das das Problem bei $id liegt. Lass es Dir doch mal ausgeben, welchen wert hat $id?

              Grüße
              Andreas

              1. Hallo Andreas,

                id ist z.B. nicht gesetzt, oder 3, habe ich natürlich schon ausprobiert, werde aber weiter probieren, woran es liegen kann.

                Ps: Danke für alle Antworten.

                ----------
                Mfg: Harry

                1. Hallo,

                  Nehme ich statt "return" "die", so zeigt er, wie er das auch sollte, die Seiten nicht fertig an, doch in die Datei schreibt er trotzdem, es bleibt mir also ein rätsel, wie dies geht.

                  Setzten wir dagegen vor den Funktionsaufruf:
                  if($id=="1" && $id!="" && isset($id) && $id!="0") besucher($id);
                  so bleiben die Seiten ganz (die Funktion wird scheinbar nicht gestartet), doch nein, das stimmt nicht, es werden sehr wohl einträge in den Besucherzähler vorgenommen.

                  Daher meine Vermutung:
                  Vielleicht rufen die Browser nicht nur die Adresse (z.B.)
                  http://www.sciencesource.info/index.php?id=3
                  auf, sondern zusätzlich auch manchmal
                  http://www.sciencesource.info/
                  , wobei mir der Sinn dahinter verborgen bleibt.
                  Doch wie es ja so schön heist, schließt man alle Möglichkeiten bis auf eine aus, und mag diese auch noch so unwarscheinlich sein, so ist diese die Lösung des Problems (oder so ähnlich).

                  Was haltet ihr von dieser Vermutung, oder gibt es doch ein andere erklärung?

                  ----------
                  Mfg: Harry

                  1. Hallo Harald,

                    Nehme ich statt "return" "die", so zeigt er, wie er das auch sollte, die Seiten nicht fertig an, doch in die Datei schreibt er trotzdem, es bleibt mir also ein rätsel, wie dies geht.

                    Frage:
                    Ist die Funktion besucher() die einzige Funktion, die schreibend auf Deine Datei zugreift?
                    Wenn ja, muss also ein weiterer Aufruf von besucher("1") erfolgen.
                    Dann sind alle Aufrufstellen von besucher zu checken.
                    Wenn nein, kannst Du ja nicht entscheiden, welche Funktion in Deine Datei geschrieben hat und darfst deswegen nicht die Schuld auf die Funktion besucher() schieben. In diesem Falle könntest Du, falls es Deine Dateistruktur erlaubt, einen Kommentar in die Datei schreiben, wer den Eintrag verursacht hat.

                    Vielleicht rufen die Browser nicht nur die Adresse (z.B.)
                    http://www.sciencesource.info/index.php?id=3
                    auf, sondern zusätzlich auch manchmal

                    http://www.sciencesource.info/

                    Produziert diese Anfrage einen Aufruf von besucher("1")?

                    hth,
                    Gruss,

                    Vinzenz

            2. Hallo Harry,

              function besucher($id)
              {
              if($id!="1" || $id=="" || !isset($id)) return;
              echo "Funktion besucher wird ausgeführt";

              ...

              Wird bei einem Aufruf von
                besucher(3);
              wirklich
                Funktion besucher wird ausgeführt
              ausgegeben?

              Falls nein, wird die Funktion auch nicht ausgeführt, und Deine Dateioperation kommt woandersher.

              Gruss,

              Vinzenz

  2. Guten Morgen Harry,

    so ein Problem hatte ich mir neulich auch selbstgebastelt. Da hat PHP gemacht, was es wollte und zwar, weil es intern seine Variablentabelle nicht mehr gefunden hat. Das lag vermutlich an einem doppelten include mehrerer Konstantendefinitionen. Bei doppelten Funktionsdefinitionen wird man gewarnt, bei doppelten Konstantendefinitionen (durch gestaffelte "Doppel-Includes") aber nicht.

    Nach zwei Stunden rumprobieren habe ich die doppelten Includes dann beseitigt und PHP neu gestartet (also den Apachen). Danach funktionierte wieder alles.

    Ich habe vorerst beschlossen, die Includes NUR noch in der Scriptdatei durchzuführen.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.