Beliebige Zeilen aus Textdatei löschen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Beliebige Zeilen aus Textdatei löschen

    Hallo Zusammen,

    es handelt sich bei dieser Geschichte um ein Link-Formular, um Internetadressen/Links mit einem Namen zu verstehen und über eine Textdatei zu archivieren. - Das klappt auch alles, bis auf das löschen und die Einträge nach oben rutschen. Denn dann kann ich die Zeilen vor der angesprochenen ID (wenn dieser höher liegt) nicht mehr entfernen.

    PHP-Code:
    <?php

    $datei 
    "../textdata/thema.txt";
    $array file("../textdata/thema.txt");
    $linkname2 $_POST["linkname2"];
    $id $_GET["id"];
    $id--;

    unset(
    $array[$id]);
    file_put_contents("../textdata/thema.txt",$array);
    // header("location: ../index.php?act=del");


    ?>
    Nachfolgend der Code, der die Zeile ans Ende der Textdatei "Thema.txt" schreibt, wenn beide Einträge wahr sind. Anschließend wird zur Weiterverarbeitung in die index.php zurückverlinkt.

    PHP-Code:
    <?php

    $datei 
    "../textdata/thema.txt";
    $linkname2 $_POST["linkname2"];
    $url2$_POST["url2"];      
    $id sizeof(file($datei));
    $id++;

    if (
    $linkname2 and $url2)
    {
    $fp fopen($datei,"a");
    $add '<a href="'.$url2.'" target="_blank">'.$linkname2.'</a>'.'<a href="phpdata/link_entf.php?id='.$id.'" style="color:darkred" title="löschen">[x]</a>'."\r\n";
    fwrite($fp,$add);
    header("location: ../index.php?send=link");
    }
    Die "Thema.txt" sieht so aus:

    HTML-Code:
    <a href="link" target="_blank">Eintrag 1</a> <a href="phpdata/link_entf.php?id=1" style="color:darkred" title="löschen">[x]</a>
    <a href="link" target="_blank">Eintrag 2</a> <a href="phpdata/link_entf.php?id=2" style="color:darkred" title="löschen">[x]</a>
    <a href="link" target="_blank">Eintrag 3</a> <a href="phpdata/link_entf.php?id=3" style="color:darkred" title="löschen">[x]</a>
    Mein Problem:

    Wenn Eintrag 1 und 2 gelöscht werden und der Eintrag 3 als letztes in der Textdatei steht, kann diese Zeile nicht mehr gelöscht werden, da ich ja versuche über die Array-ID die Zeile anzusprechen. Diese hat aber die "ID 3"! Das Array kann nichts in Zeile 4 finden $array[$id] = $array[3]. Ok, ist ja klar.

    Ich habs mal mit sizof versucht und dann die Summe des Array mit der ID irgenwie zu addieren oder subtrahieren, um iwie auf den ersten Platz zu kommen^^ Ich verzweifel gerade daran und hoffe auf Eure einsichtige Hilfe.

    LG Dennis

  • #2
    Mit $array[$id] = '' statt unset($array[$id]) bliebe die Zuordnung "Zeilennummer = ID" erhalten. Aber der ganze Ansatz ist Mist! Speichere die Links als serialisiertes Array in der Datei, dann wird alles ganz einach. ;-)

    Kommentar


    • #3
      Mist... aha!
      Hat mich aber ein Haufen Zeit gekostet ^^

      Ich mach mich dann mal auf die Suche nach dem Begriff "serialisiert". Das sagt mir nämlich überhaupt nix.

      Kommentar


      • #4
        serialize

        Kommentar


        • #5
          Ich kenne php.net danke... aber ich muss jetzt herausfinden wie ich eine Repräsentation (einen vertretbaren Wert - so wie ich es jetzt verstanden habe) auf mein Problem anwende.

          Kommentar


          • #6
            Watt is?

            Vielleicht hilft dir das hier:
            PHP-Code:
            $links unserialize(file_get_contents($datei));
            unset(
            $links[$id]);
            file_put_contents($dateiserialize($links)); 

            Kommentar


            • #7
              Ja bestimmt.. aber solange ich nicht dahinter komme was genau da passiert, nützt mir das gar nichts wenn ich mit serialize() / unserialize() arbeiten möchte. Ich habe das Gefühl, wenn ich das verstehe kann ich viele meiner Arbeitsschritte erleichtern sogar verkürzen. Ich möchte halt - sobald ein neuer Befehl auftaucht - diesen dann auch verstehen ohne einfach nur Copy&Paste anzuwenden aber ich werde das mal einbauen und schauen was passiert.

              EDIT:

              Nach dem Ausführen passiert folgendes: Inhalte werden gelöscht und zurück bleibt "b:0;".
              Davon habe ich gerade was im Netz aufgeschnappt und bei php.net
              Muss mal weiter Recherche betreiben was die Zeichen bedeuten.
              Ich vermute mal darin sind jetzt die Inhalte der Textdatei verborgen, also wurden serialisiert / vertretbar gemacht?
              Zuletzt geändert von dolbyfreak; 20.11.2010, 18:02.

              Kommentar


              • #8
                Uii... das wird jetzt spannend
                also mal von vorn... für's Verständnis.

                PHP-Code:
                $array file("../textdata/thema.txt");
                $links serialize($array);
                print_r$links); 
                PHP erzeugt jetzt:

                HTML-Code:
                a:3:{i:0;s:129:"Eintrag 1 [x]
                ";i:1;s:129:"Eintrag 2 [x]
                ";i:2;s:127:"Eintrag 3 [x]";}
                Im Quelltext:
                HTML-Code:
                a:3:{i:0;s:129:"<a href="link" target="_blank">Eintrag 1</a> <a href="phpdata/link_entf.php?id=1" style="color:darkred" title="löschen">[x]</a> 
                ";i:1;s:129:"<a href="link" target="_blank">Eintrag 2</a> <a href="phpdata/link_entf.php?id=2" style="color:darkred" title="löschen">[x]</a> 
                ";i:2;s:127:"<a href="link" target="_blank">Eintrag 3</a> <a href="phpdata/link_entf.php?id=3" style="color:darkred" title="löschen">[x]</a>";}
                129 Zeichen, 127 Zeichen??
                Die Zeilen sind doch optisch gesehen genau gleich lang? Wo sind denn die restlichen 2 Zeichen? Ist das vielleicht der Umbruch?

                Wie kann ich jetzt die serialisierten Strings "i:0, i:1, i:2" ansprechen, um auf meine Zeile zu kommen? Mit

                PHP-Code:
                preg_match("/i:o/",$links); 
                haut es jedenfalls nicht hin, wenn ich es z.B. mit einer "if-Abfrage" suchen will..
                Zuletzt geändert von dolbyfreak; 20.11.2010, 19:30.

                Kommentar


                • #9
                  Ich hab das Beispiel von oben mal auseinandergenommen, damit ich mal bei der Ausgabe sehe was passiert:

                  PHP-Code:
                  $datei "../textdata/thema.txt";
                  $links unserialize(file_get_contents($datei));
                  print 
                  serialize($links); 
                  Ausgabe:
                  HTML-Code:
                  b:0;
                  PHP-Code:
                  $datei "../textdata/thema.txt";
                  $links unserialize(file_get_contents($datei));
                  print 
                  serialize($links[0]); 
                  Ausgabe:
                  PHP-Code:
                  N
                  PHP-Code:
                  $datei "../textdata/thema.txt";
                  $links serialize(file_get_contents($datei));
                  print 
                  "<pre>";
                  print 
                  $links
                  Augsabe:
                  HTML-Code:
                  s:385:"Eintrag 1 [x]
                  Eintrag 2 [x]
                  Eintrag 3 [x]";
                  Also ich weiß ehrlich gesagt nicht wie mir das jetzt weiterhelfen soll
                  War meine Überlegung denn richtig mit den ganzen Zahlen was zu versuchen? Also mit "i:0, i:1, i:2" ?

                  Kommentar


                  • #10
                    129 Zeichen, 127 Zeichen??
                    Die Zeilen sind doch optisch gesehen genau gleich lang? Wo sind denn die restlichen 2 Zeichen? Ist das vielleicht der Umbruch?
                    Optisch gesehen sind sie eben nicht genau gleich lang. Zumal die ersten beiden Einträge über zwei Zeilen gehen, wodurch wir eben tatsächlich bei den von dir vermuteten Zeilenumbrüchen sind.

                    b:0;
                    b=bool, in dem Fall: 0=false

                    <a href="link" target="_blank">Eintrag 3</a> <a href="phpdata/link_entf.php?id=3" style="color:darkred" title="löschen">[x]</a>
                    Warum speicherst du nicht nur URL und Titel in der Datei?

                    Wie kann ich jetzt die serialisierten Strings "i:0, i:1, i:2" ansprechen, um auf meine Zeile zu kommen?
                    Autsch, du sollst doch nicht an den serialisierten Strings rumfummeln!!! Du sollst am daraus resultierenden (unserialize) Array rumdocktern. Onemorenerd hatte dir da sogar schon den fertigen Code gepostet!

                    $links = unserialize(file_get_contents($datei));
                    print serialize($links);
                    Was soll das bringen???

                    Du hast schon verstanden, dass das serialisierte(!) Array in der Datei gespeichert werden soll!?!

                    Kommentar


                    • #11
                      Ich denke wir reden hier aneinander vorbei.... Ich verstehe immer noch nicht was das ganze eigentlich mit meinem Problem zu tun haben soll? Mit dem $array[$id] lösche ich gezielt meine Zeilen. Sobald aber eine Zeile mit z.B. einer id=3 als letztes in der Textdatei stehen bleibt kann ich die nicht mehr über den Link löschen, weil der ja die vierte Zeile löschen will. Die gibts aber nicht... wie soll jetzt das ganze über serialisierte Arrays funktionieren, wenn es doch so schon nicht klappt?

                      So wie ich es jetzt verstanden habe konvertiert serialize() das Array in einen String um und unserialize() wieder zurück.... und wenn ich das mit file_put_contents() wieder so mache wie es oben beschrieben wurde, also so hier:

                      Der Code von oben:
                      PHP-Code:
                      $datei "../textdata/thema.txt";
                      $links unserialize(file_get_contents($datei));
                      unset(
                      $links[$id]);
                      file_put_contents($dateiserialize($links)); 
                      Erzeugt die Ausgabe:
                      HTML-Code:
                      b:0;
                      Wie soll mir das denn jetzt weiterhelfen? Xampp speichert auch nichts wie es $_SESSION() macht im TMP Ordner ab. Wo bitteschön sind die Inhalte der Textdatei und wie kann ich das jetzt weiterverwerten geschweige mein Problem damit lösen? Nennt mir doch bitte mal einen Lösungsweg den ich weiter verfolgen kann^^

                      Kommentar


                      • #12
                        1) Alles was mit serialize zu tun hat:

                        die serialisierten Arrays sind nur eine Vereinfachung. Das hat onemorenerd dir aber auch gesagt!
                        Der Code von oben:
                        $datei = "../textdata/thema.txt";
                        $links = unserialize(file_get_contents($datei));
                        unset($links[$id]);
                        file_put_contents($datei, serialize($links));
                        Erzeugt die Ausgabe:
                        b:0;
                        Dann machst du etwas falsch! Der Code sollte gar keine Ausgabe erzeugen!
                        Xampp speichert auch nichts wie es $_SESSION() macht im TMP Ordner ab.
                        Häh? Was spielt das nun für eine Rolle?
                        Wo bitteschön sind die Inhalte der Textdatei und wie kann ich das jetzt weiterverwerten geschweige mein Problem damit lösen?
                        Die Inhalte der Textdatei sind hoffentlich in serialisierter Form dort vorhanden, ansonsten brauchst du gar nicht weiter zu probieren. Wenn deine Datenbasis schon korrupt ist, dann wunder dich bitte nicht, dass der Rest nicht funktioniert!



                        2) Aber bleiben wir ruhig näher an deinem Problem:

                        Mit dem $array[$id] lösche ich gezielt meine Zeilen.
                        Das klingt gut.
                        Sobald aber eine Zeile mit z.B. einer id=3 als letztes in der Textdatei stehen bleibt
                        Stopp! Wieso und woher haben die Zeilen in deiner Datei IDs? Das zeig mal bitte an einem Beispiel.
                        kann ich die nicht mehr über den Link löschen, weil der ja die vierte Zeile löschen will. Die gibts aber nicht...
                        Wer will, warum die vierte zeile löschen? Warum erstellst du einen Link zum löschen der vierten Zeile, wenn es doch gar keine mehr gibt?

                        Nennt mir doch bitte mal einen Lösungsweg den ich weiter verfolgen kann^^
                        Du hast jetzt infos zu beiden Lösungswegen. Entscheide dich für einen und dann behandeln wir den hier ausführlich. Dafür beantwortest du bitte alle Fragen und Kommentare zur entsprechenden Variante (1 oder 2). Und zwar nur die! Dann bekommen wir auch wieder Struktur hier rein.

                        Kommentar


                        • #13
                          HTML-Code:
                          Dann machst du etwas falsch! Der Code sollte gar keine Ausgabe erzeugen!
                          Falsch erklärt... erzeugt auch nichts im Browser, aber in der Textdatei ist dieser Boolwert zu finden.

                          HTML-Code:
                          Stopp! Wieso und woher haben die Zeilen in deiner Datei IDs? Das zeig mal bitte an einem Beispiel.
                          Ähm.. nun ja, schau doch bitte mal oben die Textdatei an. Die URLs enden doch alle mit einer ID! -> ?id=0...3 Das habe ich damit gemeint.

                          HTML-Code:
                          Wer will, warum die vierte zeile löschen?
                          Mit der Aussage habe ich jetzt verstanden das mich keiner verstanden hat xD. Daher frage ich jetzt mal, hat jemand, vielleicht du Tobias mein Problem, also mein eigentliches Problem verstanden?

                          Ich erkläre es noch einmal:

                          In der Textdatei werden Links erzeugt, bzw. abgespeichert sobald über ein Formular diese mit Namen und URL eingegeben werden. Diese Links besitzen alle einen Löschlink, worüber man die Zeilen wieder entfernen kann. Jedenfalls möchte ich das gern so haben. Ich habe daher auch mehr als nur die URL und den Linknamen mit in die Datei eintragen lassen.

                          In PHP lade ich die Textdatei in ein Array und spreche die Zeilen über die Löschlinks und deren IDs mit Hilfe von $_GET["$id"] und $array[$id] direkt an und lösche sie per Mausklick.

                          Jetzt mein Problem: Sobald nur noch eine Zeile vorhanden ist mit sagen wir mal einer ID 5 <a href="?id=5">, dann sucht das Programm in der Textdatei die Zeile 6.... wie auch immer. Jedenfalls gibt es keine 6. Zeile in der Textdatei, weil alle Zeilen ja bis auf die erste schon gelöscht wurden und hier nur noch auf 0 reagiert werden kann, dort wo die 1 Zeile steht. Klar soweit?

                          Ich hab es mal mit einer if-Abfrage versucht, so dass das Programm reagieren soll wenn sizeof(file("textdatei.txt")); z.B. kleiner ist und mit den ID-Werten vergleicht werden kann. Aber das führt auch zu keiner Lösung. Sobald die IDs höher sind macht es keinen Sinn. Pfff.. das ist doof zu erklären

                          Es kann sein das ich das verkompliziere, aber nur so finde ich lernt man aus seinen Bemühungen es zu verstehen. Hinterher kann man alles ganz anders machen. Natürlich bin ich für andere Lösungswege offen, nur möchte ich erst einmal einen Weg verstehen!

                          Ich hoffe das es jetzt verständlich rüberkommt was ich eigentlich will. Und wenn mit serialize mein Problem gelöst werden kann, bin ich gern bereit das zu lernen


                          EDIT:

                          Mir fällt gerade ein, wenn ich die Zeile beim entfernen der Einträge/Links nicht lösche, dann müsste das was ich vorhabe funktionieren oder? Weil das Programm so aus den Zeilen lesen kann,weil sie vorhanden bleiben. Ich hab mal folgendes versucht:

                          PHP-Code:
                          file_put_contents("../textdata/thema.txt",$array."HIER EIN UMBRUCH \n" ); 
                          Da löscht er mir aber komplett alles und gibt Array aus... ist verständlich. Da kann ich auch kein Umbruch einbauen.
                          Ich probier das mal mit fopen.. quak, das funzt auch net.. ich kann den Dateizeiger ja nur an Anfang oder Ende setzen.
                          Och menno

                          EDIT
                          Zuletzt geändert von dolbyfreak; 21.11.2010, 03:19.

                          Kommentar


                          • #14
                            Doch, ich glaube verstanden haben wir dich beide. Das "Problem" ist nur, dass wir aus gewohnheit weiterdenken und uns ungerne mit Halblösungen zufrieden geben. Du hast halt noch einige Fehler in deinem Vorhaben, die wir gerne auslöschen würden.

                            In der Textdatei werden Links erzeugt, bzw. abgespeichert sobald über ein Formular diese mit Namen und URL eingegeben werden. Diese Links besitzen alle einen Löschlink, worüber man die Zeilen wieder entfernen kann. Jedenfalls möchte ich das gern so haben. Ich habe daher auch mehr als nur die URL und den Linknamen mit in die Datei eintragen lassen.
                            Die Tatsache, dass du den Löschlink (samt Markup) in die Datenbasis speicherst ist nicht nur ungewöhnlich sondern auch ziemlicher unfug. Irgendwann willst du die Links mal anpassen, oder mal nicht anzeigen, oder oder oder. Das Wort Datenbasis heißt nicht umsonst DATEN-Basis. (Dir zur liebe - zumindest kurzfristig - werden wir dies jetzt ignorieren und weitermachen)

                            In PHP lade ich die Textdatei in ein Array und spreche die Zeilen über die Löschlinks und deren IDs mit Hilfe von $_GET["$id"] und $array[$id] direkt an und lösche sie per Mausklick.
                            Soweit okay. Sofern du dich auf den Code im Eingangsposting beziehst, klappt das aber nur, wenn du jeweils den letzten Link löschst, oder einmalig, wenn du einen beliebigen anderen Link löschst. Weil du beim löschen eine inkonsistente Datenbasis erzeugst. (Tja, da wären wir schon wieder beim Thema )

                            Jetzt mein Problem: Sobald nur noch eine Zeile vorhanden ist mit sagen wir mal einer ID 5 <a href="?id=5">, dann sucht das Programm in der Textdatei die Zeile 6.... wie auch immer. Jedenfalls gibt es keine 6. Zeile in der Textdatei, weil alle Zeilen ja bis auf die erste schon gelöscht wurden und hier nur noch auf 0 reagiert werden kann, dort wo die 1 Zeile steht. Klar soweit?
                            Wie gesagt, du hast die Inkonsistenz selbst verursacht, darfst dich also nicht wundern. Deinen Code musst du spätestens jetzt über den Haufen werfen und statt dessen das komplette $array durchlaufen und für Zeile mittels einer entsprechenden funktion (z.b. strstr) überprüfen, ob diese gelöscht werden soll. (Ich würd mir das noch mal überlegen, mit der Datenbasis)

                            Ich hab es mal mit einer if-Abfrage versucht, so dass das Programm reagieren soll wenn sizeof(file("textdatei.txt")); z.B. kleiner ist und mit den ID-Werten vergleicht werden kann. Aber das führt auch zu keiner Lösung. Sobald die IDs höher sind macht es keinen Sinn. Pfff.. das ist doof zu erklären
                            Ich versteh kein Wort! Klingt aber auch nicht sinnvoll!

                            Es kann sein das ich das verkompliziere, aber nur so finde ich lernt man aus seinen Bemühungen es zu verstehen. Hinterher kann man alles ganz anders machen. Natürlich bin ich für andere Lösungswege offen, nur möchte ich erst einmal einen Weg verstehen!
                            Dann los!

                            Ich hoffe das es jetzt verständlich rüberkommt was ich eigentlich will. Und wenn mit serialize mein Problem gelöst werden kann, bin ich gern bereit das zu lernen
                            Kann es, aber jetzt haben wir den anderen Weg gewählt. Ist okay so.

                            Kommentar


                            • #15
                              Ok.. totale Inkonsistenz^^
                              Wat nu? Wie soll ich denn jetzt vorgehen? Ich beginne mal damit die Textdatei vom übrigen Markup zu befreien und ihn bei der Ausgabe einzutragen.

                              EDIT: hmm.. würde ja dann so aussehen, die Textdatei:

                              HTML-Code:
                              1|Linkname 1|URL 1
                              2|Linkname 2|URL 2
                              3|Linkname 3|URL 3
                              ... wäre das denn in dieser Fassung kein Unfug mehr? Ich kann ja bei der Ausgabe das jeweilige Array nutzen.
                              Zuletzt geändert von dolbyfreak; 21.11.2010, 03:40.

                              Kommentar

                              Lädt...
                              X