Beliebige Zeilen aus Textdatei löschen

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

  • #46
    Hab mir mal was anderes ausgedacht. Ich lasse jetzt Textdateien einzelnd automatisch erstellen... wie wäre es denn dann, wenn ich diese direkt über eine Schleife ausgeben könnte. Vielleicht mit readfile, include, file_get_contents in der Bedingung der Schleife? Ich hatte ein wenig Erfolg mit readfile und include gehabt, aber leider nur mit dem ersten Array. Die weiteren blieben unberrührt.

    PHP-Code:
    $links glob("textdata/links/*.*");

    echo 
    '<pre>';
    for(
    $x=0$x<count($links[0]); $x++) {

    print_r ($links);


    Ausgabe:

    HTML-Code:
    Array
    (
        [0] => textdata/links/link0.txt
        [1] => textdata/links/link1.txt
        [2] => textdata/links/link2.txt
        [3] => textdata/links/link3.txt
    )
    und mit readfile() oder include() kam das heraus:

    Der Eintrag "link 1[x]" im Quelltext:

    HTML-Code:
    <a href="link" target="_blank">link 1</a><a href="phpdata/link_entf.php style="color:darkred" title="löschen">[x]</a>
    HTML-Code:
    link 1[x]
    Array
    (
        [0] => textdata/links/link0.txt
        [1] => textdata/links/link1.txt
        [2] => textdata/links/link2.txt
        [3] => textdata/links/link3.txt
    )
    link 1[x]
    Ne Idee wie man den Unfug so hinbekommt, dass ich die Inhalte der Textdateien ausgeben lassen kann? Das wäre so geil wenn das klappen könnte. Ich hoffe das es jemand lösen kann.

    Cheers

    Kommentar


    • #47
      Neustart

      Jetzt wird es langsam Zeit, alles über Bord zu werfen, was du bisher aufgetischt hast. Denn deine bisherigen Ansätze sind allesamt zu kompliziert, ungeeignet oder fehlerträchtig.

      Du hast bereits einige Hinweise bekommen, wie du es besser machen könntest. Jedoch hast du keinen davon verstanden und umsetzen können. Offenbar liegt es an deinen mangelhaften PHP- oder allgemeinen Programmierkenntnissen. Deshalb erkläre ich es jetzt mal ganz detailliert.

      Du willst eine Linkliste pflegen. Bisher speicherst du dazu fertige HTML-Links. Das ist schon mal schlecht. Das ändern wir jetzt. Wir speichern jetzt stattdessen nur die URLs und Linknamen.
      Dafür überlegen wir uns eine geeignete Datenstruktur. Die sieht so aus:
      Code:
      array('url' => <URL>, 'name' => <Name>)
      Weil wir mehrere Links speichern wollen, brauchen wir einen Container für eine beliebige Anzahl solcher Links/Arrays. Der sieht so aus:
      Code:
      array(
          0 => array('url' => <URL>, 'name' => <NAME>),
          1 => array('url' => <URL>, 'name' => <NAME>),
          ...
          n => array('url' => <URL>, 'name' => <NAME>),
      )
      Praktischerweise hat in diesem Container/Array jeder Eintrag gleich eine ID, nämlich den Key links vom "=>". Diese ID werden wir später fürs Löschen benutzen.

      Nun brauchen wir eine Möglichkeit, diesen Container in einer Datei zu speichern. Da man Arrays nicht direkt in eine Datei schreiben kann, müssen wir den Container mit serialize() in einen String umwandeln. Zum Speichern verwenden wir also folgenden Code:
      PHP-Code:
      file_put_contents(serialize($container), $filename); 
      Um die so gespeicherten Daten wieder aus der Datei zu lesen, benutzen wir folgenden Code:
      PHP-Code:
      $container unserialize(file_get_contents($filename)); 
      Weil das Lesen und Schreiben der Daten immer wieder an verschiedenen Stellen in deinem Script gemacht werden muss, legen wir uns dafür Funktionen an:
      PHP-Code:
      function write($container$filename) {
          
      file_put_contents(serialize($container), $filename);
      }

      function 
      read($filename) {
          
      $container unserialize(file_get_contents($filename));
          return 
      $container;

      Jetzt sind wir schon so weit, dass wir die Linkliste anzeigen können:
      PHP-Code:
      $filename '/pfad/zur/datei.ser';
      $links read($filename);
      foreach (
      $links as $id => $link) {
          
      // der Link selbst
          
      echo '<a href="'$link['url'] .'">'$link['name'] .'</a>';
          
      // ein Link zum Löschen dieses Links
          
      echo '<a href="'PHP_SELF .'?action=delete&id='$id .'">löschen</a>';
          echo 
      '<br />';

      Wie du siehst, wird zum Löschen eines Links das gleiche Script mit dem GET-Parameter action=delete aufgerufen und die ID des zu löschenden Links übergeben. Bauen wir uns also den Code fürs Löschen:
      PHP-Code:
      if (isset($_GET['action']) && $_GET['action'] == 'delete') {
          
      $links read($filename);
          if (isset(
      $_GET['id'], $links[$_GET['id']]) {
              
      // Löschen des Links aus dem Container
              
      unset($links[$_GET['id']);
              
      // veränderte Daten zurück schreiben in Textdatei
              
      write($links$filename);
          }

      Das war auch schon alles. Ich überlasse es dir, die gezeigten Codeschnipsel in der richtigen Reihenfolge zu einem Script zusammen zu setzen.
      Außerdem solltest du die Funktionen read() und write() erweitern, so dass sie auch dann korrekt arbeiten, wenn die Datei $filename nicht existiert, nicht les- bzw. schreibbar ist. Überlege dir dafür, wie du diese "Fehler" erkennst (file_exists() u.ä.) und wie du darauf reagierst.

      Solltest du nun immer noch Probleme haben, poste bei deinem nächsten Beitrag bitte den relevanten Code deines Scripts, damit wir nachvollziehen können, wie dein Stand ist.

      Kommentar


      • #48
        Geht klar... ich nehm mir das vor, sobald ich wieder Zeit habe! Danke für die detaillierte Erklärung! Das wird bestimmt interessant werden.. freu mich schon drauf

        LG

        Kommentar


        • #49
          Moin Zamme! Bin gerade von der Probe zurück und mach mich jetzt hier mal an die Arbeit.

          Mal vorab ein Statement von mir!

          Ich hab bisher noch nicht angefangen, dafür aber die Idee näher angeschaut. Ihr müsst mich entschuldigen wenn, ich nochmal in die Basics abschweife, aber es gilt Löcher zu stopfen! Was ich überhaupt noch nicht so richtig nachvollziehen kann ist folgendes:

          - Funktionen im allgemeinen (hier: write, read, etc.)
          - return
          - foreach-Schleife
          - isset()^^
          - serial-/unserialize

          Funktion... tja, da weiß ich so gut wie gar nichts darüber. Darum versuche ich es mal selbst zu erklären:

          PHP-Code:
          function read($filename
          Ich nehme mal an die Funktion read() wird nur dann in Betracht gezogen, wenn $filename wahr ist, bzw. existiert. Und wenn die Bedingung wahr ist, werden die Aufgaben in den geschweiften Klammern ausgeführt. Im Nachhinein kann man dann immer auf die Funktion zurückgreifen, um nicht dauernd den Code auf's neue zu beginnen, ist das in etwa richtig? Was würde passieren wenn die Bedingung nicht ausführbar ist weil z.B. der Inhalt der Var nicht existiert oder in diesem Fall der Pfad zur Datei fehlerhaft ist. Gibt das eine Serverfehlermeldung zurück mit Hinweis zur Zeile?

          Ist es auch richtig das Funktionen beliebig benannt werden können wie in etwa die Variablen? Also ist write und read ein Produkt der Eigenkreation?

          PHP-Code:
          return 
          Ein Sprachprodukt laut php.net.. übergibt den Parameter als Rückgabewert der Funktion. Verstehe ich jetzt nur halb und halb. Die Klammern können also weggelassen werden? Wie sieht so ein Fall aus? Ist das vielleicht in ähnlicher Weise mit exit; zu vergleichen? Nur das exit; nichts mehr zurückgibt? Ich hab das mal bei HTML/Javascript aufgeschnappt (return false). Hat aber damit nichts zu tun oder?

          PHP-Code:
          foreach ($links as $id => $link
          Die Schleifen-Funktion habe ich mir jetzt mal näher angeschaut. Die erste Variable ist - ich weiß nicht ob das stimmt - "immer?" der Container für die Inhalte und die zweite Var speichert, bzw. hat bereits schon den Inhalt - der evtl. schon vorher definiert wurde - enthalten. In unserem Fall sind es die IDs an den Löschlinks, die ja mit den Zahlen im Array verglichen werden, richtig?

          PHP-Code:
          isset() 
          Prüft, ob eine Variable existiert und ob sie nicht NULL ist...
          Jo, das leuchtet mir ein. Ich stolpere allerdings ständig über den Vergleich von if($var == true) und if(isset($var))
          Das scheinen aber beides verschiedene Welten zu sein. Bei dem ersten Vergleich ist es wie bei einer Session wenn man z.B. so etwas hat:

          PHP-Code:
          if ($user == $Benutzername and $Passwort == $pwd) { // hier hab ich das dumme Gefühl das da ein isset() reingehört!?
          $_SESSION["login"] = true
          }
          if (
          $_SESSION["login"] == true// die ist gemeint! 

          und bei isset()

          PHP-Code:
          if (isset($var)) {
              echo 
          "Die Variable ist gesetzt, also wird etwas ausgegeben.";

          Wann wird es entscheidend die richtige Wahl zu treffen? Ich habe bisher immer ohne die isset() Funktion gearbeitet. Kann man isst() am besten für die Passwort/Benutzerabfrage verwenden? Also z.B. so ausgedrückt isset wenn User falsch print rote Schrift else grüne Schrift und isset wenn Passwort falsch print rote Schrift else grüne Schrift.. klingt doof, aber so ist es schnell erklärt

          Dient nur zur Erklärung! Aussehen soll das so hier - wäre hier isset() wichtig? (Beispiel Username):

          PHP-Code:

          <?php if ($_GET["check"] == "login")   { 
          if (
          $user == $Benutzername and $pwd != $Passwort) { 

          echo 
          '<font color="green">Benutzername korrekt!</font>'

          }else{ 
                 echo 
          '<font color="red">Benutzername: </font>';  }
          }else{
                 echo 
          "Benutzername";

          ?>

          PHP-Code:
          file_put_contents(serialize($container), $filename); 
          Hier habe ich schon ganz gute Erkenntnisse gesammelt. serialize() wandelt also ein oder mehrere Arrays in einen String, Zeichenkette um? Das was ich vorher in diesem Posting versucht habe zu verstehen.. also dieses b:0; was nach der Ausgabe in der Textdatei zu finden war. Das war aber völliger Unsinn, weil das ganze im Code stattfindet, bzw. wird das "virtuell gesehen" im Array abgelegt und kann bei einer Ausgabe mit unserialize(); wiederhergestellt werden, korrekt?

          Im ganzen hab ich verstanden, dass man mit Hilfe der Funktionen Arbeitsschritte, bzw. den Code verkürzen / übersichtlicher machen kann. In unserem Fall muss dann nicht dauernd - na ja, 2x read und 1x write mit der Funktion serial-/unserialize für den Container geschrieben werden. Aber würde natürlich auch ohne die Funktionen: write und read funktionieren, richtig?

          Was mir allerdings unklar ist: => $link)
          Hmm.. bedeutet das vielleicht gleichgrößer oder ist das wieder so ein Zeichen wie aus einem Array (aus der print_r-Ansicht)?

          grrrr.. jetzt ist mir schon zu spät, um mit dem proggen anzufangen
          morgen gehts dann los... es ist mir ja auch wichtig das ganze zu kapieren und nicht nur copy&past anzuwenden. Sondern ich will ja auch mal selbst drauf losschreiben können. Bei vielen Sachen klappt das schon ganz gut, aber das ist untere Schublade

          Wünsch was!
          und danke für diese tolle Idee nochmal!
          Zuletzt geändert von dolbyfreak; 23.11.2010, 00:49.

          Kommentar


          • #50
            Auweia, deine PHP-Kenntnisse sind viel geringer als ich annahm. Mehr als Variablen ausgeben kannst du scheinbar nicht.
            Das ist nicht schlimm, jeder hat mal angefangen. Aber bitte hör auf, dir selbst einen Reim zu machen! Lies PHP: Language Reference - Manual, Anfängertutorials oder ein gutes Fachbuch! Und immer alles ausprobieren …

            Kommentar


            • #51
              Lecker Lektüre!! Schau ich mir an.. thx!
              Ja ich bin noch nicht so super darin.. aber das kommt hoffentlich noch. Schön Piano arbeiten, dann wird das auch was.

              Uii.. ich hab 2 Fehler in deinem Skript gefunden.. eine runde und eine eckige Klammer hat gefehlt

              Sind anfangs bevor der Code überhaupt ausgeführt wird Informationen in der Textdatei gespeichert? Ich verstehe gerade nicht wo das Array hin soll in den Code oder in die Datei? Ich nehme mal an in die Datei... weil der container ja mit unserialize geladen wird.. aber mit print_r() bekomme ich keine Inhalte angezeigt! Warum?
              Zuletzt geändert von dolbyfreak; 23.11.2010, 18:45.

              Kommentar


              • #52
                Ich bitte um Hilfe.. komme nicht weiter mit dieser for-Schleife Aber die Idee ist super. Ich hab es in einer anderen Art und Weise ohne serialize und mit der vereinfachten for-Schleife probiert, da funzt es. Aber ich würde gern diese Version lernen, bzw. nutzen. Warum bekomme ich nichts ausgegeben?? Auch wenn ich die Funktion an das ? hänge, bekomme ich keine Ausgabe

                Kommentar

                Lädt...
                X