eine Zeile in datei überschreiben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • eine Zeile in datei überschreiben

    Hallo zusammen,

    ich kämpf jetzt gerade neben mysql für die "großen" Sachen mit dateien durch... z.B. für die signaturen, da jede bis zu 2000 zeichen lang sein darf... in der datei hat jeder user eine zeile, die seiner id... ich krieg das jetzt schon hin, dass es aus der richtigen zeile ausgelesen wird, allerdings nicht, dass wenn sie bearbeitet wird, in dieser zeile eingesetzt wird...

    Quellcode

    1. $handle = fopen ( "data/templates/inhalt/signatur.txt", "a" );
    2. $file_array[$user_id] = $handle;
    3. fwrite ( $handle, $file_array );
    4. fclose ( $handle );
    5. exit;


    das is das, was ich bisher zum neu reinschreiben hab... ja, kann schon sein, dass mich jez der ein oder andere dafür fressen könnte:D, aber ich hoffe trotzdem auf eure hilfe;)

    LG

    Fipsi
  • Du könntest uns mal den Code zeigen, den du zum Auslesen der Signaturen benutzt.
    Ansonsten musst du den Dateiinhalt erst einmal vollständig auslesen, dann nach der entsprechenden Stelle suchen (in Array schreiben, anhand eines Trennzeichens), das entsprechende Feld verändern und alles wieder in die Datei schreiben (überschreiben).
    Ich gehe mal davon aus, dass du folgendes Format verwendest:

    Quellcode

    1. //Id;Signatur;irgend was anderes;bla;\n // Zeilenumbruch
    2. 1;Das ist eine Testsignatur;foo;bar
    3. 2;Noch eine Signatur;foobar;blubb

    Hier mal ein bisschen PHP-Code (ungetestet):

    Quellcode

    1. <?php
    2. // Id der zu bearbeitenden Signatur
    3. $signaturId = 1;
    4. // Datei einlesen und in Variable speichern
    5. $fileOld = file_get_contents("signatur.txt");
    6. // Dateiinhalt zerlegen in die einzelnen Zeilen
    7. // row[0] => 1. Zeile
    8. // row[1] => 2. Zeile
    9. $rows = explode("\n", $fileOld);
    10. // Schleife, die jede Zeile durchgeht
    11. // Datei wird die aktuelle Zeile (Inhalt) in $value gespeichert
    12. // Die Array-Id der Zeile wird in Key gespeichert
    13. // Also $key => 1
    14. // $value => "1;Das ist eine Testsignatur"
    15. // siehe Beispieldatei weiter oben
    16. foreach($rows as $key => $value) {
    17. // Zeile wird in die Felder gesplittet, anhand des
    18. // Semikolon als Trennzeichen
    19. // Für 1. Zeile würde das dann wie folgt aussehen
    20. // cols[0] => 1
    21. // cols[1] => "Das ist eine Testsignatur"
    22. $cols = explode(";", $value);
    23. if($cols[0] == $signaturId) {
    24. // Hier wird, falls die Id passt, die Signatur verändert
    25. $cols[1] == "Veränderte Signatur";
    26. }
    27. // Die Elemente des Arrays werden verbunden
    28. // Aus
    29. // cols[0] => 1
    30. // cols[1] => "Veränderte Signatur"
    31. // wird "1;Veränderte Signatur"
    32. $rows[$key] = implode(";", $cols);
    33. }
    34. // Gleiche wie weiter oben, die Elemente werden verbunden
    35. $fileNew = implode("\n", $rows);
    36. // Neu erstellten Inhalt in die Datei schreiben (alter Inhalt wird überschrieben)
    37. file_put_contents("signatur.txt", $fileNew);
    38. ?>
    Alles anzeigen

    Als Anfänger würde ich dir empfehlen mit file_get_contents() und file_put_contents() zu arbeiten, statt mit fopen(), fread() und fwrite(), weil dir dann weniger Fehler passieren und die Dateien einfacher zu handhaben sind.
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • öhm, ok, liefere ich mal den rest^^

    Quellcode

    1. if ($_POST['send'] == "1")
    2. {
    3. $handle = fopen ( "data/templates/inhalt/signatur.txt", "a" );
    4. $file_array[$user_id] = $handle;
    5. fwrite ( $handle, $file_array );
    6. fclose ( $handle );
    7. exit;
    8. }
    9. else
    10. {
    11. $handle = file("data/templates/inhalt/signatur.txt");
    12. $file_array = $handle;
    13. echo '<form action="" method="post">';
    14. echo '<p><textarea name="signatur" cols=50 rows=10 maxlength=2000>';
    15. echo $file_array[$user_id];
    16. echo '</textarea></p>';
    17. echo '<p><input type="hidden" name="send" value="1"><input type="submit" name="submit" value="Signatur ändern"></p>';
    18. }
    Alles anzeigen


    ich weiß, sehr schlecht:D
    un in der datei steht nur die signatur selber, nur die erste zeile ist leer, weil das ja sonst mit der id nicht passen würde...

    P.S.: das is der error: Warning: fwrite() expects parameter 2 to be string, array given

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Fipsi ()

  • So schlimm sieht dein Quellcode auch nicht aus, ich habe schon weitaus Schlimmeres gesehen.
    Allerdings solltest du dir meinen Code von oben mal ansehen. Dort sollte alles stehen, was du brauchst. Natürlich nicht in Reinform zum Copy&Pasten, da sonst der Lern Effekt auf der Strecke bleibt ;). Also mal durchlesen (besonders die Kommentare), zur Not mal auf de.php.net nachsehen, was Funktionen im Einzelnen machen und dann an deinen Quellcode anpassen.
    Falls dann unterwegs Fragen auftauchen, bist du jederzeit willkommen.

    //EDIT: Mittlerweile sehe ich auch, dass ich meine Lösung leicht überdimensioniert habe

    Quellcode

    1. <?php
    2. if ($_POST['send'] == "1")
    3. {
    4. $handle = file("data/templates/inhalt/signatur.txt");
    5. $file_array = $handle;
    6. $file_array[$user_id] = "Neue Signatur";
    7. // Array zufammenfallen lassen, damit er in die Datei geschrieben
    8. // werden kann
    9. $file = implode("\n", $file_array);
    10. file_put_contents("data/templates/inhalt/signatur.txt");
    11. }
    12. else
    13. {
    14. $handle = file("data/templates/inhalt/signatur.txt");
    15. $file_array = $handle;
    16. echo '<form action="" method="post">';
    17. echo '<p><textarea name="signatur" cols=50 rows=10 maxlength=2000>';
    18. echo $file_array[$user_id];
    19. echo '</textarea></p>';
    20. echo '<p><input type="hidden" name="send" value="1"><input type="submit" name="submit" value="Signatur ändern"></p>';
    21. }
    22. ?>
    Alles anzeigen
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Deadman44 ()

  • *an den Kopf schlag* Sry, bin im Moment ein bisschen im Stress, deswegen ist mir ein dummer Flüchtigkeitsfehler unterlaufen

    Quellcode

    1. <?php
    2. if ($_POST['send'] == "1")
    3. {
    4. $handle = file("data/templates/inhalt/signatur.txt");
    5. $file_array = $handle;
    6. $file_array[$user_id] = "Neue Signatur";
    7. // Array zufammenfallen lassen, damit er in die Datei geschrieben
    8. // werden kann
    9. $file = implode("\n", $file_array);
    10. // *************************************************
    11. // $file als Parameter hinzugefügt
    12. file_put_contents("data/templates/inhalt/signatur.txt", $file);
    13. }
    14. else
    15. {
    16. $handle = file("data/templates/inhalt/signatur.txt");
    17. $file_array = $handle;
    18. echo '<form action="" method="post">';
    19. echo '<p><textarea name="signatur" cols=50 rows=10 maxlength=2000>';
    20. echo $file_array[$user_id];
    21. echo '</textarea></p>';
    22. echo '<p><input type="hidden" name="send" value="1"><input type="submit" name="submit" value="Signatur ändern"></p>';
    23. }
    24. ?>
    Alles anzeigen
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • Ich kann jetzt leider keine konkrete Stelle im Quellcode erkennen, in der so etwas passieren sollte.
    Deine Datenstruktur sieht doch wie folgt aus:
    $file_array[0] => leer
    $file_array[1] => Signatur mit der ID 1 => Zweite Zeile
    $file_array[2] => Signatur mit der ID 2 => Dritte Zeile
    oder habe ich dich da falsch verstanden?
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • Das benutzen einer Datei für eine solche Aufgabe ist nicht besonders sinnvoll.

    Dafür ist eine Datenbank da !


    Bei dir hört sich das an, das du dir über die Performance Sorgen machst da ein Feld bei dir um die 2K Zeichen enthalten darf.
    Da lacht dich MySQL aus :P ... Du kannst gerne ein paar Millionen Einträge mit tausenden von Zeichen in deiner DB horten.

    Das benutzen einer Datei hat nur Nachteile. Die Datei wird immer größer und größer und das auslesen dauert immer länger und länger. Zudem kannst du Probleme mit den Locks bekommen.
    Datenbanken speichern letztendlich die Daten auch "nur" in Dateien und Ordner im Dateisystem ab, aber es werden Algorithmen (+Cache) genutzt um die Daten zu speichern und wieder abzurufen.
  • Nein, das kann so pauschal nicht sagen.
    Wenn du mit einer Datenbank arbeitest,dann arbeitest du ja mit Indizes auf den Spalten die für dich relevant sind.

    Du solltest dir darüber also erstmal keine Gedanken machen.
    Wenn du die Dateien irgendwann, nachdem sie mehrere GB groß ist, zum Engpass werden, dann nimm dir einen zweiten Server hinzu.
    Wenn du mit lokalen Dateien arbeitest kannst du nicht so einfach neue Server hinzu nehmen.
  • hm... ja, das hab ich mir auch schon überlegt, die ganzen templates udn das zeug auf nen anderen Server zu schieben, dann hat aber n kumpel von mir gemeint, ich bin blöd, ich krieg die 4GB eh nie voll:D

    ähm... is ne datenbank auch mit LONGTEXT (bis zu 60.000 Zeichen) zu empfehlen, oder wäre da doch ne datei besser?^^
    was datenbank/dateien angeht, kenn ich mich nich so aus^^
  • Fipsi schrieb:

    hm... ja, das hab ich mir auch schon überlegt, die ganzen templates udn das zeug auf nen anderen Server zu schieben, dann hat aber n kumpel von mir gemeint, ich bin blöd, ich krieg die 4GB eh nie voll:D

    ähm... is ne datenbank auch mit LONGTEXT (bis zu 60.000 Zeichen) zu empfehlen, oder wäre da doch ne datei besser?^^
    was datenbank/dateien angeht, kenn ich mich nich so aus^^



    Das kommt auch auf den Inhalt an. Wenn du Bilder oder andere binäre Formate speicherst, dann ist es in der Tat nicht sinnvoll.

    Die zweite Überlegung ist, was du mit dem Inhalt in einer DB mehr anstellen kannst.

    Hast du eine Signatur, dann kannst du diese jedem Beitrag in einem Forum oder Gästebuch etc. einfach joinen und einfach weiterverarbeiten. Hast du wiederrum viele Seiten, nur mit Reintext, die du ausgeben möchtest, dann kannst du dies auch in eine Datei packen. Wenn du ein Backend besitzt, dann macht es auch Sinn den Inhalt in der Datenbank zu speichern.

    Du kannst DB & Datei auch kombinieren. Ich hab nen Projekt mit endlich Seiten, (also kein Wiki o.ä.) wo über git kollaborativ gearbeitet wird, da bietet es sich natürlich an, Dateien zu nutzen.


    Pauschal lässt sich die Frage nicht beantworten, aber unterschätz , in dem Fall MySQL nicht und scheu dich nicht die DB zu beanspruchen und Daten zu speichern.


    Den GB hab ich auch nicht voll bekommen, hier aber mal 2 RL examples die ohne zu laggen ganz flüssig laufen so, dass nach oben noch massig Luft ist (hat natürlich auch was mit der Infrastruktur zu tun - ist aber nur 1 DB Server!)
    [Blockierte Grafik: http://i.imgur.com/uI6rQ.png]
    [Blockierte Grafik: http://i.imgur.com/uCFsm.png]

    Vielleicht ist Torben mal so nett und veröffentlicht die EC Statistiken ? ;)