Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][php] Usuwanie wybranych linii z pliku txt
Forum PHP.pl > Forum > Przedszkole
kamild
Witam szanownych forumowiczów.
Nie wiem gdzie popełniłem błąd, a mianowicie chcę uzyskać możliwość usuwania poszczególnej linii pliku txt. Stworzyłem tabelę w której w jednej kolumnie znajduje się podgląd zawartości pliku (podzielony na linie) a w drugiej kolumnie przycisk usuń. Niestety funkcja ta nie działa. Czy ktoś może mi pomóc? Z góry dziękuje. Pozdrawiam

  1. <?php
  2. $plik = "plik.txt";
  3.  
  4. if ((isset($_POST['usun'])) AND (is_numeric($_POST['usun']))) {
  5.  
  6.  
  7. $dane = file($plik); /* pobieram dane z pliku */
  8. unset($dane[$_POST['usun']]);
  9.  
  10. $f = fopen($plik, "w");
  11. foreach($dane as $linia){
  12. fputs($f, $linia);
  13. }
  14. fclose($f);
  15.  
  16. }
  17.  
  18. ?>
  19. <form action="usun2.php" method="post">
  20.  
  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. echo '<table border="1" width="500" align="center"><tr><td height="10" align="center">"Imię nazwisko, numer" </td><td></td>"Dostępne operacje"</tr></table>';
  28. for($i=0;$i<count($imie);$i++)
  29. echo '<table border="1" width="500" align="center"><tr><td height="10" align="center"><tr><td height="10" align="center">'.$imie[$i]." ".$nazwisko[$i].", ".$miejscowosc[$i].'</td><td>
  30. <input type="hidden" name="execute" value="true"><input type="submit" value="Usuń"><input type="hidden" name="execute" value="true"><input type="submit" value="Drukuj"></td></tr></table>';
  31. ?>
  32. </form>

erix
  1. fputs($f, $linia.PHP_EOL);


Ale to bardzo nieefektywny sposób... (file)
_Borys_
wartość submit nie jest przesyłana do $_POST
Jeśli chciałbyś tym sposobem co myślisz to musiałbyś każdy hidden i każdy submit umieścić w osobnym formularzu, każdy hidden o innej wartości i każdy formularz o innej nazwie.

Inny sposób to zastosowanie:
checkbox-y w których nazwy byłyby tablicami
  1. <input type="checkbox" name="tab[]" value="xxx"/>
  2. <input type="checkbox" name="tab[]" value="yyy"/>

tablice nie muszą być numerowane.

lub przy pomocy select:
  1. <select name="sel">
  2. <option value="xxx">xxx</option>
  3. <option value="yyy">xyz</option>

na początku swojego skryptu wpisz var_dump ($_POST) i zobaczysz co jest przesyłane do $_POST.
kamild
Dziękuje za szybką odpowiedź. _Borys_ Checkbox fajna sprawa i to jest najlepsze rozwiązanie. Dzięki bardzo

  1. <?php
  2.  
  3. $plik = "plik.txt";
  4. if ((isset($_POST['usun'])) AND (is_numeric($_POST['usun']))) {
  5.  
  6. $dane = file($plik);
  7. unset($dane[$_POST['usun']]);
  8. $f = fopen($plik, "w");
  9.  
  10. foreach($dane as $linia){
  11.  
  12. fputs($f, $linia);
  13.  
  14. }
  15. fclose($f);
  16.  
  17. }
  18.  
  19.  
  20. ?>
  21. <?php
  22.  
  23. $dane = file($plik);
  24.  
  25. for($i=0;$i<count($dane);$i++) {
  26.  
  27. list($imie[$i], $nazwisko[$i], $miejscowosc[$i]) = explode(" || ", $dane[$i]);
  28. echo '<form method="post" action="usun2.php">';
  29. echo "<input type='checkbox' name="dane[]" value='".$i."'/>";
  30.  
  31. echo '<input type='submit' value='usun'/>';
  32. }
  33. ?>


