Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Edycja pliku tekstowego w formularzu.
Forum PHP.pl > Forum > Przedszkole
Krisso
Witam mam problem, ponieważ chcę stworzyć kod, który umożliwiłby edytowanie/usuwanie znalezionych pozycji z pliku.

Tak wyglądają fragmenty plików:
baza.txt
każda linia to kolejny element zbioru
Cytat
Mickiewicz Adam||Dziady||PWN||1985||456123-987-987
Sienkiewicz Henryk||Potop||PWN||1992||1236-9875-4865
Jajuga Krzysztof||Inwestycje||WN PWN||2007||7896-5235-7842
Szewczyk Ryszard||Bankowa obsługa firmy||Oficyna Ekonomiczna||2002||7896-5654-5456


do tego użyć chciałem już wcześniej stworzonej wyszukiwarki:
edytor.php
fragment kodu
  1. <?php
  2. $pole1 = trim($_POST['pole1']); 
  3. echo '<form action="" method="post">
  4. <center>  
  5. <input type="text" name="pole1" style="width:  130px;" /> 
  6. <input type="submit" value="Szukaj" />
  7. <br />
  8. </center>
  9. </form>';
  10. ?>
  11. //...
  12. //zbędna cześć kodu
  13. //...
  14. <hr >
  15. <?php
  16. $arrFile = file( 'baza.txt' );
  17. for( $i = 0; $i < count( $arrFile ); $i++ )
  18. {
  19. list($autor[$i], $tytul[$i], $wyd[$i],$rw[$i],$isbn[$i],$gat1[$i],$gat2[$i],$opis[$i] ) = explode("||", $arrFile[$i]);
  20. $line = explode( '||', $arrFile[ $i ] ); 
  21. if( eregi( $pole1, $line[1])||eregi( $pole1, $line[0] ) )  
  22. { 
  23. echo "<strong>Autor :</strong>".$autor[$i].
  24. "<br /><strong> Tytuł:</strong>".$tytul[$i].
  25. "<br /><strong>Wydawnictwo:</strong>".$wyd[$i].
  26. "<br /><strong>Rok wydania:</strong>".$rw[$i].
  27. "<br /><strong>Numer ISBN:</strong>".$isbn[$i].
  28. "<br /><strong>Gatunek podstawowy :</strong>".$gat1[$i].
  29. "<br /><strong>Gatunek dodatkowy :</strong>".$gat2[$i].
  30. "<br /><strong>Opis :</strong>" .$opis[$i].
  31. "<br />";
  32. <input type="edycja.php" value="Edytuj" /> 
  33. "<hr />";
  34.  
  35. }
  36.  else { ; }
  37. }
  38. ?>


I teraz powstaje problem ponieważ zawsze może zdażyć sie sytuacja, że wyszukany autor bedzie miał kilka książek, a my chcemy edytować tą jedną bez konieczności kolejnego wpisywania inf do wyszukiwarki.
Myślałem o tym aby do każdego z wyszukanych elementów dodatkowo pojawiał sie przycisk [Edytuj] ale nie wiem jak to wykonać bo moja propozycja wykonania jest błędna.
"Edycja.php" - to jest formularz do którego chcę wczytać wybrany element. I tutaj również powstaje problem typu: Jak przesłać dane, ale narazie nie zagłębiam sie w ten temat, ponieważ póki nie rozwiąże tego nic wiecej nie ma sensu robić.

Edit: 17:00

