Textdatei mit Formular durchsuchen und bestimmte Zeile ausgeben

  • Hallo,


    vorab bin ich froh das es dieses Forum gibt und hoffe das mir hier geholfen werden kann, da ich Anfänger bin.



    Folgende Aufgabe habe ich mir gestellt:



    - es wird eine .TXT erzeugt die dann auf den Server hochgeladen wird


    - auf der Webseite gibt es ein Formular wo eine Bearbeitungsnummer eingegeben wird


    - diese soll dann in der TXT gesucht werden


    - wenn diese gefunden wurde soll eine Ausgabe erscheinen mit der jeweiligen Zeile


    - wenn diese nicht gefunden wird soll eine Fehlermeldung ercheinen


    - Wenn der User die Webseite verlässt soll die Ausgabe gelöscht werden



    Mein aktueller Arbeitsfortschritt:


    Er besteht aus Codeschnipseln die ich im Netz gefunden habe, ich habe
    ein Formular erstellt das die Abfrage regeln soll, die Ausgabe ist durch
    einen Style definiert, ich nutze eine explode Abfrage mit einem Pipe
    als Trenner.



    Meine Probleme:


    Wenn die PHP Datei aufgerufen wird wird sofort alles aus der TXT angezeigt und das Formular funktioniert nicht.



    Hier ist mein Code für die PHP Datei (besteht nur aus einer Datei das Script):



    So sieht die user.txt aus:


    Code
    AGNI6|29.04.2014|in Bearbeitung|Ihr Auftrag ist voraussichtlich am 25.09.2014 fertig|


    Ich hoffe das ich mich verständlich ausgedrückt habe und hoffe das Ihr mir weiterhelfen könnt.

  • So bei deinem Eingabe formular (genauergesagt beim input) sollte der »name« des feldes fest oder bekannt sein.

    HTML
    <input name="inputfeld">

    So etwa wäre gut.


    Dann kannst du nämlich mit

    PHP
    $suchwort = trim( $_POST['inputfeld'] );


    Auslesen was in dem Feld stand. :)


    Danach kannst du damit Arbeiten, da es sich bei deiner Datei um das format »csv« handelt würde ich mit fgetcsv() arbeiten.
    Diese funktion gibt immer eine Zeile aus der Datei weiter und du kannst Damit arbeiten.
    !ACHTUNG! deine Datei hat gerade am Zeilenende immer noch ein » | « -> führt dazu das am Ende nochmal ein leeres Feld ist.. (einfach weglassen wenns nicht beabsichtigt ist ;) )


    Allgemein frage ich mich ob eine Datenbank nicht besser Angebracht wäre -> hängt davon ab wie viele Daten in die Datei sollen (irgendwann wirds sehr langsam) und wie die Datei anderweitig verarbeitet wird.


    Hier mal etwa was du suchst ..

    test.csv

    Code
    847|Erster Kommentar|2014-08-12
    736|Zweiter Kommentar|2014-08-01
    923|Dritter Kommentar|2014-02-22

    Output:

  • Vielen Dank für Deine Antwort, es werden die Dateien mit Deinem Code alle ausgelesen.
    Zwei Fragen ergeben sich aber noch:


    1) Fehlermeldung erscheint beim Aufruf des Scriptes:

    Code
    Notice:  Undefined index: inputfeld in /var/www/clients/client2/web6/web/bearbeitungsstatus/work.php on line 25


    Zeile 25:

    Code
    $suchwort = trim( $_POST['inputfeld'] );


    2) Diese Anweisung verstehe ich nicht, wofür wird der eingetragene Wert benötigt oder muß ich da etwas anderes Eintragen?

    Code
    $suchwort = '736';


    Wenn ich nach z.B.

    Code
    BGRE4

    zeigt er mir an

    Code
    Leider konnte Kein Auftrag unter dieser Nummer gefunden werden.

    der Suchbegriff ist aber vorhanden.


    Den Code habe ich jetzt so verbaut:

  • 1) Das ist keine Fehlermeldung, nur ein Hinweis, dass die Variable nicht gesetzt wurde. Das ist auch vollkommen korrekt, beim ersten Aufruf der Seite KANN das Formular noch gar nicht abgesendet worden sein, dementsprechend gibt es natürlich auch kein POST.
    Zu umgehen wäre das zB mit

    PHP
    if (isset($_POST)) { ...


    2)Der Eintrag ist nur ein Beispiel gewesen und kann einfach entfernt werden. Im Moment übernimmst du den Eintrag aus deinem Formularfeld in die Variable $suchwort, nur um direkt danach $suchwort mit einem festen Wert zu überschreiben. Ergo, ist es im Moment bei dir völlig egal, was der Nutzer ins Suchfeld einträgt.


    3) Im Augenblick wird bei dir nur der erste Abschnitt, also die IDs der Einträge, nach dem Suchwort abgesucht. D.h., falls nach "BGRE4" gesucht wird, muss eine Zeile so aufgebaut sein: "BGRE4|Irgendwas Zuätzliches|Bla bla". Wenn dein BGRE4 in einem anderen Abschnitt (also hinter einer Pipe) steht, wird es nicht gefunden, genauso wenig, wenn der erste Abschnitt ein "57BGRE4G8" wäre. Das würde auch nicht gefunden werden.

  • Vielen Dank für die schnelle Antwort.
    Soweit habe ich endlich das prinzip Dank Euch verstanden.
    Aber bei der Abfrage haut immer noch etwas nicht hin:


    Code
    BGRE4

    ist an erster Stelle ohne Pipe davor, auch am Ende sind keine mehr. Trotzdem zeigt er mir nichts an in der Ausgabe.

    Vielen Dank für die schnelle Antwort.
    Soweit habe ich endlich das prinzip Dank Euch verstanden.
    Aber bei der Abfrage haut immer noch etwas nicht hin:


    Code
    BGRE4

    ist an erster Stelle ohne Pipe davor, auch am Ende sind keine mehr. Trotzdem zeigt er mir nichts an in der Ausgabe.


    Jetzt funktioniert es :) Der Fehler lag bei der Ausgabe da habe ich die Klammern vergessen:
    Falsch:


    Richtig:


    Vielen Dank an Euch beide das Ihr die Zeit und Geduld aufgebracht habt mir zu helfen :thumbup:

  • Sowas fällt einem meist schneller auf, wenn man Editoren mit Syntax Highlighting verwendet. kA mit was du arbeitest, aber Notpad++ oder Sublime Text sind im Moment die Verbreitesten.


    Auch hier im Forum gibts das, da arbeitet man mit den richtigen BB Codes

  • Danke für den Tip, ich nutze Textpad und habe jetzt festgestellt das man dort die Syn. auf PHP umstellen kann.
    Gibt es eine Möglichkeit ein Pipe und ein = in einer Textdatei als Trenner zu nutzen und abzufragen?

  • Also, Pipe ist dieser senkrechte Strich, den du bereits nutzt (nicht, dass wir aneinander vorbeischreiben ^^)
    Da ein = in PHP (und so ziemlich allen anderen Sprachen) für zB Variablenzuweisung und Vergleiche genutzt wird, würde ich vom Benutzen abraten. Such dir ein Zeichen, von dem du dir ziemlich sicher bist, dass es nicht genutzt wird (% ist, glaube ich, noch frei), oder hänge einfach zwei Pipes hintereinander.


    Warum überhaupt, kommt in manchen Texten eine Pipe vor?

  • Dann musst du halt manuell alle = ersetzen oder dies von PHP tun lassen allerdings würde das dazu führen das man den Teil nach dem = halt entweder an das vorhandene array anhängt oder array[0] in zwei teile aufteilt..

  • Wenn das Programm immer ein festes Format ausgibt, dann ist das doch gut.
    Bei
    123456=Test I Testwieder I
    "zerlegst" Du den String eben erstmal beim "="
    und dann bei den "I"


    Eine Möglichkeit (gibt mehrere):


    Ist eine ziemlich statische Methode. Aber wenn das Programm immer das gleiche Format ausgibt, sollte das kein problem sein.
    (Vorrausgesetzt, dass der Inhalt in den Zellen nicht diese Trenner (= und I) enthält.)

  • Sorry das ich mich erst jetzt melde, war kurz angebbunden :)


    leider konnte ich das von cotton nicht umsetzen.
    Meine Frage dazu nochmal wäre, gibt es eine Möglichkeit die Abfrage:



    so zu erstellen das er

    PHP
    while ( ($zeile = fgetcsv($datei, 0, "|")) )

    zuerst sucht und dann z.B.

    PHP
    while ( ($zeile = fgetcsv($datei, 0, "=")) )

    ?


    Dieser Trenner "=" macht mich völlig verrückt.

  • PHP
    function splitString(&$item, $key, $delimiter) {
    	$item = explode($delimiter, $item);
    }
    
    
    
    
    array_walk($zeile, 'splitString', '=');


    Einfach das $zeile-Array einmal durchlaufen und jeweils beim = trennen? Oder wie meinst du?


    Produziert für


    PHP
    $zeile = array('Hallo', 'hier=bin=ich');


    folgende Struktur:

  • Vielen Dank für die Hilfe, isst aber nicht das was ich meinte.
    Es gibt eine Datei (siehe unten) wo zwei verschiedene Trenner drin sind.
    Dank Euch hier im Forum komme ich mit nur einem Trenner klar aber zwei sind bl.... .


    Datei Inhalt:


    Code
    YECXX=YECXX|04.09.2014|in Bearbeitung|voraussichtlich 05.09.14, 18:30|
    G7L7W=G7L7W|04.09.2014|in Bearbeitung|voraussichtlich 05.09.14, 18:30|


    Das = Zeichen ist ein fester Bestandteil so wie die Pipe´s.


    Meine jetzige Abfrage funktioniert nur mit einem Trenner:



    ich möchte aber beide gleichzeitig Abfragen, z.B. so:



    Nur das funktioniert eben nicht.
    Ich hoffe ich habe mich verständlich ausgedrückt.


    Ich möchte jetzt die Suche so ausführen das ich beide Trenner auslesen kann.

  • Die Funktionen geben immer(?) nur das her, wofür sie gedacht/gemacht sind.
    Aber es gibt viele Funktionen (Wege).
    Du wirst aber keine finden, der Du 2 Trennzeichen geben kannst (fällt mir jedenfalls grad keine ein).
    Daher musst Du eben in der Schleife 2 mal Trennen.
    Und das hatte ich schon beschrieben:


    EDIT: Du hast hier btw einige gute Varianten bekommen. Fertigstellen musst du sie aber selbst (Du musst ja auch verstehen was da passiert).

  • Hallo und vielen, vielen Dank.
    Ich habe jetzt die letzten Tage versucht es zum laufen zu bekommen habe aber immer das Problem das er aus der datei nichts ausliest.
    Statisch funktioniert es super:

    Code
    $str = '123456=Test I Testwieder I ';


    ich bekomme es aber trotzdem nicht hin das er die Inhalte aus der Datei übernimmt.
    Ich möchte auch nichts geschenkt haben, wenn jemand Lust hat mir das fertig zustellen zahle ich dafür. Ich habe gemerkt das PHP nicht mein Fall ist und man das lieber den Profis überlassen soll.


    Für die ganze Hilfe hier bin ich mehr als dankbar, aber mir fehlt einfach das nötige Verständnis.

  • Du gibst aber schnell auf :p
    Wer erstellt denn die Datei, in der die Daten "123456=Test I Testwieder I" usw abgelegt werden?
    Wenn Du sie erstellst, dann würd ich sagen: lass uns dort anfangen


    BTW: für etwas zahlen ist immer einfacher und manchmal sinnvoller.
    Könnte aber sein, dass es sich hier nicht "lohnt" (Zeit/Kosten > als Nutzen). Ist aber Ansichtssache.

  • Die Daten werden von einem Kollegen erstellt mit einer Windows Aplikation, darauf habe ich leider keinen Einfluß.
    Aufgeben? Nein ich bin schon unendlich Dankbar über so viele Hilfe hier für mich das es mir schon fast peinlich ist.
    Ich denke man muß halt wissen wo seine Grenzen sind und sollt kostenlose aber wirklich professionelle Hilfe nicht ausnutzen :)


    Wie gesagt es funktioniert alles super wenn eine Zeile in dem PHP Script eingetragen ist (siehe Post von mir davor) ich bekomme es nur nicht hin das die .ini ausgelesen wird.

  • Das ist kein Ausnutzen =)


    Lies Dir das hier mal in Ruhe durch, teste es, ect.
    Es sollte funktionieren. Aber denk daran: Du musst es auch verstehen.
    Bei Fragen immer Fragen!


  • Hallo Leute.

    Ich habe das PHP-Skript für eigene Zwecke modifiziert und möchte eine Änderung bewerkstelligen, doch diese überfordert mich.


    Ich habe die Textdatei um einige weitere Einträge ergänzt, sowie den Code soweit geändert, daß bei fehlendem Inhalt eines Tabelleneintrags sowohl diese als auch die zugehörige Überschrift aufgeblendet werden. Desweiteren wird im Code, wo $result[14] eingetragen wird, dieser Eintrag direkt als Link zu DHL-Tracking ausgeführt.


    Die Änderung die mich überfordert ist der Eintrag des Aktualisierungsdatums der Textdatei.

    Zur Zeit füge ich diese hinter jede einzelne Zeile ein. Somit habe ich mehrere tausende redundante Einträge.

    Ich möchte dies soweit ändern, daß das Aktualisierungsdatum als Kopfzeile, also als erste Zeile in der Textdatei steht.


    Zur Zeit sieht meine Textdatei folgendermaßen aus:

    So soll sie in Zukunft aussehen:

    Wie man sieht, kommt das Aktualisierungsdatum in Zukunft nur ein einziges Mal vor, im Vergleich zur bisherigen Version, wo das Aktualisierungsdatum in jeder Zeile vorkommt.


    Dazu muss das PHP-Skript geändert werden, doch meine Kenntnisse in PHP reichen für eine solch größere Änderung nicht aus.

    Hier ist mein Skript und ich werde mich sehr freuen, wenn mir jemand Hinweise gibt, wie ich nur die erste Zeile aus dem parsenden code herausnehmen kann. Es ist also $result[15], welches aus der ersten Zeile gebildet wird.


    Hier noch mein modifizierter Code und ein Bild der Ausgabe:

    Am liebsten wäre mir eine Ergänzung des eingestellten Codes, denn meine Kenntnisse sind wirklich vollkommen anfängerhaft, aber auch hilfreiche und nicht zu komplizierte Hinweise sind willkommen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!