Naskrobałem coś takiego ale niestety nie chce mi działać. Zapewne coś sknociłem w czym jest błąd?
pozdrawiam
ylk
A nie możesz po prostu wczytać pliku do tablicy, usunąć z niej wartość i zapisać plik? (przy użyciu file() i array_splice())?
Zamiast 50 trzy linijki a efekt ten sam....
kamild
Oki udało mi się, poniżej przedstawiam kod

  1. <?php
  2. if (isset($HTTP_POST_VARS['delete'])) {
  3. $inhalt = file('plik.txt');
  4. $fp = fopen('plik.txt','w');
  5. flock($fp,2);
  6. while (list($inhalt_key,$inhalt_val) = each($inhalt)) {
  7. if (!isset($HTTP_POST_VARS['delete'.$inhalt_key])) {
  8. fwrite($fp,$inhalt_val);
  9. }
  10. }
  11. flock($fp,3);
  12. fclose($fp);
  13. }
  14. $inhalt = file('plik.txt');echo '<form method="post" action="'.$HTTP_SERVER_VARS['PHP_SELF'].'">';
  15. echo ('<table border="1" width="500" ><tr><td height="10" align="center">"Dane"</td><td height="10" align="center">Zaznacz</td></tr></table>');
  16. while (list($inhalt_key,$inhalt_val) = each($inhalt)) {
  17. echo ('<table border="1" width="500" ><tr><td height="10">'.$inhalt_val.'</td><td><input type="checkbox" name="delete'.$inhalt_key.'"></td></tr></table>');
  18. }
  19. echo ('<table border="1" width="500" ><tr><td height="10" align="center"><input type="submit" name="delete" value="Usuń"></form>
  20. ');
  21. ?>
  22.  


Apetyt rośnie w miarę jedzenia i tak teraz myślę jak by wykonać coś podobnego czyli: odczyt zawartości pliku i wczytanie w komórki tabeli ale nie tylko z jednej linii ale np kilka w zależności od długości tekstu. Dzielnikiem był by jakiś symbol. Czy ktoś może pomóc?
iPrezes
A moglbys mi podac kod za pomoca ktorego sa wysylane te dane do pliku txt? bo bym wtedy u siebie wyprobowal bo tez cos takiego potrzebuje haha.gif
_Borys_
funkcja wordwrap () do łamania tekstu Lkingsmiley.png
erix
Cytat
Zamiast 50 trzy linijki a efekt ten sam....

No ok, masz plik, który zajmuje 3 GiB, nadal jesteś pewien? wink.gif
kamild
Cytat(iPrezes @ 17.02.2011, 15:45:50 ) *
A moglbys mi podac kod za pomoca ktorego sa wysylane te dane do pliku txt? bo bym wtedy u siebie wyprobowal bo tez cos takiego potrzebuje haha.gif

Ja mam automatycznie generowany ten plik, a jeśli chodzi o zapis danych do pliku poniżej przedstawiam przykładowy kod
  1. <?php
  2.  
  3. // zmienna $dane, która będzie zapisana
  4. // może także pochodzić z formularza np. $dane = $_POST['dane'];
  5. $dane = "tekst do wprowadzenia\n";
  6.  
  7. // przypisanie zmniennej $file nazwy pliku
  8. $file = "baza.txt";
  9.  
  10. // uchwyt pliku, otwarcie do dopisania
  11. $fp = fopen($file, "a");
  12.  
  13. // blokada pliku do zapisu
  14. flock($fp, 2);
  15.  
  16. // zapisanie danych do pliku
  17. fwrite($fp, $dane);
  18.  
  19. // odblokowanie pliku
  20. flock($fp, 3);
  21.  
  22. // zamknięcie pliku
  23. fclose($fp);
  24. ?>
  25.  



erix wiem, że przy pomocy bazy było by szybciej i łatwiej ale niestety do dyspozycji mam tylko txt
Pozdrawiam
erix
Ja cały czas mówię o pliku. To było do mózgów, którzy chcieli dobrać do pliku o objętości 3 GiB przez file.
TwojPan
Cytat(_Borys_ @ 17.02.2011, 01:12:17 ) *
wartość submit nie jest przesyłana do $_POST
Jeśli chciałbyś tym sposobem co myślisz to musiałbyś każdy hidden i każdy submit umieścić w osobnym formularzu, każdy hidden o innej wartości i każdy formularz o innej nazwie.

Inny sposób to zastosowanie:
checkbox-y w których nazwy byłyby tablicami
  1. <input type="checkbox" name="tab[]" value="xxx"/>
  2. <input type="checkbox" name="tab[]" value="yyy"/>

tablice nie muszą być numerowane.

lub przy pomocy select:
  1. <select name="sel">
  2. <option value="xxx">xxx</option>
  3. <option value="yyy">xyz</option>

na początku swojego skryptu wpisz var_dump ($_POST) i zobaczysz co jest przesyłane do $_POST.

Hej,
Powiedzmy ze mam plik i dane linia po linii. Wiem jak usunac wybrana linie z pola radio ale jesli mam usunac kilka na raz przy polach checkbox ? Jak to powinno wygladac ?
Mam teraz taki przyklad:
  1. <?
  2. function f($c,$k)
  3. {
  4.  
  5. $c = "<form ACTION=".$_SERVER['PHP_SELF']." METHOD='POST'>";
  6. $c .= "<input TYPE='hidden' name='x' value='1'>";
  7. $c .= "<select name='in'>";
  8. $foo = file($k);
  9. $t = 0;
  10. foreach($foo as $v){
  11. $c .= '<option VALUE=\''.$t.'\'>'.$v.'</OPTION>';
  12. $t++;
  13. }
  14. $c .= "</select><input TYPE='submit' value='del'></form>";
  15. return $c;
  16. };
  17. function delline($u,$f){
  18. $foo = file($f);
  19. unset($foo[$u]);
  20. $f = fopen($f,'w');
  21. flock($f, LOCK_EX);
  22. fwrite($f,str_replace('\r','',join('',$foo)));
  23. flock($f ,LOCK_UN);
  24. fclose($f);
  25. print 'usunolem linie';
  26. exit();
  27. };
  28. @($_POST['x'])?delline($_POST['in'],'data.txt'):print @f($c,'data.txt');
  29.  
  30. ?>

Dziekuje za odpowiedz.
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.