Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wczytywanie danych do tabeli na bieżąco.
Forum PHP.pl > Forum > PHP
DestiX
Witam, mam do napisania skrypt, który dane z formularza (w tym przypadku imię, nazwisko i datę) będzie zapisywał do tabelki i tą tabelkę zaraz pod tym formularzem wyświetlał. Przy każdym kolejnym dodaniu rekordu ma on zostać wyświetlony razem z poprzednim, czyli jeżeli dodamy 10 nazwisk to przy każdym kolejnym dodaniu wyświetlają się wszystkie wcześniejsze plus to, które właśnie dodaliśmy. Dodatkowo skrypt ma dane zapisywać do pliku co już mam zrobione. Dostałem instrukcje, że mam działać na tablicy wielowymiarowej, jednak niestety wszystkie moje próby napisania tego skryptu zakończyły się niepowodzeniem. Wstawiam tutaj link do tego, co do tej pory napisałem, liczę, że mi jakoś pomożecie smile.gif



PS. Jeżeli mój post jest dla was nie zrozumiały to piszcie, postaram się to jakoś lepiej sformułować tongue.gif
kartin
Zapisywanie danych do trzech różnych plików ma jakiś szczególny cel?

Odczyt danych jest źle zaimplementowany. Jeśli plik z nazwiskami lub datami będzie miał mniej linii niż ten z imionami to skrypt się wysypie. To samo w przypadku, gdy nie powiedzie się otwarcie któregoś plików do dopisywania lub do odczytu.

  1. $linia = fgets($plik);
  2. $dane[0][$a] = $linia;
Zmienna $linia nie jest do niczego potrzebna. Możesz bezpośrednio przypisywać do tablicy $dane, która też nie jest potrzebna i niepotrzebnie używa pamięć.
Użycie w tym skrypcie jakichkolwiek tablic jest zbędne i jest tu robione wyjątkowo na siłę.

  1. $dane = array( array("Imie"), array("Nazwisko"), array("Data") );
W jakim celu to jest?
DestiX
Taaaa okazuje się, że te najprostsze rozwiązania są najlepsze. Długo myślałem nad tym wszystkim a okazuje się, że wystarczyło dodać jedną zmienną, która robiła za licznik i skrypt działa tak jak powinien. Dzięki za pomoc. Temat do zamknięcia.
kartin
Wystarczy, że z jakiegokolwiek powodu nie powiedzie się zapis do pliku z nazwiskami lub datą i już pliku będą miały różną ilość linii. Dodatkowo po kolejnych zapisach nowe dane będą pomieszane - imię, nazwisko i data w danej linii nie będą pasowały do siebie.

Z czym konkretnie masz problem z wyświetlaniem danych po zapisie? Nie wiesz jaki warunek wpisać w if, czy chodzi o coś innego?
Dodatkowo ostatni wiersz w tabeli z odczytanymi danymi będzie pusty.
DestiX
Wszystko już działa jednak skoro mówisz, że może być problem z 3 plikami to jak te dane zapisać w jednym pliku a potem odpowiednio wczytywać imię nazwisko i datę ?
Turson
Rozdzielaj dane średnikiem, żeby wyglądało tak:
Imię;Nazwisko;Data
Imię2;Nazwisko2;Data2

wtedy explode ładnie rozdzieli na każdy element osobno
DestiX
Fajne to explode nie powiem nie powiem tongue.gif Zrobiłem to tak:
  1. if (isset($_POST['Zapisz'])) {
  2. if ($_POST['imie'] == '' || $_POST['nazwisko'] == '' || $_POST['data'] == ''){
  3. echo 'Musisz Uzupełnić Pola.';
  4. } else {
  5. $b++;
  6.  
  7. $tab[0] = $_POST['imie'];
  8. $tab[1] = $_POST['nazwisko'];
  9. $tab[2] = $_POST['data'];
  10. $plik = "dane.txt";
  11. $licznik = "licznik.txt";
  12. $fp = fopen($plik, "a+");
  13. fwrite($fp, ucfirst($tab[0]).";".ucfirst($tab[1]).";".$tab[2].";\r\n");
  14. fclose($fp);
  15. $fp = fopen($licznik, "w");
  16. fwrite($fp, $b);
  17. fclose($fp);
  18. echo('<table border="1" cellpadding="4" width="400px">
  19. <th align="center">Imię</th>
  20. <th align="center">Nazwisko</th>
  21. <th align="center">Data</th>
  22.  
  23. ');
  24. $plik = fopen('imiona.txt', 'r');
  25. for($o=0; $o<$b; $o++)
  26. {
  27. $data = fgets($plik);
  28. $nazwiska = explode(";", $data);
  29.  
  30. $dane[0][$o] = $nazwiska[0];
  31. $dane[1][$o] = $nazwiska[1];
  32. $dane[2][$o] = $nazwiska[2];
  33.  
  34. <tr>
  35. <td align="center">'.$dane[0][$o].'</td>
  36. <td align="center">'. $dane[1][$o].'</td>
  37. <td align="center">'.$dane[2][$o].'</td>
  38. </tr>
  39.  
  40. ');
  41. }
  42. }
  43. }


Coś mi się wydaje, że za dużo tych zmiennych niepotrzebnie dałem ale nie jestem pewny.

Dodatkowo, posiadam plik ze zmienną sterującą i tutaj rodzi się pytanie, jak zrobić aby plik po utworzeniu od razu zawierał znak, w tym przypadku cyfrę 0?. Ale gdy plik już jest utworzony to nie zmienia istniejącej tam wartości.
nospor
Po co robisz te tablice i do nich przypisujesz wartosci, skoro tak naprawde do niczego te tablice nie sluża? Nie mozesz od razu robic z wartosciami to co chcesz, tylko musisz to wrzucac do tablicy? Przeciez to nie ma zadnego sensu
DestiX
Dane mam wrzucić do tablicy i operować na tablicy, dodatkowo mam jeszcze użyć tablicy wielowymiarowej ale nie do końca ogarnąłem jeszcze jak to działa. Taki wymysł nauczyciela tongue.gif Nic na to nie poradzę tongue.gif.
nospor
1) przestan bez sensu pokazywać jęzor
2) Nie wierze, ze nauczyciel kazal ci robic tak:
  1. $tab[0] = $_POST['imie'];
  2. $tab[1] = $_POST['nazwisko'];
  3. $tab[2] = $_POST['data'];
  4. $plik = "dane.txt";
  5. $licznik = "licznik.txt";
  6. $fp = fopen($plik, "a+");
  7. fwrite($fp, ucfirst($tab[0]).";".ucfirst($tab[1]).";".$tab[2].";\r\n");