Właśnie wpadłem na pomysł,ale nie wiem czy to jest logiczne, aby funkcja [Edytuj] powodowała zapis wybranego elementu do pliku np: edyt.txt i nastepnie formularz uzupełniany byłby za pomocą odczytu z tego pliku. Wtedy moglibyśmy wprowadzić zmiany i zapisać spowrotem do baza.txt. Tylko ze powstałby wtedy problem z tym aby nowa wersja nadpisała starą wersję.
Ponieważ jakbyśmy przy zapisie do "edyt.txt" usunęli jednocześnie nasz wybrany element z bazy to w wypadku awarii utracilibysmy tą daną.
dadexix
a czy nie lepiej użyć SQL?
Krisso
Ogólnie to chcę wszystko stworzyc na plikach, wiem że z baza danych byłoby łatwiej, ale ja wolę sobie wszystko troche utrudniać smile.gif
Jak opanuję zasady działania na plikach wtedy ruszę do SQL znając wszystkie kruczki łatwiej będzie mi sie później poruszać w PHP i MYSQL.
dadexix
no nie wiem... pliki Ci nic nie pomogą w SQL... jak poznasz ogólnie to nie raz przypadkiem poznasz funkcjie która pomoże Ci w innym wypadku.... jeśli tak bardzo chcesz na plikach.. to może lepiej na zserializowanych tablicach? serialize" title="Zobacz w manualu PHP" target="_manual
Krisso
Dobra stworzyłem juz formularz który pozwala edytować i zapisywać zmiany:

edytor.php
  1. <?php
  2. $nazwa="baza.txt";
  3. $konfiguracja = file_get_contents($nazwa);
  4. $conf=explode("||",$konfiguracja);
  5.  
  6. $form = "<form action='' method='POST'>
  7. <input type='text' name='autor' value='$conf[0]' style='width: 200px' /><br>
  8. <input type='text' name='tytul' value='$conf[1]' style='width: 200px' /><br>
  9. <input type='text' name='wyd' value='$conf[2]' style='width: 200px' /><br>
  10. <input type='text' name='rw' value='$conf[3]' style='width: 200px' /><br>
  11. <input type='text' name='isbn' value='$conf[4]' style='width: 200px' /><br>
  12. <input type='text' name='gat1' value='$conf[5]' style='width: 200px' /><br>
  13. <input type='text' name='gat2' value='$conf[6]' style='width: 200px' /><br>
  14. <input type='text' name='opis' value='$conf[7]' style='width: 350px;'/><br> 
  15. <input type='submit' name='submit' value='zapisz' />";
  16.  
  17. if(isset($_POST['submit'])){
  18.  extract($_POST);
  19.  $autor=StripSlashes($autor);
  20.  $tytul=StripSlashes($tytul);
  21.  $klucz=StripSlashes($wyd);
  22.  $rw=StripSlashes($rw);
  23.  $isbn=StripSlashes($isbn);
  24.  $gat1=StripSlashes($gat1);
  25.  $gat2=StripSlashes($gat2);
  26.  $opis=StripSlashes($opis);
  27.  file_put_contents($nazwa, "$autor||$tytul||$wyd||$rw||$isbn||$gat1||$gat2||$opis");
  28. ?><BR><BR><BR>
  29. <center><strong>
  30. <?
  31.  echo  "Edycja książki została zapisana</A>";
  32. } else{ echo $form; }
  33. ?>

