neue: textdatei problem

hallo leute,

ich bin grad beim lernen von php und tue mich da schwer bei einer selbst gestellten aufgabe:

also textdateiinhalt ist igrneeinezahl und danach eine ip

also:

14033 127.0.0.1
14010 192.168.2.21
14000 127.0.0.1
13999 192.254.56.168

usw.

also das schreiben in die textdatei ist no problem,

aber das auswerten:
ich möchte nach werten suchen in dieser textdatei.
die ersten zahlen sind aufsteigend, aber nicht immer fortlaufend

also gesucht werden soll z.b. 127.0.0.1 in dem wert der größer ist als 14001

wie mach eich das. wäre echt lieb von euch, wenn ihr mir mit funktionsname und paar tipps helfen könntet...

danke der neue

  1. Hallo,

    ich bin grad beim lernen von php ...

    willkommen im Club!

    und tue mich da schwer bei einer selbst gestellten aufgabe:

    Och nöö, so schwer ist es doch auch wieder nicht.

    14033 127.0.0.1
    14010 192.168.2.21
    14000 127.0.0.1
    13999 192.254.56.168

    wäre echt lieb von euch, wenn ihr mir mit funktionsname und paar tipps helfen könntet...

    Es bietet sich an, den Dateiinhalt komplett mit file() einzulesen. Dann hast du alles in einem Array, jede Zeile als ein Element. Dann gehst du mit einer for-Schleife durch die einzelnen Arrayelemente und splittest jede Zeile mit explode() am Leerzeichen auf. In derselben Schleife kannst du auch schon nach dem gesuchten Eintrag fahnden. Das ist mit einem Stringvergleich und einem "wenn größer dann" leicht zu lösen.

    Good luck,
     Martin

    --
    In Ägypten haben früher 150000 Leute 35 Jahre lang an einer Pyramide gearbeitet. Aber bei uns arbeiten doppelt so viele Leute doppelt so lange allein an der Baugenehmigung.
      (Dieter Nuhr, deutscher Kabarettist)
    1. hallo,

      Es bietet sich an, den Dateiinhalt komplett mit file einzulesen.

      also $datei=file(bla.txt");

      Dann hast du alles in einem Array, jede Zeile als ein Element.

      so kann man das mal sehen, oder?

      foreach ($datei as $dateineu) {
      echo "$dateineu \n;
      }

      for(explode(" ", $datei;$datei > 14001;print $datei);

      ich glaub meine zusammensetzung ist nicht wirklich sinnvoll?
      was sollte man anders machen?
      danke

      1. Hallo,

        also $datei=file(bla.txt");

        genau, obwohl $inhalt_arr eher widergibt, was die variable beinhaltet. Ein Anfuerungszeichen fehlt, was im wahren Leben zu einen parse_error gefuehrt haette.

        foreach ($datei as $dateineu) {
        echo "$dateineu \n;

        Das ist richtig, auch hier wuerde ich eher 'foreach ($inhalt_arr as $zeile)' schreiben, dann weist du auch in 6 Wochen, was du dir gedacht hast. print_r($datei) wuerde zum blossen Hingucken reichen (ein <pre> vor print_r() macht sich immer gut)

        for(explode(" ", $datei;$datei > 14001;print $datei);

        Das ist jetzt aber richtig boeses Zeug. explode() gibt ein Array zurueck, das in deinem Fall 14soviel und die IP enthaelt. Es sollte also so aussehen:

        $inhalt_arr = file('bla.txt');
        foreach ($inhalt_arr as $zeile)
        {
          $temp_arr = explode(' ',$zeile); // sowas wie array ('14123', '127.0.0.1') als Ergebnis
          if($temp_arr[0] > 14000 && $temp_arr[1] == '127.0.0.1') // Ich hab deine Bedingungen nicht mehr im Kopf,
                                                                  // aber so was war's doch, oder
          {
            print $zeile . "\n";  // oder was immer du damit machen willst
          }
        }

        An dieser Stelle etwas Weisheit

        • stell sicher, dass dein error_reporting immer auf 2047 oder E_ALL steht und display_errors auf on
        • gib deinen Variablen und Funktionen immer sprechende Namen
        • wenn du im Forum Code postest, mach das mit Copy und Paste, damit auch die Fehler in jedem Fall sichtbar werden
        • poste auch alle Fehlermeldungen mit
        • es schadet auch nichts, dazu Syntaxhighlighting des Forums zu benutzen (siehe Hilfe). Ich mache das nur nicht, um Farbe zu sparen ;-)

        Gruß,

        Dieter

        1. hallo

          $inhalt_arr = file('bla.txt');
          foreach ($inhalt_arr as $zeile)
          {
            $temp_arr = explode(' ',$zeile); // sowas wie array ('14123', '127.0.0.1') als Ergebnis
            if($temp_arr[0] > 14000 && $temp_arr[1] == '127.0.0.1') // Ich hab deine Bedingungen nicht mehr im Kopf,
                                                                    // aber so was war's doch, oder
            {
              print $zeile . "\n";  // oder was immer du damit machen willst
            }
          }

          ja so ungefähr wars das, aber die funktion hat irgendwo einen fehler, denn er printet das echo nicht, obwohl die ip gleich ist...

          wenn ich das == auf != umsetze printet er es... wo ist da der fehler,

          und die zweite frage, statt print soll php einen neuen wert in eine txt datei schreiben, soll ich das mit fopen, fwrite und fclose verwiklichen?

          oder gibts was besseres?

          danke

          1. Hallo,

            Ich wuerde mal annehmen, da du, wie du weiter oben schreibst, noch ganz am Anfang stehst, bisher noch keine vernuenftigen Debugstrategien hast. Du solltest Dir wirklich die letzten Saetze aus meinem letzten Posting zu Herzen nehmen. Wenn du nicht weisst, was in einer Variablen steht, solltest du das mit print_r() oder var_dump() ueberpruefen. Mit dieser Bemerkung im Hinter- und entsprechenden error_reporting im Dateikopf machen wir uns auf die Suche:
            Schreib in deine Testdatei mal ein paar Zeilen, die die verschiedenen Kombinationen aus IP und Zaehler widerspiegeln, also ein, zwei Beispiele, die erfolgreich sein sollten und ein paar, auf die deine Bedingungen nicht zutreffen.

            Dann nimmst du den Code aus dem letzen Posting mit ein paar Ergaenzungen:

            error_reporting(2047); // man kann es garnicht oft genug sagen
            print '<pre>';

            $inhalt_arr = file('test_datei.txt');
            foreach ($inhalt_arr as $zeile)
            {
               $temp_arr = explode(' ',$zeile); // sowas wie array ('14123', '127.0.0.1') als Ergebnis
               // jetzt kommt was neues
               print_r($temp_arr);
               /* Das sieht dann so aus
               Array
               (
                  [0] => 14123
                  [1] => 127.0.0.1

            )

            Bei genauem Hinsehen, wirst du feststellen, dass hinter der IP noch eine Leerzeile steht, $temp_arr[1] ist also nicht '127.0.0.1', sondern "127.0.0.1\n". Wenn Du file() benutzt, ist es sinnvoll, alle Zeilen zu trimmen.

            Also ein neuer Versuch:

            foreach ($inhalt_arr as $zeile)
            {
               $zeile = trim ($zeile);
               $temp_arr = explode(' ',$zeile); // sowas wie array ('14123', '127.0.0.1') als Ergebnis
               // jetzt kommt was neues
               print_r($temp_arr);
               /* Das sieht dann so aus
               Array
               (
                  [0] => 14123
                  [1] => 127.0.0.1
               )

            Schon besser, oder? Ich habe da gestern abend nicht dran gedacht, vermute aber, dass das dein Problem ist. Wie schon erwaehnt, mit der richetigen Debugstrategie und etwas Erfahrung fallen dir soche Sachen selbst auf.

            Noch was zur Terminologie:

            aber die funktion hat irgendwo einen fehler, denn er printet das echo nicht

            Mein Code war keine Funktion, und echo kam darin auch nicht vor. Es ist uns hier im Forum wichtig, dass man sich korrekt ausdrueckt, nicht weil wir solche Korinthenkacker waeren, obwohl es natuerlich auch davon einige gibt, sondern damit Zusammenhaenge jedem sofort klar werden und keine Missverstaendnisse auftauchen.

            soll ich das mit fopen, fwrite und fclose verwiklichen?

            Das ist schon ok, du musst aber auf die Parameter achten, die file() verlangt (a,r,w und sowas), da du dir sonst u.U. die Logdatei immer wieder ueberschreibst. Ab PHP 5 kannst du auch file_put_contents() nehmen.

            Gruß,

            Dieter

            1. halli hallo,

              nun hab ichs endlich...danke dir für die hilfe, hier der text:

              <?php
               $datumjetzt = time();
               $sub = $datumjetzt - 1800;
               $ip = getenv ("REMOTE_ADDR");
               $inhalt_arr = file('log.txt');
               $speicher = 1;

              foreach ($inhalt_arr as $zeile)
               {
                $zeile = trim($zeile);
                $temp_arr = explode(' ',$zeile);
                //print_r($temp_arr);
                    if($sub - $temp_arr[0] < 1800 && $temp_arr[1] == $ip)
                    {
                    $speicher = 0;
                    }
                    else
                    {
                    $speicher = 1;
                    }
               }
              if($speicher == 1)
                       {
                        $information = $datumjetzt." ".$ip. "\r\n";
                        $datei_handle=fopen("log.txt",'a');
                        fwrite($datei_handle,$information);
                        fclose($datei_handle);
                        echo "habs geschrieben";
                       }
                    else
                       {
                       echo "du warst schon mal da";
                       }
              echo "<br>User insgesamt", + count($inhalt_arr);
              ?>

              grüße

  2. Hallo neue,

    Du willst was mit einer Datei machen, also schaust dich mal bei den Funktionen, die was mit dem Filesystem zu tun haben um. Jede Zeile ist ein Eintrag, also waere es klug, deine Datei mit file() in ein Array einzulesen. Um an jeden Eintrag des Arrays ranzukommen, waere eine Schleife keine schlechte Idee. Mal sehen, foreach sieht ziemlich gut aus. Um herauszufinden, ob der String 127.0.0.1 in deinem Eintrag vorhanden ist, braucht man Stringfunktionen, strpos() scheint hier das richtige zu sein.

    Jetzt willst du auch noch wissen, ob der erste Wert groesser 14001 ist?. Dazu musst du erstmal den Wert isolieren. Mal sehen, was fuer Informationen vorhanden sind:

    1. 14001 sind die ersten 5 Zeichen des Strings, das ist aber doof, denn es werden bestimmt auch mal 4 oder 6 sein
    2. nach der Zahl kommt ein Lehrzeeichen, dann die IP, das behalten wir mal im Kopf
    3. in dem String kommt die gesuchte Zahl, das Leerzeichen und die IP 127.0.0.1 vor, auch bedenkenswert

    bei 2. wuerde dir http://lu.php.net/manual/de/function.explode.php@tile=explode() helfen, dass du zielsicher bei den Stringfunktionen entdeckt hast. Das Ergebnis waere ein Array, wobei du nur noch herausfinden muesstest, ob Array[0] groesser 14001 ist
    bei 3. koenntest du das Leerzeichen, gefolgt von der 127.0.0.1 mit stra_replace() durch nichts ersetzen und haettest ebenfalls Zugriff auf das Objekt deiner Begierde.

    Gruß,

    Dieter