Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Edycja plików tekstowych
Forum PHP.pl > Forum > Przedszkole
Marteen
Witam serdecznie.

Na swojej stronie nie korzystam z MySQL, więc opracowałem skrypt komentarzy oparty o pliki tekstowe. Polega on na tym, że do każdego elementu na stronie, który można skomentować (np. zdjęcie 5.jpg) tworzony jest w tym samym folderze na serwerze plik tekstowy o tej samej nazwie (np. 5.txt), który zawiera skrypt php deklarujący ponumerowane zmienne, których wartościami są kolejne komentarze. Oto przykładowy plik txt z komentarzami:
  1. $komentarz1 = "Przykładowy komentarz 1";
  2. $komentarz2 = "Przykładowy komentarz 2";
  3. $komentarz3 = "Przykładowy komentarz 3";


Z odczytywaniem ich nie mam problemu, lecz chciałbym dodać możliwość edytowania i kasowania pojedynczych komentarzy. Do tego potrzebuję wiedzieć, jak w php można edytować pliki tekstowe.

Powiedzmy, że chcę skasować z pliku linijkę skryptu, która deklaruje zmienną $komentarz2. Co należy zrobić? Jak edytować dowolny fragment pliku? Przyda mi się też sposób na obliczenie ilości wszystkich linijek w danym pliku. Proszę o pomoc.
mlawnik
Witam,

Zapisywanie: fwrite file_put_contents
Edycja: str_replace (Wersja str_ireplace nie rozróżnie małych i dużych liter).

Pozdrawniam,
marcinl
Quantum
Marteen, jak już upierasz się przy plikach tekstowych to może jakoś lepiej zaplanuj taki skrypt. Aktualnie jest maksymalnie nieelastyczny.

Skorzystaj z tablic. Do odczytu użyj deserializacji (unserialize), zapisu serializacji (serialize). Wyświetlanie komentarzy - zwykła pętla foreach po tablicy z komentarzami.

przykład z kawałkiem kodu:

  1.  
  2. $txt = '5.txt';
  3.  
  4. $komentarze = unserialize(file_get_contents($txt));
  5.  
  6. array_push($komentarze, array('autor', 'treść'));
  7.  
  8. file_put_contents($txt, serialize($komentarze));
  9.  
  10. foreach ($komentarze as $komentarz)
  11. {
  12. echo 'autor: '.$komentarz[0].', treść: '.$komentarz[1].'<br/>';
  13. }
  14.  
Marteen
mlawnik, sprawdziłem to, co zasugerowałeś, ale to mi niestety nie pomoże. Potrzebuję funkcji (lub czegokolwiek), dzięki której będę mógł usunąć całą linijkę. Numer linijki powinienem sam określić. Jeszcze nie zamierzam używać bazy danych, więc proszę o pomoc odnośnie edycji plików tekstowych.
mlawnik
Tak na szybko, z googla
  1. <?php
  2.  
  3. ###########################################################################
  4. ### ###
  5. ### This function takes two arguements, $fileName and $lineNum ###
  6. ### The example here shows how to delete line number 14 from the file ###
  7. ### myfile.txt ###
  8. ### Example: ###
  9. ### ###
  10. ### $fileName = "myfile.txt"; ###
  11. ### $lineNum = 14 ###
  12. ### delLineFromFile($fileName, $lineNum); ###
  13. ### Author Kevin Waterson kevin@phpro.org ###
  14. ### ###
  15. ###########################################################################
  16. // the file name, this can be a path also, like /path/to/myfile.txt
  17. $fileName = "myfile.txt";
  18.  
  19. // the line to delete
  20. $lineNum = 87;
  21.  
  22. delLineFromFile($fileName, $lineNum);
  23.  
  24.  
  25. function delLineFromFile($fileName, $lineNum){
  26. // check the file exists
  27. if(!is_writable($fileName))
  28. {
  29. // print an error
  30. print "The file $fileName is not writable";
  31. // exit the function
  32. }
  33. else
  34. {
  35. // read the file into an array
  36. $arr = file($fileName);
  37. }
  38.  
  39. // the line to delete is the line number minus 1, because arrays begin at zero
  40. $lineToDelete = $lineNum-1;
  41.  
  42. // check if the line to delete is greater than the length of the file
  43. if($lineToDelete > sizeof($arr))
  44. {
  45. // print an error
  46. print "You have chosen a line number, <b>[$lineNum]</b>, higher than the length of the file.";
  47. // exit the function
  48. }
  49.  
  50. //remove the line
  51. unset($arr["$lineToDelete"]);
  52.  
  53. // open the file for reading
  54. if (!$fp = fopen($fileName, 'w+'))
  55. {
  56. // print an error
  57. print "Cannot open file ($fileName)";
  58. // exit the function
  59. }
  60.  
  61. // if $fp is valid
  62. if($fp)
  63. {
  64. // write the array to the file
  65. foreach($arr as $line) { fwrite($fp,$line); }
  66.  
  67. // close the file
  68. fclose($fp);
  69. }
  70.  
  71. echo "done";
  72. }
  73.  
  74. ?>

