Skrypt usuwający wpisy z bazy danych opartej na plikach tekstowych:


Potrzebuje napisać skrypt pozwalający na usuwanie wybranych rekordów z bazy danych opartej na plikach tekstowych.
Czy ktoś mógłby mi w tym pomóc?



Przykład i zasada zapisu/kodowania w bazie danych:

kod artykułu|nazwa artykułu|cena brutto|cena netto|data|czas|indeks główny|indeks lini

001|Towar A|30|15|05.10.2008|11:36:19|4001|1



Indeks główny - to numer paragonu/transakcji (w trakcie jednej transakcji można sprzedac kilka artykułów).
Składa się on z prefiksu (numer ´400´ - to numer stały,niezmienny) i numeru paragonu (liczba naturalna dodatnia).
Np. pierwszy paragon ma numer - ´4001´, drugi - ´4002´, trzeci - ´4003´, itd.

Indeks lini - to numer linni w bazie danych, który jest liczbą naturalną dodatnią. Służy do identyfikacji konkretnego artykułu w bazie danych.


Przykładowy wycinek bazy danych:

  1. <?php
  2. 001|Towar A|30|15|05.10.2008|11:36:19|4001|1
  3. 002|Towar B|46|5|05.10.2008|11:36:19|4001|2
  4. 003|Towar C||100|05.10.2008|11:36:19|4001|3
  5. 004|Towar D|15|3|07.10.2008|15:30:15|4002|4
  6. ?>



Zasada działania:

1. Mamy stronę wyglądającą jak na rysunku nr. 1.
Mamy tam pole, w którym wpisujemy numer/kod paragonu/transakcji, będący numerem indeksu głównego znajdującego się w bazie danych.
Po wpisaniu tego numeru należy wcisnąć przycisk "Dalej", który przenosi nas do następnego kroku.





2. Mamy już wygenerowaną stronę wyglądającą jak na rysunku nr. 2.
Wszystkie szare pola wypełniają się wg. opisu na rysunku. Po naciśnięciu przycisku "Usuń"
nastąpi usunięcie danej linijki z bazy danych.



Przykładowe rysunki wg. wcześniejszego wycinku bazy danych:




Po naciśnięciu przycisku "Usuń" znajdującego się w tej samej linii, co "Towar B", nastąpi
usunięcie całej linijki z "Towar B" z bazy danych. Tym samym linijki numer 2 (indeks lini).


Poniżej przytaczam listingi, przykładowych aplikacji do usuwania:

Rozwiązanie 1 (plik "a.php"):

  1. <?
  2. $remove = 59003; //rekord do usunięcia
  3. $_remove = false;
  4.  
  5. $file = file('baza.txt');
  6. foreach($file as $key => $row){
  7.  $exp = explode('|', $row);
  8.  if(trim($exp[3]) == $remove)
  9.    $_remove = $key;
  10. }
  11.  
  12. unset($file[$_remove]);
  13. foreach($file as $linia){
  14.   fputs($file, $linia); /* wprowadzenie linii do pliku*/
  15. }
  16.  
  17. file_put_contents('baza.txt', $file);
  18. ?>



Rozwiązanie 2 (plik "usun.php"):

  1. <?php
  2. $plik = "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. <input type="text" name="usun" size="20">
  22. <input type="submit" value="usun" />
  23. </form>


W formularzu wpisujemy numer linii w pliku tekstowym, który liczymy od 0 (tzn.,że pierwsza linnia w pliku tekstowym ma numer - 0, druga - 1,trzecia - 2,itd.



Listing bazy danych (plik "baza.txt"):

  1. <?php
  2. A|B|C|59001
  3. A|B|C|59002
  4. A|B|C|59003
  5. A|B|C|59004
  6. A|B|C|59005
  7. A|B|C|59006
  8. A|B|C|59007
  9. ?>




Powyższe aplikacje mają jednak kilka niedopatrzeń. Rozwiązaniem, które chciałem
wykorzystać jest rozwiązanie nr. 1. Jego problem polega na tym, że po uruchomieniu, nawet
gdy nie wpisze się numeru linii do usunięcia lub też ten numer został już usunięty, to skrypt
ten usuwa pierwszy rekord z bazy. Czyli wystarczy kilka razy odświeżyć stronę i wyczyścimy całą bazę danych.

W listingach z bazą danych niepotrzebnie dodano " <?php ... ?> ".



Proszę o pomoc. Najlepiej jakieś przykłady.