Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Lista z mozliwoscia edycji
Forum PHP.pl > Forum > Przedszkole
Macieqqq
Prosze o pomoc, tzn. o wytlumaczenie co po kolei robic, aby powstalo cos takiego (nie prosze o gotowy kod):

1. W formularzu wpisujemy dane dotyczace wpisu: dana_1, dana_2, itd. Zapisujemy go do pliku.
2. Wyswietlamy tylko wybrane dane z tego pliku (np. w tabelce):

Kod
wpis_1_dana_1          wpis_1_dana_3          wpis_1_dana_7
wpis_2_dana_1          wpis_2_dana_3          wpis_2_dana_7
wpis_3_dana_1          wpis_3_dana_3          wpis_3_dana_7
wpis_4_dana_1          wpis_4_dana_3          wpis_4_dana_7


3. Po kliknieciu na dany wpis, nastepuje przejscie do strony, gdzie wyswietla sie wszystkie dane o wpisie.
4. Mozliwosc edycji i usuwania wpisow, np.:

Kod
wpis_1_dana_1          wpis_1_dana_3          wpis_1_dana_7          edytuj     usun



Zalezy mi, aby zrobic to w PHP.

Teoretycznie wiam jak zrobic punkt 1 i 2, ale chcialbym sprawdzic czy dobrze mysle.



Z gory dziekuje
Pozdrawiam
puz219
a czy nie prościej jest to zrobić z wykorzystaniem bazy danych??

Tworzysz 2 tabele

1 WPISY
2 DANA

W tabeli DANA masz wszystkie dane o wpisie, natomiast do tabeli WPISY dodajesz id pól w bazie DANA na zasadzie relacyjności.

A potem to już tylko odpowiednie zapytania do sql i już.
Macieqqq
Tak jak pisalem, zalezy mi na PHP. Chcialbym, aby skrypt byl bardziej "portable" winksmiley.jpg
puz219
Cytat
Teoretycznie wiam jak zrobic punkt 1 i 2

To napisz, co i jak wykombinowałeś, to ci ewentualnie powiem, czy dobrze myślisz.

Bo tak, to nie za bardzo potrafię i pomóc, ja zawsze robię z wykorzystaniem bazy danych.

Ale jeśli chcesz zrobić program "portable", to musisz wykorzystać pliki i już pisać skrypty, które będą te pliki obsługiwać.
Macieqqq
Dodaj.php:
  1. <?php
  2. $pole1 = trim($_POST['dana1']); 
  3. $pole2 = trim($_POST['dana2']); 
  4. $pole3 = trim($_POST['dana3']); 
  5. if(empty($dana1) and empty($dana2) and empty($dana3)) 
  6. { 
  7. echo '<form action="" method="post"> 
  8. <input type="text" name="dana1" /><br /> 
  9. <input type="text" name="dana2" /><br /> 
  10. <input type="text" name="dana3" /><br /> 
  11. <input type="submit" value="Dodaj" /> 
  12. </form>'; 
  13. } 
  14. else { 
  15. $dane = $dana1.",".$dana2.",".$dana3."\n"; 
  16. $file = "wpisy.txt"; 
  17. $fp = fopen($file, "a"); 
  18. flock($fp, 2); 
  19. fwrite($fp, $dane); 
  20. flock($fp, 3); 
  21. fclose($fp); 
  22. echo "Dodano"; 
  23. }
  24. ?>


Lista.php:
  1. <?php
  2. $file = file("wpisy.txt"); 
  3. foreach($file as $value) {
  4. $exp = explode(",",$value);
  5. echo $exp[0]."-".$exp[1]."-".$exp[2]."<hr />"; 
  6. }
  7. ?>



Nie wiem tylko w jaki sposob wykorzystac to (i czy w ogole sie da), aby zrobic punkty 3 i 4.
puz219
No to spróbuj tak:

w pliku dodaj.php na końcu daj przecinek, a nie przejście do nowej linii
  1. <?php
  2. $dane = $dana1.",".$dana2.",".$dana3.",";
  3. ?>


Teraz w pliku lista.php, przy pobieraniu wartości z pliku, odpowiednio modyfikujesz $exp, tak, żeby po 3 wartościach dawało linie <hr>, a w przeciwnym wypadku dajesz "-", np. tak:

  1. <?php
  2. $exp = explode(",",$value);
  3. $licz = count($exp);
  4. for($i = 0; $i<$licz; $i++) {
  5. echo $exp[$i];
  6. if($i % 3 == 0) { echo "<hr />"; }
  7. else { echo "-"; }
  8. }
  9. ?>


Musisz tylko trochę pokombinować z modulo, bo rekordy w tablicy są liczone od 0 i jak zostawisz tak, jak napisałem, to zaraz po pierwszym rekordzie wyświetli ci linię, bo 0/3 nie daje żadnej reszty, więc warunek jest prawdziwy i wyświetli ci linię.