Sprawa polega na tym, że to jest do edycji całego pliku a ja jak miałem problem tak mam z przesłaniem tylko wyszukanego fragmentu.
Proszę o możliwie szybka pomoc, ponieważ na czwartek musze oddać projekt a brakuje mi jeszcze edycji,usuwania i logowania.
dadexix
  1. <?php
  2. $nazwa="baza.txt";
  3. $konfiguracja = file_get_contents($nazwa);
  4. $conf=explode("||",$konfiguracja);
  5.  
  6. if(isset($_POST['submit'])){
  7. $str= implode("||",$_SESSION['dane']);
  8. $str2 = $_POST['autor']."||".$_POST['tytul']."||".$_POST['wyd']."||".$_POST['rw']."||".$_POST['isbn']."||".$_POST['gat1']."||".$_POST['gat2']."||".$_POST['opis'];
  9. $new = str_replace($str, $str2, $konfiguracja);
  10.  
  11.  
  12.  file_put_contents($nazwa, $new);
  13. ?><BR><BR><BR>
  14. <center><strong>
  15. <?
  16.  echo  "Edycja książki została zapisana</A>";
  17. } else{ 
  18. $_SESSION['dane']['0'] = $conf[0];
  19. $_SESSION['dane']['1'] = $conf[1];
  20. $_SESSION['dane']['2'] = $conf[2];
  21. $_SESSION['dane']['3'] = $conf[3];
  22. $_SESSION['dane']['4'] = $conf[4];
  23. $_SESSION['dane']['5'] = $conf[5];
  24. $_SESSION['dane']['6'] = $conf[6];
  25. $_SESSION['dane']['7'] = $conf[7];
  26.  
  27. $form = "<form action='' method='POST'>
  28. <input type='text' name='autor' value='$conf[0]' style='width: 200px' /><br>
  29. <input type='text' name='tytul' value='$conf[1]' style='width: 200px' /><br>
  30. <input type='text' name='wyd' value='$conf[2]' style='width: 200px' /><br>
  31. <input type='text' name='rw' value='$conf[3]' style='width: 200px' /><br>
  32. <input type='text' name='isbn' value='$conf[4]' style='width: 200px' /><br>
  33. <input type='text' name='gat1' value='$conf[5]' style='width: 200px' /><br>
  34. <input type='text' name='gat2' value='$conf[6]' style='width: 200px' /><br>
  35. <input type='text' name='opis' value='$conf[7]' style='width: 350px;'/><br>
  36. <input type='submit' name='submit' value='zapisz' />";
  37. echo $form;
  38. }
  39. ?>


Jak na moje oko powinno działać... ale już się gubie... w pliku baza masz jedną czy więcej książek? jak pare to tu masz jak sobie z tym poradzić...


  1. <?php
  2. $filename = "file.php"; //TU wpisz nazwe tego pliku - pliku w któreym będzie on wykonywany(jeśli nie jest includowany to daj nazwę tego pliku - jeśli jest daj tego co go includuje!!
  3. $nazwa="baza.txt";
  4. $konfiguracja = file_get_contents($nazwa);
  5. $conf2=explode("\n",$konfiguracja); //rozbijamy baze na książki
  6.  
  7.  
  8. if(isset($_POST['submit'])){
  9. $str= implode("||",$_SESSION['dane']); //łączymy tak by powstało to co mamy w bazie - by wiedzieć co zamienić
  10. $str2 = $_POST['autor']."||".$_POST['tytul']."||".$_POST['wyd']."||".$_POST['rw']."||".$_POST['isbn']."||".$_POST['gat1']."||".$_POST['gat2']."||".$_POST['opis']; //robimy string - co ma powstać w bazie
  11. $new = str_replace($str, $str2, $konfiguracja); //w zmniennej w której są dane(te które były przed operacją) zmieniamy je na to co ma powstać - powstaje nam piękny pliczek
  12.  
  13.  
  14.  file_put_contents($nazwa, $new); //wkładamy do pliku dane
  15. ?><BR><BR><BR>
  16. <center><strong>
  17. <?
  18.  echo  "Edycja książki została zapisana</A>";
  19. } elseif (isset($_GET['id'])){ //jeśli ktoś wybrał edycje
  20. $id = $_GET['id'] - 1; //zmienamy id z geta na o jedno mniejsze -bo zmienne są od zera a nie od jeden
  21. $info = explode("||", $conf2[$id]); //wybraną książkę rozkładamy na czynniki pierwsze - autor itd... 
  22.  
  23. $_SESSION['dane']['0'] = $info[0];
  24. $_SESSION['dane']['1'] = $info[1];
  25. $_SESSION['dane']['2'] = $info[2];
  26. $_SESSION['dane']['3'] = $info[3];
  27. $_SESSION['dane']['4'] = $info[4];
  28. $_SESSION['dane']['5'] = $info[5];
  29. $_SESSION['dane']['6'] = $info[6];
  30. $_SESSION['dane']['7'] = $info[7];
  31. //zapisujemy do sessji to co bylo przed edycją - przyda się przy zmienie danych /
  32. $form = "<form action='' method='POST'>
  33. <input type='text' name='autor' value='$info[0]' style='width: 200px' /><br>
  34. <input type='text' name='tytul' value='$info[1]' style='width: 200px' /><br>
  35. <input type='text' name='wyd' value='$info[2]' style='width: 200px' /><br>
  36. <input type='text' name='rw' value='$info[3]' style='width: 200px' /><br>
  37. <input type='text' name='isbn' value='$info[4]' style='width: 200px' /><br>
  38. <input type='text' name='gat1' value='$info[5]' style='width: 200px' /><br>
  39. <input type='text' name='gat2' value='$info[6]' style='width: 200px' /><br>
  40. <input type='text' name='opis' value='$info[7]' style='width: 350px;'/><br>
  41. <input type='submit' name='submit' value='zapisz' />";
  42. echo $form;
  43. } else {
  44. //wyświetlamy listę książek jakie są w bazie
  45. $starta = 0;
  46. while(isset($conf2[$starta]){
  47. $arr = explode("||",$conf2[$starta]);
  48. $starta++;
  49. echo "<a href='".$filename."?id=".$starta."'>".$arr[0]." - ".$arr[1]."</a><br>";
  50. }
  51. }
  52. ?>



Pewnie nie dziala 50 lini kodu itd.... ale tu już sam kombinuj i napraw:) nie sprawdzałem, pisałem to w oknie szybkiej odpowiedzi:)
uli
Poszukaj w necie informacji na temat indeksowania bazy danych. To podstawa, bo jak na moje, ŻADNE z pól nie wskazuje JEDNOZNACZNIE rekordu.
Po prostu dodaj pole id.