Po angielsku, ale myślę, że sobie poradzisz
Marteen
Nie potrafię teraz ogarnąć tablic. Aby łatwiej Wam było zrozumieć, o co mi chodzi, pokażę przykład - chcę jednym skryptem edytować, a drugim usunąć komentarz 4.
Plik przed wykonaniem skryptu:
  1. $komentarz[1] = "Przykładowy komentarz 1";
  2. $komentarz[2] = "Przykładowy komentarz 2";
  3. $komentarz[3] = "Przykładowy komentarz 3";
  4. $komentarz[4] = "Przykładowy komentarz 4";
  5. $komentarz[5] = "Przykładowy komentarz 5";
  6. $komentarz[6] = "Przykładowy komentarz 6";

Plik po wykonaniu skryptu na usuwanie:
  1. $komentarz[1] = "Przykładowy komentarz 1";
  2. $komentarz[2] = "Przykładowy komentarz 2";
  3. $komentarz[3] = "Przykładowy komentarz 3";
  4. $komentarz[5] = "Przykładowy komentarz 5";
  5. $komentarz[6] = "Przykładowy komentarz 6";

Plik po wykonaniu skryptu na edycję:
  1. $komentarz[1] = "Przykładowy komentarz 1";
  2. $komentarz[2] = "Przykładowy komentarz 2";
  3. $komentarz[3] = "Przykładowy komentarz 3";
  4. $komentarz[4] = "Oto zmieniony komentarz 4";
  5. $komentarz[5] = "Przykładowy komentarz 5";
  6. $komentarz[6] = "Przykładowy komentarz 6";
Quantum
unset($tablica[klucz]), pamiętaj o serializacji/deserializacji tablic przy zapisywaniu/otwieraniu pliku.
Marteen
Zatem z usuwaniem wybranych linijek sobie poradzę, ale nie wiem, jak będzie z edycją. W każdym razie dziękuję za tyle, ile się dowiedziałem.
Quantum
Jak to nie wiesz jak będzie z edycją ? Po wczytaniu do zmiennej tablicy, edytujesz zawartość i zapisujesz :

  1. /*
  2.  przykładowa zawartość tablicy z komentarzami po wczytaniu z pliku:
  3.  
  4.  $komentarze = array(
  5.   array('autor', 'treść'),
  6.   array('autor', 'treść')
  7.  );
  8.  
  9.  chcesz edytować treść drugiego komentarza:
  10.  
  11. */
  12.  
  13. $komentarze[1][1] = 'inna treść';
  14.  
  15. // dalej operacje zapisu, pokazałem kilka postów wcześniej jak to zrobić
  16.  
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.