A jeśli chcesz, żeby mieć szczegóły danego rekordu po kliknięciu na link, to możesz stworzyć pliki o takiej nazwie jak $dana1, $dana2, itd. i potem w pliku lista.php w pętli for dajesz tak:

  1. <?php
  2. echo "<a href=\"pokaz_szczegoly.php?nazwa=".$exp[$i]."\">".$exp[$i]."</a>";
  3. ?>


Teraz tworzysz plik pokaz_szczegoly.php i dajesz na początek np. coś takiego:
  1. <?php
  2. $plik = $_GET["nazwa"].".txt";
  3. ?>
, a w dalszej części kodu, to wczytasz plik, za pomocą explode wczytasz dane do tablicy i potem wyświetlisz w żądany przez ciebie sposób.

Co do edycji i usuwania rekordów, to zauważ, że jeśli plik wpisy.txt podzielisz względem przecinków, to każde dodane przez ciebie dane mają klucze, np. 0-2 - pierwsza linijka, 3-5 - druga linijka, 6-8 - trzecia linijka, itd.

Więc teraz możesz do każdej linijki stworzyć link edytuj i usuń, do którego dodasz parametr z początkowym i końcowym kluczem, np. coś takiego
  1. <?php
  2. echo "<a href=\"edit.php?p=0&k=2\">edytuj</a>";
  3. ?>

tylko, że zamiast 0 i 2 zrobisz, tak, żeby automatycznie liczyło ci początek i koniec, a w pliku edit.php, robisz formularz, taki jak w pliku dodaj.php, tylko, że możesz jeszcze do niego dodać wartości pobrane z pliku wpisy.txt, dla odpowiednich kluczy
  1. <?php
  2. $wartosc_1= $_GET["p"];
  3. $wartosc_2= $wartosc_1+1;
  4. $wartosc_3= $_GET["k"];
  5.  
  6. $file = file("wpisy.txt"); 
  7. foreach($file as $value) {
  8. $exp = explode(",",$value);
  9. $edit1=$exp[$wartosc_1];
  10. $edit2=$exp[$wartosc_2];
  11. $edit3=$exp[$wartosc_3];
  12. }
  13.  
  14. echo '<form action="przetworz_edytuj.php" method="post"> 
  15. <input type="text" name="dana1" value="'.$edit1.'" /><br /> 
  16. <input type="text" name="dana2" value="'.$edit2.'" /><br /> 
  17. <input type="text" name="dana3" value="'.$edit3.'" /><br /> 
  18. <input type="hidden" name="begin" value="'.$wartosc_1.'" />
  19. <input type="submit" value="Edytuj" /> 
  20. </form>';
  21. ?>


Teraz po kliknięciu w edytuj, dane są wysyłane do pliku przetworz_edytuj.php, w którym najpierw wczytasz do zmiennej wartości z pliku wpisy.txt do miejsca, w którym zaczyna sie edycja, np. w taki sposób:
  1. <?php
  2. $poczatek = $_POST["begin"];
  3. $koniec = $poczatek+3;
  4.  
  5. $_dana1 = $_POST["dana1"];
  6. $_dana2 = $_POST["dana2"];
  7. $_dana3 = $_POST["dana3"];
  8.  
  9. $file = file("wpisy.txt"); 
  10. foreach($file as $value) {
  11. $exp = explode(",",$value);
  12. $licz = count($exp);
  13.  
  14.  
  15. for($y=0; $y<$poczatek; $y++) {
  16.  $zapisz .= $exp[$y];
  17.  $zapisz .= ",";
  18. }
  19. $zapisz .= $_dana1.",".$_dana2.",".$_dana3.",";
  20.  
  21. for($i=$koniec; $i<$licz; $i++) {
  22.  $zapisz .= $exp[$i];
  23.  $zapisz .= ",";
  24. }
  25.  
  26. }
  27.  
  28. $edytowane_wartosci = $zapisz;
  29. ?>


Teraz to juz tylko zapisujesz do pliku wpisy.txt zmienną $edytowane_wartosci, tylko nie dodając na końcu pliku, tylko zamieniając zawartość pliku na zawartośc zmiennej $edytowane_wartosci.

Usuwanie robisz w podobny sposób, tylko, że usuwasz tą linię np. 0-2, resztę zapisujesz do zmiennej np. $usuniete_wartosci i znów podmieniasz zawartość pliku wpisy.txt na zawartość zmiennej $usuniete_wartosci.

I to by było na tyle.

Mam nadzieję, że pomogłem.

Pozdrawiam.
Macieqqq
puz219, wydaje mi sie, ze zrobiles to tylko dla 3 wpisow, ale moge sie mylic. Troche skomplikowane...

Wydaje mi sie, ze zrobilem cos prostszeego, ale mam problemy...

