Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Usuwanie wielu rekordów z pliku
Forum PHP.pl > Forum > PHP
szczawik
Witam
Jak zrobić, abym mógł usuwać z pliku txt kilka wybranych rekordów?
Oto kod

  1. <?php
  2. $plik = "admin/baza.txt";
  3.  
  4. if ((isset($_POST['usun'])) AND (is_numeric($_POST['usun']))) {
  5. /* sprawdzam czy zmienna $_POST['usun'] zostala zainicjonowana i czy jest cyfrą */
  6.  
  7. $dane = file($plik); /* pobieram dane z pliku */
  8. unset($dane[$_POST['usun']]); /* usuwam wybrany rekord tablicy */
  9.  
  10. $f = fopen($plik, "w"); /* nawiązuje połączenie z plikiem i kasuje jego zawartosc */
  11. foreach($dane as $linia){
  12. fputs($f, $linia); /* wprowadzam linie po linii do pliku */
  13. }
  14. fclose($f); /* zamykam polączneie z plikiem */
  15.  
  16. }
  17.  
  18. ?>
  19.  
  20. <form action="usun.php" method="post">
  21. <?php
  22. $dane = file($plik);
  23.  
  24. for($i=0;$i<count($dane);$i++) {
  25. list($imie[$i], $nazwisko[$i], $miejscowosc[$i]) = explode(" || ", $dane[$i]);
  26. }
  27.  
  28. for($i=0;$i<count($imie);$i++)
  29. echo '<input name="usun" type="checkbox" value="'.$i.'">'.$imie[$i]." ".$nazwisko[$i].", ".$miejscowosc[$i]."</input><br>";
  30.  
  31. ?>
  32.  
  33. <input type="submit" value="usun" />
  34. </form>
Pilsener
1. Odczytać linię n z pliku A
2. Sprawdzić, czy spełnia warunki kasacji
3. Jeśli nie, to zapisać linię n do pliku B
4. Powyższe powtórzyć tyle razy, ile jest linii w pliku A
5. Skasować plik A a nazwę pliku B zmienić na A

Potrzebny kod znajdziesz tutaj:
http://www.forumweb.pl/viewtopic.php?t=39103

Kiedyś napisałem jak mysql był luksusem ale wciąż jak widać się przydaje smile.gif
szczawik
dzięki wielkie winksmiley.jpg

a czy można w jakiś sposób, aby skrypt wybrał z pliku txt losową linie?
CuteOne
  1.  
  2.  
  3. $losowa_linia = rand(0,count($dane)-1);
  4.  
Pilsener
No tak, tylko nie zawsze dysponujemy pamięcią, do której możemy wrzucić cały plik a nawet jeśli to lepiej tego nie robić, bo się zamuli. Z kolei policzenie linii w pliku jest proste (kod dałem powyżej w linku), ale musimy dwa razy parsować plik (raz by policzyć linie a drugi raz by wybrać właściwą linię)

Możemy zrobić np. tak: jeśli przechowujemy nr wpisu w rekordach pliku, pobieramy sobie ostatni rekord (w tutorialu też jest kod jak to zrobić a także na forum: http://forum.php.pl/index.php?showtopic=139139), wyciągamy ID wpisu i losujemy liczbę od 1 do ID tego wpisu (funkcją rand) i wczytujemy do pliku rekord o tym ID. Jeśli ID tego wpisu nie ma (bo został np. twardo skasowany) to bierzemy po prostu następny rekord.

Ale to rozwiązanie wydaje się najprostsze: mierzymy rozmiar pliku i losujemy miejsce w pliku, do którego przeniesiemy się funkcją fseek i odczytamy rekord pod tym miejscem - po prostu parsujemy plik nie od początku, ale od losowego miejsca i nie do końca, lecz do momentu wczytania całego rekordu - po czym używamy break by wyskoczyć z pętli i wyświetlić wylosowaną linię.
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.