Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Edycja postów zapisanych w .txt
Forum PHP.pl > Forum > PHP
ZeTu
Witam
Mam wykonany skrypt do tworzenia i edycji postów i mam pewien problem. Mianowicie kod do edycji postów nie edytuje prawidłowo treści, nie umiem tego za bardzo wyjaśnić, ale na przykładzie to wyjaśnię.
A to kod edycji postów:
  1. ...
  2. $aid = $_GET['edytuj3'];
  3. if(!empty($aid)) {
  4. if(is_file('$aid')) include '$aid';
  5. else
  6.  
  7. echo '
  8. <br><b><br>Edycja strony</b>';
  9. $ide = $aid - 1;
  10. $tytul=chop($_POST["tytul"]);
  11. $tresc=chop($_POST["tresc"]);
  12. $folder = "$pliczek";
  13. $file=file("$folder");
  14. $dane=explode(" | ", $file[$ide]);
  15. $zero=$dane[0];
  16. $name=$dane[1];
  17. $link=$dane[2];
  18. $enter=$dane[3];
  19. $text = $plik1;
  20. $ad1 = $link;
  21. $ad2 = '$tresc';
  22. $be1 = $name;
  23. $be2 = '$tytul';
  24.  
  25. $plik = fopen("$folder", "r");
  26. $plik1 = fread($plik, 10240);
  27.  
  28.  
  29. $be1 = str_replace("+", " ", $be1);
  30. $ad1 = str_replace("+", " ", $ad1);
  31. $ad1 = str_replace("<br>", "
  32. ", $ad1);
  33.  
  34.  
  35. if ($_POST["Edycja3"]!="")
  36. {
  37. $ide = $aid - 1;
  38. $tytul=chop($_POST["tytul"]);
  39. $tresc=chop($_POST["tresc"]);
  40. $folder = "$pliczek";
  41. $file=file("$folder");
  42. $dane3=explode("", $file[0]);
  43. $ze=$dane3[0];
  44. $dane=explode(" | ", $file[$ide]);
  45. $zero=$dane[0];
  46. $name=$dane[1];
  47. $link=$dane[2];
  48. $enter=$dane[3];
  49. $enter = '
  50. ';
  51. $text = $plik1;
  52. $ad1 = $link;
  53. $ad2 = chop($_POST["tresc"]);
  54. $be1 = $name;
  55. $be2 = chop($_POST["tytul"]);
  56.  
  57. $plik = fopen("$folder", "r");
  58. $plik1 = fread($plik, 10240);
  59.  
  60. $ad2 = str_replace(" ", "+", $ad2);
  61. $be2 = str_replace(" ", "+", $be2);
  62.  
  63. $text = str_replace("$ad1", "$ad2", $text);
  64. $text = str_replace("$be1", "$be2", $text);
  65.  
  66.  
  67. file_put_contents($folder, $text);
  68. fclose($plik);
  69. echo("<br><br>Zapisano zmiany<br><a href='?panele=lista'>Zobacz efekt</a>");
  70. }
  71. else
  72. {
  73. echo <<<KONIEC
  74. <form method="POST" action="">
  75. <table>
  76. <p>
  77. <tr><td>Tytuł:</td><td><input type="text" name="tytul" size=20 value="$be1"></td> </tr>
  78. <tr><td>Treść:</td><td><textarea name="tresc" cols="25" rows="12">$ad1</textarea>
  79. </td> </tr>
  80. </p>
  81. <tr><td></td>
  82. <td><input type="submit" value="Zapisz zmiany" name="Edycja3"></td></tr>
  83. </table></form>
  84. KONIEC;
  85. }
  86. }
  87. ...

A to kod w .txt który jest przed edycją:
  1. tytul | tresc+mojego+posta
  2. tytul 2 | tresc+mojego+posta+22

I jeśli chcę zmienić tytul w pierwszej linii, to kod pobiera ta linie i wpisuje w formularz, po zmianie danych np. z "tytul" na "tytul2", to zamiast edytować w tej pobranej linii edytuje w całym pliku to słowo i wtedy kod wygląda tak:
  1. tytul2 | tresc+mojego+posta
  2. tytul2 2 | tresc+mojego+posta+22

A więc jak zrobić aby edytowało tylko z wybranej linii? Trochę pomieszałem w kodzie, ale mam nadzieję, że ktoś z was pomoże mi ten kod jakoś prawidłowo zedytować.
buliq
  1. str_replace("$ad1", "$ad2", $text);
  2. $text = str_replace("$be1", "$be2", $text);


Czytałeś co robi str_replace ? Zamienia każde słowo na inne. Więc normalnie że zamienia. Zmodyfikuj skrypt i przed każdym postem(na początku każdej lini) wstawiaj jakiś unikalny ID lub posługuj się numerem lini.
ZeTu
No wiem, że zmienia każde słowo. Tylko nie wiem jak zrobić żeby zmieniało tak jak tego chce.
No własnie tak robie że posługuje się nr'em linii. Wiem jak wyciągąć z odpowiedniej linii do formularza za pomocą którego zedytuje sobie daną zawartość danej linii, ale nie wiem jak zrobić by zmieniało właśnie tylko wtej wybranej linii, a nie że jak zapisuje to zmienia mi w całym pliku sad.gif edytuje każdą linię w taki sposób:
penel.php?edytuj3=nrlinii
np. penel.php?edytuj3=1
i edytuje mi linię pierwszą, ale to chyba widać, z resztą za pomocą
  1. $aid = $_GET['edytuj3'];
i
  1. $ide = $aid - 1;
oraz
  1. $dane=explode(" | ", $file[$ide]);
buliq
To skoro wiesz która linia to znasz jej treść przed edycją i po edycji. Nie możesz zamienić całej lini?
ZeTu
Ale w jaki sposób mam to zrobić?, np. w taki:
  1. $file[$ide] = str_replace("$ad1 | $be1", "$ad2 | $be2",$file[$ide]);
buliq
$ad1 i $ad2 to tylko tytuły tak? więc nie tak. Musisz pobrać całą zawartość lini przed explode i tą linię zastąpić nową linią. Czyli $file[0] zastępujesz nową linią ($_POST z tytułem i treścią łączysz do odpowiedniego formatu)

@up tak dokładnie jak poprawiłeś
ZeTu
I teraz będzie na pewno dobrze?
buliq
Sprawdź smile.gif Nic nie jest pewne smile.gif
ZeTu
No nie jaki żal
Zmieniłem jeszcze z
  1. file_put_contents($folder, $text);
na
  1. file_put_contents($folder, $file[$ide]);
i teraz zamiast zapisać to usuwa wszystkie linie i zapisuje tylko to co jest w formularzu ;/
Uriziel01
Przypisz dla tych postów unikalne ID, po tym parsuj plik. Pobieraj całą zawartość pliku, dziel na posty, znajdź po ID interesujący cię post, potem przenieś całą wczytaną tablicę postów na powrót do pliku. To samo z usuwaniem i dodawaniem. Str_repleace zapewne będzie 100x szybsze przy naprawdę dużych plikach (kilka tysięcy linii) ale skoro już wybrałeś zapis do pliku. .txt zamiast bazy danych to przy okazji przekonałeś się dlaczego znakomita większość korzysta jednak z zapisu do DB.
ZeTu
Z usuwaniem i dodawanie to nie problem.
Czyli w jaki sposób mam edytować daną linijkę?
Mam zrobić tak samo jak tutaj:
  1. $file[$ide] = str_replace("$ad1 | $be1", "$ad2 | $be2",$file[$ide]);

tylko zamiast
  1. $file[$ide]

dać nr id?
A właśnie czemu mam dawać to id? Nie może być tak, że nr'em id jest nr linii? Bo teraz jak mam dopisywać do tego pliku .txt jeszcze id, to będę musiał od nowa pisać ten kod php. A robię na plikach .txt bo jestem początkujący, a jak obczaje bardziej .php + .txt to wtedy przejdę na .php + MySQL
Uriziel01
Używasz jakiegoś kodowania/szyfrowania do zapisu treści post'a ? Jeżeli nie to numer linii zmieni się gdy w poście będzie zawarty znak nowej linii.
Co do tego że jesteś początkujący, lepiej zacznij od baz danych zamiast pllików tekstowych, jest to imho o wiele łatwiejsze w implementacji. A po drugie mają one niezliczoną ilość zalet.
ZeTu
A dobra, nie to nie. kurde jak dodaje kolejny post to dodaje go na końcu pliku czyli id się nie zmienia!
Ok już sobie poradziłem zrobiłem to tak:
  1. $file[$ide] = str_replace("$ad1 | $be1", "$ad2 | $be2",file_get_contents($folder));
  2. file_put_contents($folder, $file[$ide]);
bambam
zakoncz kazdy rekord jakims znakiem i pobieraj az do jego napotkania, kazde wystapienie tego znaku to kolejny post.

id | tresc |autor | data ;

pobierasz do ; pozniej explodujeszz linijke za pomoca |
zapisujesz sobie numer lini gdzie zaczal sie ten post edytujesz jakie chcesz dane otrzymane po explode i zapisujesz w to samo miejsce albo na koncu

nie rozumiem z czym tu masz problem ?

W przyszlosci i tak w wiekszosci przypadkow bedziesz parsowal csv'alki albo xmle w ktorych reguly beda sie zmieniac przy kazdym innym zadaniu praktycznie,
rzadko kiedy ktos uzywa .txt



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.