Powinno byc tak:
  1.  
  2. $plik = "dane.txt";
  3. $licznik = "licznik.txt";
  4. $fp = fopen($plik, "a+");
  5. fwrite($fp, ucfirst($_POST['imie']).";".ucfirst($_POST['nazwisko']).";".$_POST['data'].";\r\n");

Smiem twierdzic, ze zle zrozumiales zadanie.
DestiX
Mistrzem php nie jestem więc możliwe, że jakoś źle to zrozumiałem.

Czyli to ma być tak ? Zwróć proszę uwagę na wyświetlanie tabelki. Czy taki sposób jak tutaj przedstawiam to dobre wykorzystanie tablicy wielowymiarowej ?

  1. $plik = "dane.txt";
  2. $licznik = "licznik.txt";
  3. $fp = fopen($plik, "a+");
  4. fwrite($fp, ucfirst($_POST['imie']).";".ucfirst($_POST['nazwisko']).";".$_POST['data'].";\r\n");
  5. fclose($fp);
  6. $fp = fopen($licznik, "w");
  7. fwrite($fp, $b);
  8. fclose($fp);
  9. echo('<table border="1" cellpadding="4" width="400px">
  10. <th align="center">Imię</th>
  11. <th align="center">Nazwisko</th>
  12. <th align="center">Data</th>
  13.  
  14. ');
  15. $plik = fopen('dane.txt', 'r');
  16. for($o=0; $o<$b; $o++)
  17. {
  18. $data = fgets($plik);
  19. $nazwiska = explode(";", $data);
  20.  
  21. $dane[0][$o] = $nazwiska[0];
  22. $dane[1][$o] = $nazwiska[1];
  23. $dane[2][$o] = $nazwiska[2];
  24. $tablica_osoby[0] = $dane;
  25.  
  26. <tr>
  27. <td align="center">'.$tablica_osoby[0][0][$o].'</td>
  28. <td align="center">'. $tablica_osoby[0][1][$o].'</td>
  29. <td align="center">'.$tablica_osoby[0][2][$o].'</td>
  30. </tr>
nospor
To juz jest tablica wielowymiarowa
$dane[0][$o]
robienie jeszcze
$tablica_osoby[0] = $dane;
jest juz totalnym bezsensem

Poza tym powinno byc:
$dane[$o][0]
a nie jak masz teraz
$dane[0][$o]

poza tym o to mozna skrocic... Czyli nie:

  1. $nazwiska = explode(";", $data);
  2. $dane[0][$o] = $nazwiska[0];
  3. $dane[1][$o] = $nazwiska[1];
  4. $dane[2][$o] = $nazwiska[2];
  5. $tablica_osoby[0] = $dane;

a:
  1. $nazwiska = explode(";", $data);
  2. $dane[$o] = $nazwiska;

I juz

DestiX
Super, poprawiłem to wszystko i działa. A powiesz mi jeszcze jak z tym plikiem ? Potrzebuję aby plik "licznik.txt" tylko i wyłącznie podczas tworzenia miał od razu wpisaną cyfrę 0. Jeżeli plik istnieje to nie zmienia się jego zawartość.
nospor
Nie bardzo rozumiem w czym problem....
Jak pliku nie ma, i go tworzysz, to wpisuj mu to 0. Jak jest, to mu nic nie wpisuj. Do sprawdzania czy plik istnieje czy nie uzywa sie file_exists().


ps: a po co ci w ogole ten plik licznik.txt?

To wymysl Twojego nauczyciela czy Twoj?
kartin
Cytat(DestiX @ 11.06.2014, 11:21:26 ) *
Potrzebuję aby plik "licznik.txt" tylko i wyłącznie podczas tworzenia miał od razu wpisaną cyfrę 0. Jeżeli plik istnieje to nie zmienia się jego zawartość.
Czyli już wiesz jaki ma być warunek w if oraz co i w jakim przypadku ma być wykonywane.
DestiX
w tym pliku jest przechowywana zmienna "b", która mówi ile rekordów ma się pokazać na stronie głównej w momencie dodania kolejnego nazwiska. Inaczej tego nie potrafiłem zrobić gdyż po przeładowaniu skryptu zmienna się zerowała i nie wczytywała się lista nazwisk.
nospor
Czyli Twoj wymysl... zmienna $b nie jest ci do niczego potrzebna... zamiast rekordy czytac FORem, czytaj jest przy pomocy WHILE.
W manualu masz pokazane jak czytac plik linia za linią az sam sie skonczy
http://pl1.php.net/fgets
DestiX
W takim razie zmienię to.
Dzięki wielkie za pomoc smile.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.