Thomas D.: Suchen mit php

Moin Moin

Bräuchte mal kurze Info mit welchem Befehl ich in einer Datei einen bestimmten Begriff suchen kann und den gesuchten Begriff dann in meine MySql Datenbank einfügen kann.

Gruss Thomas

  1. Hallo

    Bräuchte mal kurze Info mit welchem Befehl ich in einer Datei einen bestimmten Begriff suchen kann

    Um in einer Datei etwas zu suchen, musst Du auf den Dateiinhalt zugreifen können. Dazu kannst Du z.B. file_get_contents() verwenden. Den Begriff suchst Du anschließend mit strpos().

    und den gesuchten Begriff dann in meine MySql Datenbank einfügen kann.

    dazu erstellst Du Dir mit Hilfe des MySQL-Handbuch, INSERT-Syntax, das SQL-Statement, zu dessen Ausführung Dir die MySQL-Funktionen von PHP dienen können.

    Freundliche Grüße

    Vinzenz

  2. Moin Moin

    Bräuchte mal kurze Info mit welchem Befehl ich in einer Datei einen bestimmten Begriff suchen kann und den gesuchten Begriff dann in meine MySql Datenbank einfügen kann.

    Gruss Thomas

    hoi..aus welcher art von datei? txt, php, html...

    greez Sci

    http://www.relaxed-gaming.com

    1. Hey Sci

      der Suchbegriff soll aus einer Textdatei gelesen werden.
      Diese beinhaltet zum Beispiel :

      From thomas@domäne.de  Sat Dec 17 12:00:50 2005
      Return-Path: <thomas@domäne.de>
      Received: from domäne.de (domäne.de [127.0.0.1])
              by domäne.de (8.13.5/8.13.5) with ESMTP id jBHB0UUx005666
              (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO)
              for <root@domäne.de>; Sat, 17 Dec 2005 12:00:30 +0100
      Received: (from nobody@localhost)
              by domäne.de (8.13.5/8.13.5/Submit) id jBHB0UwO005665;
              Sat, 17 Dec 2005 12:00:30 +0100
      X-Authentication-Warning: domäne.de: nobody set sender to thomas@domäne.de using -f
      Received: from 192.168.20.6
              (SquirrelMail authenticated user thomas)
              by webmail.domäne.de with HTTP;
              Sat, 17 Dec 2005 12:00:30 +0100 (CET)
      Message-ID: <1920.192.168.20.6.1134817230.squirrel@webmail.domäne.de>
      Date: Sat, 17 Dec 2005 12:00:30 +0100 (CET)
      Subject: online
      From: "Thomas" <thomas@domäne.de>
      Subject: online
      From: "Thomas" <thomas@domäne.de>
      To: root@domäne.de
      User-Agent: SquirrelMail/1.4.5-1
      MIME-Version: 1.0
      Content-Type: text/plain;charset=iso-8859-1
      Content-Transfer-Encoding: 8bit
      X-Priority: 3 (Normal)
      Importance: Normal
      X-www.domäne.de-MailScanner-Information: Please contact the ISP for more information
      X-www.domäne.de-MailScanner: Found to be clean
      X-www.domäne.de-MailScanner-From: thomas@domäne.de

      ppp0      Protokoll:Ethernet  Hardware Adresse 00:C1:26:0E:CE:FD
                inet Adresse:84.84.23.34  Bcast:192.168.19.255
      Maske:255.255.255.0
                inet6 Adresse: fe80::2c1:26ff:fe0e:cefd/64
      Gültigkeitsbereich:Verbindung
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:5124398 errors:0 dropped:0 overruns:0 frame:0
                TX packets:6445346 errors:0 dropped:0 overruns:10 carrier:0
      Kollisionen:0 Sendewarteschlangenlänge:1000
                RX bytes:3358319258 (3.1 GiB)  TX bytes:1028168635 (980.5 MiB)
                Interrupt:11 Basisadresse:0xc000
      ist eine Maildatei.

      Was ich ausfiltern möchte ist das Datum mit Uhrzeit 1. Zeile Sat Dec 17 12:00:50 2005 und die IP die gesendet wird inet Adresse:84.84.23.34. Die beiden Daten möchte ich dann in meine SQL Datenbank einfügen.

      Gruss Thomas

      1. Hallo Thomas,

        From thomas@domäne.de  Sat Dec 17 12:00:50 2005

        [...]

        ppp0      Protokoll:Ethernet  Hardware Adresse 00:C1:26:0E:CE:FD
                  inet Adresse:84.84.23.34  Bcast:192.168.19.255

        [...]

        Was ich ausfiltern möchte ist das Datum mit Uhrzeit 1. Zeile Sat Dec 17 12:00:50 2005

        Du möchtest also die Datei zeilenweise abarbeiten. Dann hilft Dir file() weiter.

        Du weißt, dass die eine der beiden Dich interessierenden Informationen in der ersten Zeile steht, hier brauchst Du die Zeile nicht zu suchen. Die Zeile hat einen stets gleichen Aufbau, trenne die einzelnen Informationen mit explode() und extrahiere aus dem resultierenden Array die Information, die Dich interessiert. Verwende zum Zusammensetzen implode().

        und die IP die gesendet wird inet Adresse:84.84.23.34. Die beiden Daten möchte ich dann in meine SQL Datenbank einfügen.

        Durchsuche zeilenweise die Datei bis Du an die von Dir gewünschte Zeile kommst. Überlege Dir, wie Du diese erkennst. Gehe dort analog zur ersten Zeile vor.

        Zum Abspeichern, siehe mein erstes Posting.

        Freundliche Grüße

        Vinzenz

      2. --

        Hey Sci

        der Suchbegriff soll aus einer Textdatei gelesen werden.
        Diese beinhaltet zum Beispiel :

        From thomas@domäne.de  Sat Dec 17 12:00:50 2005
        Return-Path: <thomas@domäne.de>
        Received: from domäne.de (domäne.de [127.0.0.1])
                by domäne.de (8.13.5/8.13.5) with ESMTP id jBHB0UUx005666
                (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO)
                for <root@domäne.de>; Sat, 17 Dec 2005 12:00:30 +0100
        Received: (from nobody@localhost)
                by domäne.de (8.13.5/8.13.5/Submit) id jBHB0UwO005665;
                Sat, 17 Dec 2005 12:00:30 +0100
        X-Authentication-Warning: domäne.de: nobody set sender to thomas@domäne.de using -f
        Received: from 192.168.20.6
                (SquirrelMail authenticated user thomas)
                by webmail.domäne.de with HTTP;
                Sat, 17 Dec 2005 12:00:30 +0100 (CET)
        Message-ID: <1920.192.168.20.6.1134817230.squirrel@webmail.domäne.de>
        Date: Sat, 17 Dec 2005 12:00:30 +0100 (CET)
        Subject: online
        From: "Thomas" <thomas@domäne.de>
        Subject: online
        From: "Thomas" <thomas@domäne.de>
        To: root@domäne.de
        User-Agent: SquirrelMail/1.4.5-1
        MIME-Version: 1.0
        Content-Type: text/plain;charset=iso-8859-1
        Content-Transfer-Encoding: 8bit
        X-Priority: 3 (Normal)
        Importance: Normal
        X-www.domäne.de-MailScanner-Information: Please contact the ISP for more information
        X-www.domäne.de-MailScanner: Found to be clean
        X-www.domäne.de-MailScanner-From: thomas@domäne.de

        ppp0      Protokoll:Ethernet  Hardware Adresse 00:C1:26:0E:CE:FD
                  inet Adresse:84.84.23.34  Bcast:192.168.19.255
        Maske:255.255.255.0
                  inet6 Adresse: fe80::2c1:26ff:fe0e:cefd/64
        Gültigkeitsbereich:Verbindung
                  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                  RX packets:5124398 errors:0 dropped:0 overruns:0 frame:0
                  TX packets:6445346 errors:0 dropped:0 overruns:10 carrier:0
        Kollisionen:0 Sendewarteschlangenlänge:1000
                  RX bytes:3358319258 (3.1 GiB)  TX bytes:1028168635 (980.5 MiB)
                  Interrupt:11 Basisadresse:0xc000
        ist eine Maildatei.

        Was ich ausfiltern möchte ist das Datum mit Uhrzeit 1. Zeile Sat Dec 17 12:00:50 2005 und die IP die gesendet wird inet Adresse:84.84.23.34. Die beiden Daten möchte ich dann in meine SQL Datenbank einfügen.

        Gruss Thomas

        --
        Hallo Thomas

        Also es geht um die Absender IP und das Sendedatum, wenn ich das richtig sehe.

        Deswegen noch eine Frage: rennt es via Formmailer oder nicht?
        Wenn ja, dann brauchst Du eigentlich nur bei der Bestätigungsseite, dass die Mail verschickt worden ist, die Daten in die DB schreiben lassen.
        Du musst dann nur folgende Seiten mit Code ergänzen.

        Eingabemaske:

        <input type="hidden" value="<? echo $REMOTE_ADDR; ?>" name="ip">
        <input type="hidden" value="<? echo date('d.m.Y H:m'); ?>" name="zeit">

        Seite mit "Mail wurde verschickt":
        <?
        $sql = "INSERT INTO <TABELLENNAME> (id,<NAME\_DES\_IP\_FELDES>,<NAME\_DES\_ZEIT\_FELDES>) VALUES ('$ip','$zeit');
        ?>

        Ach ja, wichtig ist, dass der Datenbank Connect vorher natürlich nicht vergessen wird.

        Vll. konnte ich Dir helfen.

        LG

        --
        Sci-Phy
        Leader, Coder & Head-Admin of relaXed-gaming Multigaming
        http://www.relaxed-gaming.com
        1. Hallo Thomas

          Also es geht um die Absender IP und das Sendedatum, wenn ich das richtig sehe.

          !! RICHTIG !!

          Deswegen noch eine Frage: rennt es via Formmailer oder nicht?

          Nein, ich bekomme von seinem System einfach nur die Mail mit den Daten die ich hier gepostet habe.

          Ich möchte einfach nur das das Script was ich hier erstellen möchte, per crontab minütlich aufgerufen wird, sich die zwei Daten schnappt und diese in die MySql Datenbank einfügt.

          Ich muss leider eingestehen das ich ewig nix mehr mit php gemacht habe. Die SQL Statements sind kein Problem unter php.

          Gruesse Thomas

          1. Hallo Thomas,

            Nein, ich bekomme von seinem System einfach nur die Mail mit den Daten die ich hier gepostet habe.
            Ich muss leider eingestehen das ich ewig nix mehr mit php gemacht habe. Die SQL Statements sind kein Problem unter php.

            wo hakt es denn genau? Ich habe Dir doch detaillierte Tipps gegeben, wie Du Deine Aufgabenstellung angehen kannst. Was hast Du bisher hinbekommen? Wo bist Du hängen geblieben? Was hast Du nicht verstanden?

            Freundliche Grüße

            Vinzenz

            1. Hey Vinzenz

              Danke erstmal für deine Antwort, ich hab mir mal die Befehlssyntax mit explode angeschaut und auch getestet.
              Ich bekomme auch eine Ausgabe aber nur inet Adresse und nicht die IP. Schau mal

              <?php
              // Liest eine Datei in ein Array. Hier gehen wir über HTTP, um die
              // HTML Datei einer URL zu bekommen
              $lines = file ('messagesbackup/testfile');

              // Durchgehen des Arrays und Anzeigen des HTML Source inkl. Zeilennummern
              foreach ($lines as $line_num => $line) {
                 echo "{$line_num}</b> : " . htmlspecialchars($line) . "<br>\n";
              }

              ?>

              Ausgabe :

              0 : From MAILER-DAEMON Sat Dec 17 13:21:06 2005
              1 : Date: 17 Dec 2005 13:21:06 +0100
              2 : From: Mail System Internal Data <MAILER-DAEMON@.de>
              3 : Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
              4 : Message-ID: <1134822066@.de>
              5 : X-IMAP: 1108825610 0000009008 $MDNSent
              6 : Status: RO
              7 :
              8 : This text is part of the internal format of your mail folder, and is not
              9 : a real message. It is created automatically by the mail system software.
              10 : If deleted, important folder data will be lost, and it will be re-created
              11 : with the data reset to initial values.
              12 :
              13 : From thomas@microfun.de Sat Dec 17 13:21:04 2005
              14 : Return-Path: <thomas@.de>
              15 : Received: from .de (.de [127.0.0.1])
              16 : by microfun.de (8.13.5/8.13.5) with ESMTP id jBHCKmTD011837
              17 : (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO)
              18 : for <thomas@.de>; Sat, 17 Dec 2005 13:20:49 +0100
              19 : Received: (from nobody@localhost)
              20 : by microfun.de (8.13.5/8.13.5/Submit) id jBHCKmM4011836;
              21 : Sat, 17 Dec 2005 13:20:48 +0100
              22 : X-Authentication-Warning: .de: nobody set sender to thomas@.de using -f
              23 : Received: from 192.168.20.6
              24 : (SquirrelMail authenticated user thomas)
              25 : by webmail.de with HTTP;
              26 : Sat, 17 Dec 2005 13:20:48 +0100 (CET)
              27 : Message-ID: 2494.192.168.20.6.1134822048.squirrel@webmail.de
              28 : Date: Sat, 17 Dec 2005 13:20:48 +0100 (CET)
              29 : Subject: online
              30 : From: "Thomas" <thomas@.de>
              31 : To: thomas@.de
              32 : User-Agent: SquirrelMail/1.4.5-1
              33 : MIME-Version: 1.0
              34 : Content-Type: text/plain;charset=iso-8859-1
              35 : Content-Transfer-Encoding: 8bit
              36 : X-Priority: 3 (Normal)
              37 : Importance: Normal
              38 : X-www.de-MailScanner-Information: Please contact the ISP for more information
              39 : X-www.de-MailScanner: Found to be clean
              40 : X-www.de-MailScanner-From: thomas@.de
              41 : Status: O
              42 : X-Status:
              43 : X-Keywords:
              44 : X-UID: 9008
              45 : eth0 Protokoll:Ethernet Hardware Adresse 00:C1:26:0E:CE:FD
              46 : inet Adresse:192.168.19.2 Bcast:192.168.19.255
              47 : Maske:255.255.255.0
              48 : inet6 Adresse: fe80::2c1:26ff:fe0e:cefd/64
              49 : Gültigkeitsbereich:Verbindung
              50 : UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
              51 : RX packets:5146287 errors:0 dropped:0 overruns:0 frame:0
              52 : TX packets:6460734 errors:0 dropped:0 overruns:10 carrier:0
              53 : Kollisionen:0 Sendewarteschlangenlänge:1000
              54 : RX bytes:3374497054 (3.1 GiB) TX bytes:1031786973 (983.9 MiB)
              55 : Interrupt:11 Basisadresse:0xc000
              56 :
              57 :
              58 : --
              59 : Diese Nachricht wurde auf Viren und andere gefaehrliche Inhalte untersucht
              60 : und ist - aktuelle Virenscanner vorausgesetzt - sauber.
              61 : MailScanner dankt transtec Computer fuer die freundliche Unterstuetzung.

              und wie bekomme ich nun die Inet Adresse und das Datum ausgefiltert ?

              Datum denke ich mal wäre zu realisieren mit strtotime.

              Gruss Thomas

              1. Hallo Thomas,

                Danke erstmal für deine Antwort, ich hab mir mal die Befehlssyntax mit explode angeschaut und auch getestet.
                Ich bekomme auch eine Ausgabe aber nur inet Adresse und nicht die IP. Schau mal

                  
                
                > <?php  
                > // Liest eine Datei in ein Array. Hier gehen wir über HTTP, um die  
                > // HTML Datei einer URL zu bekommen  
                > $lines = file ('messagesbackup/testfile');  
                  
                   // initialisiere das assoziative Array, das das Ergebnis aufnehmen wird  
                   $ergebnis['date'] = "";  
                   $ergebnis['ip']   = "";  
                  
                
                > // Durchgehen des Arrays und Anzeigen des HTML Source inkl. Zeilennummern  
                > foreach ($lines as $line_num => $line) {  
                >    // echo "{$line_num}</b> : " . htmlspecialchars($line) . "<br>\n";  
                
                      // Zeilen nicht ausgeben, sondern verarbeiten :-)  
                      // Zeile 0 enthält das Datum  
                
                >    // 0 : From MAILER-DAEMON Sat Dec 17 13:21:06 2005  
                
                      if ($line_num == 0) {  
                          // From MAILER-DAEMON Sat Dec 17 13:21:06 2005  
                          // Teile die Zeichenkette am Leerzeichen auf: Separator: " "  
                          // Nach dem zweiten Leerzeichen interessiert der ganze Rest: Limit: 3  
                          // Ergebnis: From                       $parts[0]  
                          //           MAILER-DAEMON              $parts[1]  
                          //           Sat Dec 17 13:21:06 2005   $parts[2]  
                          $parts = explode(" ", $line, 3);  
                          $ergebnis['date'] = $parts[2];          // Datum erledigt  
                      }  
                      // Suche weiter nach der Zeile mit dem Inhalt inet Adresse  
                
                >    // 46 : inet Adresse:192.168.19.2 Bcast:192.168.19.255  
                
                      // Hier sollte Code folgen, der diese ermittelt  
                      // unter anderem kannst Du die Funktion strpos() verwenden.  
                  
                
                > }  
                > ?>  
                
                

                und wie bekomme ich nun die Inet Adresse und das Datum ausgefiltert ?
                Datum denke ich mal wäre zu realisieren mit strtotime.

                Nö, mit explode(), siehe oben, zur IP-Adresse:

                // 46 : inet Adresse:192.168.19.2 Bcast:192.168.19.255

                Gibt es nur eine Zeile, die den Text "inet Adresse" enthält. Wenn ja, wie in Deinem vorherigen Posting, dann brauchst Du nur nach diesem Text zu suchen. Wenn nein, wie kannst Du die Zeile von anderen, die ebenfalls den Text "inet Adresse" enthalten, unterscheiden.

                Freundliche Grüße

                Vinzenz

                1. Nee Nee,
                  ich muss feststellen mit 52 Jahren, rattert das Hirn micht mehr so als mit 20 -)))

                  Danke schön für das erste Script mit dem Datum, nur brauche ich ein wenig länger um da wieder durch zu blicken.

                  Da hab ich doch schon die schönsten SQL Statement geschrieben und scheiter an diesem lächerlichen Script.

                  Wäre nett wenn du mir zur Veranschaulichung den Rest mit der IP auch noch posten könntest.

                  Ich muss mir mal wieder einige Abende zum auffrischen gönnen.

                  Gruss und Danke für deine Hilfe liebr Vincenz

                  1. Hallo Thomas,

                    ich muss feststellen mit 52 Jahren, rattert das Hirn micht mehr so als mit 20 -)))

                    ich will doch sehr hoffen, dass mit 52 mein Hirn noch ähnlich rattert wie jetzt - und der Abstand zu 52 ist bei mir kleiner als der zu 20 :-)

                    Ich muss mir mal wieder einige Abende zum auffrischen gönnen.

                    Das ist viel wichtiger. Es ist völlig normal, nach einer längeren Pause auch etwas Zeit und Übung zu benötigen, um wieder in eine Materie einzusteigen.

                    Danke schön für das erste Script mit dem Datum, nur brauche ich ein wenig länger um da wieder durch zu blicken.

                    Da hab ich doch schon die schönsten SQL Statement geschrieben

                    bitte zeigen!

                    Wäre nett wenn du mir zur Veranschaulichung den Rest mit der IP auch noch posten könntest.

                    Hmm, Thomas, eigentlich sind wir hier im SELFHTML-Forum, Du solltest es schon selbst hinkriegen. Aber Weihnachten, das Fest der Liebe naht, da muss ich Dich doch ein wenig unterstützen:

                      
                    // Voraussetzung: Der Text "inet Adresse" kommt in der Datei nur einmal vor,  
                    //                und zwar in der Zeile, die die gesuchte IP-Adresse enthält.  
                    // Überprüfe, ob in der aktuellen Zeile der Text enthalten ist:  
                    // Verwende [link:http://www.php.net/manual/de/function.strpos.php@title=strpos()]  
                    //     int strpos ( string haystack, string needle [, int offset] )  
                    //       Nadel:     "inet Adresse"  
                    //       Heuhaufen: $line (die aktuelle Zeile)  
                    //     Beachte: strpos() gibt die Position an, wo die Nadel gefunden  
                    //              wurde, das kann auch die Position 0 sein.  
                    //              Daher verwende ich den Vergleichsoperator !==  
                    if(strpos($line, "inet Adresse") [link:http://www.php.net/manual/de/language.operators.comparison.php@title=!==] false) {  
                        // Markertext gefunden, extrahiere den richtigen Anteil  
                        //           inet Adresse:84.84.23.34  Bcast:192.168.19.255  
                        // Laut Deinem ersten Posting kann die Zeile führende Leerzeichen haben  
                        // entferne diese mit [link:http://www.php.net/manual/de/function.trim.php@title=trim()]  
                        // Im ersten Schritt wird am Leerzeichen aufgetrennt  
                        $part = explode(" ", trim($line));  
                        //     $part[0]: inet  
                        //     $part[1]: Adresse:84.84.23.34  
                        //     $part[2]: Bcast:192.168.19.255  
                        // Im zweiten Schritt ist $part[1] am Doppelpunkt zu trennen  
                        $ip   = explode(":", $part[1]);  
                        //     $ip[0]:  Adresse  
                        //     $ip[1]:  84.84.23.34    - das gewünschte Ergebnis  
                        $ergebnis['ip'] = $ip[1];  
                        // Hier kannst Du Deinen Durchlauf beenden  
                        [link:http://www.php.net/manual/de/control-structures.break.php@title=break];  
                    }  
                    
                    

                    Bitte kopiere diesen Quelltext nicht einfach, sondern lies bitte die verlinkten Seiten nach und versuche zu verstehen, was Du da machst. Außerdem ist der Code noch optimierbar und eine Fehlerbehandlung könnte auch nichts schaden.

                    Vorweihnachtliche Grüße

                    Vinzenz