To jest podstawa KAŻDEJ bazy - czy to SQL, czy to opartej na plikach.
dadexix
Cytat
To podstawa, bo jak na moje, ŻADNE z pól nie wskazuje JEDNOZNACZNIE rekordu.
ale wszystkie razem wskazują chyba co nie? bo to hm... nie mądre by były w bazie 2 identyczne "rekordy"... a tym bardziej w tej bazie - jest ISBN - czy to czasem nie jest unikatowy "id" każdej książki? tak jest to unikatowy id:) http://pl.wikipedia.org/wiki/International...ard_Book_Number
uli
Cytat(dadexix @ 7.01.2008, 14:55:07 ) *
ale wszystkie razem wskazują chyba co nie? bo to hm... nie mądre by były w bazie 2 identyczne "rekordy"... a tym bardziej w tej bazie - jest ISBN - czy to czasem nie jest unikatowy "id" każdej książki? tak jest to unikatowy id:) http://pl.wikipedia.org/wiki/International...ard_Book_Number


Prawa. Ale szukanie po ISBN w pliku tekstowym (gdzie ISBN nie jest pierwszym rekordem) to trochę szaleńcze:) Nie uważasz?

Niemniej zwracam honor - jest to jakiś klucz smile.gif
mike
Cytat(dadexix @ 7.01.2008, 14:55:07 ) *
(...) w tej bazie - jest ISBN - czy to czasem nie jest unikatowy "id" każdej książki? tak jest to unikatowy id:) http://pl.wikipedia.org/wiki/International...ard_Book_Number
To nic nie zmienia. Przykładowy format takiego numeru to 0-306-40615-2
Format przede wszystkim zajmuje więcej miejsca i jest dużo bardziej uciążliwy dla systemów informatycznych. Gwarantuję Ci że zapytanie będę szybciej działać jeśli kluczem głównym będzie sztucznie wprowadzony indeks numeryczny.
Nazwa takiego klucza to surrogate key, inaczej mówiąc - klucz sztuczny.
dadexix
Cytat
Format przede wszystkim zajmuje więcej miejsca i jest dużo bardziej uciążliwy dla systemów informatycznych.
no ale ten ciąg był i będzie - jest potrzebny autorowi... a powiedz mi co zajmuje więcej miejsca... "UNIKALNE_ID||[....]||0-306-40615-2"(UNIKALNE ID - nasze id, [...] - reszta danych - autor, nazwa itd.) czy "[....]||0-306-40615-2"