Pokaz.php:
  1. <?php
  2. $plik = "db.txt";
  3. $dane = file($plik);
  4. $ile = count($dane);
  5.  
  6. for($x=0; $x < $ile; $x++) {
  7. list($dana_1[$x], $dana_2[$x], $dana_3[$x]) = explode("|~~|", $dane[$x]);
  8. echo "<a href='pokaz.php?id=$x&akcja=calosc'>".$dana_1[$x]."</a> ".$dana_2[$x]." --> <a href='edytuj.php?id=$x'>Edytuj</a> || <a href='skasuj.php?id=$x'>Skasuj</a><br />";
  9. }
  10.  
  11. if ($akcja == 'calosc'){
  12. $x = $_GET['id'];
  13. $akcja = $_GET['akcja'];
  14. echo "<a href='pokaz.php?id=$x&akcja=calosc'>".$dana_1[$x]."</a> ".$dana_2[$x]." ".$dana_3[$x]." --> <a href='edytuj.php?id=$x'>Edytuj</a> || <a href='skasuj.php?id=$x'>Skasuj</a><br />";
  15. }
  16.  
  17. ?>


Skasuj.php:
  1. <?php
  2. $plik = "db.txt";
  3. $dane = file($plik);
  4.  
  5. $x = $_GET['id'];
  6. unset($dane[$x]);
  7. $f = fopen($plik, "w");
  8. foreach($dane as $linia){
  9. fputs($f, $linia);
  10. }
  11. fclose($f);
  12. echo 'Plik usuniety. <A HREF="pokaz.php">Pokaz liste</A>.';
  13.  
  14. ?>


Tylko w Operze, po tym jak klikne "Pokaz liste" zawartosc listy sie nie odswieza (widac skasowany wiersz) - efekt daje dopiero reczne odswiezenie. Jest na to jakis sposob? Znalazlem takie rozwiazanie, ale nie wiem czy jest odpowiednie:

  1. <?php
  2. header("Cache-Control: no-store, no-cache, must-revalidate");
  3. header("Cache-Control: post-check=0, pre-check=0", false);
  4. header("Pragma: no-cache");  
  5. ?>

oraz

  1. <meta name="Pragma" content="no-cache" />
  2. <meta name="Cache-Control" content="no-store, no-cache, must-revalidate" />
  3. </head>



Czy mozecie mi pokazac jak w tym skrypcie modyfikowac dany wpis w pliku? Link zrobilem jak widac taki, jak przy usuwaniu:

  1. <a href='edytuj.php?id=$x'>Edytuj</a>


A wiec w pliku edytuj.php musialby sie zanlezc formularz, ktory odczyta dane z danego wersu w pliku, a nastepnie nadpisze zmienione dane. Przeczytalem, ze trzeba usunac dany wpis i zastapic go nowym.

Mozecie pokazac?


Z gory dziekuje
Pozdrawiam
puz219
A co to dokładnie ma być za program, do czego??
Macieqqq
Udalo mi sie zrobic plik edytuj.php:

  1. <?php
  2. if ($_POST['button'] == "wyslij") {
  3. $plik = "db.txt";
  4. if (is_writeable($plik)) {
  5. if (!$handle = fopen($plik, "a")) echo "Nie mogę otworzyć pliku...";
  6. if (fwrite($handle, $_POST['dana_1']."|~~|".$_POST['dana_2']."|~~|".$_POST['dana_3']."
  7. ") === FALSE) echo "Nie mogę zapisać danych do pliku...";
  8. else echo "Edytowano";
  9. fclose($handle);
  10. } else echo "Plik nie istnieje lub jest nie do zapisu...";
  11. }
  12. $x = $_GET['id'];
  13. $plik = "db.txt";
  14. $dane = file($plik);
  15. list($dana_1[$x], $dana_2[$x], $dana_3[$x]) = explode("|~~|", $dane[$x]);
  16. unset($dane[$x]);
  17. $f = fopen($plik, "w");
  18. foreach($dane as $linia){
  19. fputs($f, $linia);
  20. }
  21. fclose($f);
  22. echo "
  23. <form action='edytuj.php' method='post'>
  24. Dana_1: <input type='text' name='dana_1' value='".$dana_1[$x]."' /><br />
  25. Dana_1: <input type='text' name='dana_2' value='".$dana_2[$x]."' /><br />
  26. Dana_1: <input type='text' name='dana_3' value='".$dana_3[$x]."' /><br />
  27. <input type='submit'' name='button' value='edytuj' />
  28. </form> ";
  29. ?>


1. Jak zmodyfikowac kod, aby nie pojawial sie formularz po edycji, a np. sam napis "Plik zostal wyedytowany"?

2. Gdy tylko "wejde" w plik edytuj.php, wpis zostanie usuniety, nawet gdy nie dodam nowego. Co na to poradzic? Chyba trzeba jakos przekazac skryptowi, zeby usunal wpis i dodal nastepny dopiero po wcisnieciu przycisku "edytuj"?

3. Jak zmodyfikowac ten skrypt, aby dane byly nadpisywane w tej samej linii? W sumie mi na tym nie zalezy, bardziej na sortowaniu, wtedy nie bedzie dla mnie wazne czy dane sa w tej samej linii co byly. Zapytam tak - jak posortowac dane, np. wedlug drugiej kolumny?


Pozdrawiam
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.