Robienie tego na plikcah to chyba nie zbyt dobry pomysł tak czy tak... ale jak już się chce na plikach to chyba najlepiej ograniczyć ilość danych w pliku do minimum nie?

Ale ja się kłócić nie chce, jesteś napewno lepszy w temacie więc pewnie masz racje... czy Krisso wprowadzi te ID czy nie - jego wybór:)
Krisso
Nie chce zakładać kolejnego tematu więc spytam sie tutaj jak przesłać zmienną z jednego pliku do drugiego tzn.
zmiennaz pliku "edycja.php" i chciałbym ją odczytać na samym początku w "edytor.php", dlatego sie ptam czy istnieje tak możliwość questionmark.gif
A jeśli tka to proszę o małe wskazanie kierunku w którym miałbym się poruszać.
Lion_87
możesz przesłać w linku
dadexix
w linku to troche jest... hm.. nie mądre - ograniczona długość... zalecam sessje albo post:)
phpion
@dadexix odnośnie kluczy głównych
Za tworzeniem kluczy głównych jako pole liczb całkowitych (nawet w przypadku jeśli równie dobrze może być to numer ISBN) przemawiają 2 przesłanki:
- wyszukiwanie po kluczach numerycznych jest zdecydowanie bardziej wydajne (szybsze) niż po kluczach znakowych; straty poniesione w wyniku dodania nowej (teoretycznie zbędnej) kolumny zostają wynagradzane wzrostem wydajności
- utworzenie takiej kolumny dodaje faktyczny identyfikator dla rekordu. To co teraz napiszę nie jest moim wymysłem, tylko zostało przedstawione na zajęciach w firmie Kamsoft (duża firma operująca na komercyjnych wersjach Oracle - więc nie w kij pierdział). Argumentem przemawiającym za wprowadzeniem takiego klucza jest fakt, iż mimo wszystko może się zdażyć duplikacja numeru ISBN. W Kamsofcie zdarzały się przypadki osób o taki samych numerach PESEL - niby nieprawdopodobne ale jednak... i wtedy robi się kupka. Albo wyobraź sobie sytuację, że musisz powiązać tabelę główną z innymi tabelami; dodajesz wtedy do nich klucze obce będące numerem ISBN. No i fajnie. Ale co w przypadku gdy po np. miesiącu zauważysz, że się machnąłeś? Wtedy trzeba poprawiać ISBN wszędzie.

id rulez!

smile.gif
dadexix
a taqk nawiasem... jak się chce plików to może SQL lite? też plik rolleyes.gif aarambo.gif tongue.gif
Krisso
Witam, a ja ciągle z tym samym problemem tutaj tkwie :/
Ogólnie rzecz biorąc dużo mi już nie brakuje, tzn:
baza.txt
Kod
Sienkiewicz Henryk||Pan Wołodyjowski||PWN||1785||45632/75645||powiesc||historyczna||ciekawa
Sienkiewicz Henryk||Potop||PWN||1784||45562/74525||powiesc||historyczna||ciekawa
Sienkiewicz Henryk||Ogniem i Mieczem||PWN||1984||541/53||powiesc historyczna||||fajna

Ps. prosze nie sugerowac sie numerami ISDN, ponieważ w obecnej sytuacji sa to losowo trafione liczby.

edytor.php
  1. <?php
  2. $pole1 = trim($_POST['pole1']);
  3. echo '<form action="" method="post">
  4. <center><strong>Szukany Zwrot : </strong>  <center>
  5. <input type="text" name="pole1" style="width:  130px;" /><br /> <br />
  6. <input type="submit" value="Szukaj" />
  7. <br />
  8. <br />
  9. <hr>
  10. </form>';
  11. $arrFile = file( 'baza.txt' );
  12. for( $i = 0; $i < count( $arrFile ); $i++ )
  13. {
  14. list($autor[$i], $tytul[$i], $wyd[$i],$rw[$i],$isbn[$i],$gat1[$i],$gat2[$i],$opis[$i] ) = explode("||", $arrFile[$i]);
  15. $line = explode( '||', $arrFile[ $i ] );
  16. if( eregi( $pole1, $line[1])||eregi( $pole1, $line[0] ) )
  17. { //Część odpowiedzialna za zapisanie zmian w pliku
  18.  
  19. $nazwa="baza.txt";
  20. $konfiguracja = file_get_contents($nazwa);
  21. $conf=explode("||",$konfiguracja);
  22. "<form action='' method='POST'>
  23. <strong>Autor </strong> : <center><input type='text' name='autor' value='$autor[$i]' style='width: 200px' /><br>
  24. <strong>Tytuł</strong> : <center><input type='text' name='tytul' value='$tytul[$i]' style='width: 200px' /><br>
  25. <strong>Wydawnictwo</strong> : <center><input type='text' name='wyd' value='$wyd[$i]' style='width: 200px' /><br>
  26. <strong>Rok wydania </strong> : <center><input type='text' name='rw' value='$rw[$i]' style='width: 200px' /><br>
  27.  <strong>Numer ISBN </strong> : <center><input type='text' name='isbn' value='$isbn[$i]' style='width: 200px' /><br>
  28. <strong>Gatunek podstawowy </strong> : <center><input type='text' name='gat1' value='$gat1[$i]' style='width: 200px' /><br>
  29. <strong>Gatunek dodatkowy </strong> : <center><input type='text' name='gat2' value='$gat2[$i]' style='width: 200px' /><br>
  30. <strong>Opis </strong> : <center><input type='text' name='opis' value='$opis[$i]' style='width: 350px;'/><br>
  31. <br /><input type='submit' name='submit' value='zapisz' /><br>";
  32. if(isset($_POST['submit']))
  33. {
  34.  // dane pochodzące z formularza
  35. $dane = $autor."||".$tytul."||".$wyd."||".$rw."||".$isbn."||".$gat1."||".$gat2."||".$opis."\n";
  36. // przypisanie zmniennej $file nazwy pliku
  37. $file = "baza.txt";
  38. // uchwyt pliku, otwarcie do dopisania
  39. $fp = fopen($file, "a");
  40. // blokada pliku do zapisu
  41. flock($fp, 2);
  42. // zapisanie danych do pliku
  43. fwrite($fp, $dane);
  44. // odblokowanie pliku
  45. flock($fp, 3);
  46. // zamknięcie pliku
  47. fclose($fp);
  48. echo "<center><strong><p>Dane zostały zapisane!</p><br /></center></strong>";
  49.  
  50. echo  "Edycja książki została zapisana</A>";
  51. }
  52. else
  53. {
  54. echo $form;
  55. }
  56.  
  57. }
  58.  else { ; }
  59. }
  60. ?>

Tak jak jest powyżej zapisany ten program pozwala na wyszukanie odpowiedniego elementu w bazie.
Edycja jest możliwa, lecz z powodu funkcji "eregi" nie dochodzi do zapisu:
Kod
Warning: eregi() [function.eregi]: REG_EMPTY in C:\Program Files\WebServ\httpd\edytor.php on line 24
(6 takich komunikatów jednoczesnie otrzymuje, jeden pod drugim)
Chętnie wysłucham wszelkich porad.
Ps. Nie namawiajcie mnie na sql-a, ponieważ chce ten projekt wykonac tylko na plikach. Nastepny moze zrobie już w bazie smile.gif
php newbie
Też przydał by mi się taki edytor mugłby ktoś poprawi tamten kod lub podać poprawny bo nie da się tu połapać worriedsmiley.gif
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.