Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przejście do ostatniego pola tablicy
Forum PHP.pl > Forum > Przedszkole
hub3rt
Mam taki problem. Piszę skrypt głosowania. Użytkownicy dodają wartości, które są dopisywane do tablicy do pliku txt. Mam problem z nadawaniem unikalnego ID dla każdej wartosci dodanej przez uzytkownikow. Wymyśliłem taki sposób, żeby $id w tablicy był zapisywany na końcu. Wygląda to tak:

jakis tekst|autor|godzina|punkty|input_radio|id
jakis tekst|autor|godzina|punkty|input_radio|id
jakis tekst|autor|godzina|punkty|input_radio|id
jakis tekst|autor|godzina|punkty|input_radio|id

itd. jak ktoś coś dodaje. Wymyslilem sobie ze tablica jest wczytywana i wyswietlana na stronie. input_radio to oczywiscie takie koleczko tongue.gif radio button czy jakos taksie to nazywa. A pod tabelka (ktora przedstawia zawartosc tablicy) jest przycisk 'Głosuj'. Wszystko mieści się w ramach formularza. Ale problemem jest dla mnie ustawianie unikalnego 'id' dla każdego tekstu dodanego. Probowalem w ten sposob:
  1. <?php
  2. @ $plikid = file("grypsy.inc", 'a');
  3.  
  4. $ostatniid = count($plikiid);
  5. ?>

Nie działało...wyskakiwał error a id zawsze wynosil 1 (bo dalej mam tak, ze jezeli ostatni id = 0 to nadaj mu wartosc 1 i idz dalej).
To zrobiłem w ten sposób:
  1. <?php
  2. @ $plikid = file("grypsy.inc", 'a');
  3.  
  4. $ostatni = count($plikiid);
  5. $ostatniid = $ostatniid[$ostatni];
  6. ?>

Teraz $id dziala...cos takiego istnieje w ogole, ale zawsze ma wartosc 1. Czyli skrypt nie moze znalezc ostatniego IDa dlatego nadaje mu wartosc 1. Wklejam tu caly kod...moze ktos zauwazy jakas nieprawidlowosc razaca sadsmiley02.gif

Probuje te glosowanie zrobic od tygodnia, ale nic nie dam rady zmienic. O co chodzi? worriedsmiley.gif

  1. <?php
  2. $data = date('H:i [j.m.Y]');
  3. $punkty = 0;
  4. $tytul = htmlspecialchars($tytul);
  5.  
  6. @ $plikid = file("grypsy.inc", 'a');
  7.  
  8. $ostatni = count($plikiid);
  9. $ostatniid = $ostatniid[$ostatni];
  10.  
  11. if( $tytul == '' )
  12. {
  13.  echo('Nie wpisałeś grypsu!');
  14. }
  15. if( $autor == '' )
  16. {
  17.  echo('Nie wpisałeś autora!');
  18. }
  19. else
  20. {
  21. if ( $ostatniid > 0 )
  22. {
  23. $dane = $tytul."t".$autor."t"
  24.  .$data."t".$punkty."t"."<input type='radio' value='".$id."' name='".$id."'>"."t".$id."n";
  25.  
  26. @ $plik = fopen("grypsy.inc", 'a');
  27.  
  28. flock($plik, LOCK_EX);
  29.  
  30. fwrite($plik, $dane);
  31. flock($plik, LOCK_UN);
  32. fclose($plik);
  33.  
  34. echo('Dodano');
  35. echo '<br><a href="index.php">Strona główna</a>';
  36. }
  37. else
  38. {
  39.  $id = 1;
  40. $dane = 
  41. $dane = $tytul."t".$autor."t"
  42.  .$data."t".$punkty."t"."<input type='radio' value='".$id."' name='".$id."'>"."t".$id."n";
  43.  
  44. @ $plik = fopen("grypsy.inc", 'a');
  45.  
  46. flock($plik, LOCK_EX);
  47.  
  48. fwrite($plik, $dane);
  49. flock($plik, LOCK_UN);
  50. fclose($plik);
  51.  
  52. echo('Dodano');
  53. echo '<br><a href="index.php">Strona główna</a>';
  54. }
  55. }
  56. ?>


Prymitywne, ale jestem poczatkujacy.
mike
1. Błędy, które "wypluwa" php są bardzo często nieocenioną podpowiedzią. Radzę je czytać. I nie tłumić ich za pomocą @ (usuń to).
2.
Cytat(hub3rt @ 2005-09-24 22:14:33)
  1. <?php
  2. @ $plikid = file("grypsy.inc", 'a');
  3.  
  4. // (...)
  5. ?>
MANUAL exclamation.gif! Gdybyś choć na sekundę tam zajrzał to byś nie miał problemu i wiedział, że file() przyjmuje trochę inne parametry niż fopen().
hub3rt
file() otwiera plik do tablicy, czyż nie? Ty chyba nie czytałeś mojego posta...
mike
Owszem, ale nie posiada modyfikatorów dostępu: a, r, w, ....
1. Usuń @ to php Ci powie co robisz źle;
2. Przeczytaj dokumentację file() i załączone przykłady.
hub3rt
1. Tak, usunąłem i nie ma żadnych errorów. Nic mi nie mówi.

2. Przeczytałem, przjerzalem przykłady i dokonalem epokowego odkrycia - funkcja count() liczy linie czyli rozumiem, że poziomo. Ale nie znalazłem skryptu, który umożliwiłby wyświetlenie wartości wybranej komórki. help :/
NuLL
  1. <?php
  2. @ $plikid = file("grypsy.inc", 'a');
  3.  
  4. $ostatniid = count($plikiid)-1;
  5. ?>

Tablica jest indexowana od zera z tego co mi wiadomo a nie od jednego a od tylu liczy count(). Pozatym nielepiej zastosować end() :?:
hub3rt
Jak pisałem w pierwszym poście używałem end(), ale oto wynik:
Warning: Variable passed to end() is not an array or object in c:/foxserv/www/grypsy2/dodaj.php on line 13

a $id = 1 zawsze...tylko z count() nie było żadnego errora
Morkai
A skąd jest zmienna $id, gdy $ostatniid > 0?
Po co zapisujesz do pliku <input />?

Przepisz kod wykorzystując tablice $_POST, $_GET, ....

Pobieranie ostatniego ID nie powinno wyglądać tak?
  1. <?php
  2.  
  3. $plikid = file( 'grypsy.inc' );
  4.  
  5. $ostatni  = explode( "t", $plikid[ sizeOf( $plikid ) - 1 ] );
  6. $ostatniid = intVal( $ostatni[ sizeOf( $ostatni ) - 1 ] );
  7.  
  8. ?>
mike
Dwa razy Cię prosiłem, żebyś zajrzał do dokumentacji file(), za pierwszym razem podałem Ci co robisz źle. A Ty mi zarzucasz jeszcze że posta nie czytałem.

Tak jak powiedziałem dwa ray Cie prosiłem i trzeci raz nie zamierzam.
Dostajesz ostrzeżenie za niechęć do manuala.

Żeby nie było żalu to w spadku dostaniesz jeszcze dwie rzeczy:
Odpowiedź:
Nie tak:
  1. <?php
  2. $arrTab = file( 'plik.txt', 'a' );
  3. ?>

tylko tak:
  1. <?php
  2. $arrTab = file( 'plik.txt' );
  3. ?>

( napisałem Ci, że masz złe parametry )

Podpowiedź:
Żeby dowiedzieć się co jest źle i jakie błądy generuje php dopisz sobie na początku skryptu:
  1. <?php
  2.  
  3. error_reporting( E_ALL );
  4. ini_set( 'display_errors', 1 );
  5. // ...
  6.  
  7. ?>

i pzestań używać @.

----edit----
O widzę, że @Morkai podał juz odpowiedź co jest źle.
Nie zmienia to faktu że ostrzeżenie dostajesz.
~mike_mech
hub3rt
(Ja napisalem to na gorze. Zeby lepiej bylo widac te cytaty jeszcze raz wysylam.)

Cytat
2. Przeczytałem, przjerzalem przykłady i dokonalem epokowego odkrycia - funkcja count() liczy linie czyli rozumiem, że poziomo. Ale nie znalazłem skryptu, który umożliwiłby wyświetlenie wartości wybranej komórki. help :/

Cytat
Tak jak powiedziałem dwa ray Cie prosiłem i trzeci raz nie zamierzam.
Dostajesz ostrzeżenie za niechęć do manuala.

Cytat
1. Tak, usunąłem i nie ma żadnych errorów. Nic mi nie mówi.

Cytat
i pzestań używać @.

Więc...nierozumiem Twojej wypowiedzi. Po co udajesz wielkiego bohatera jak nie chcesz, albo nie potrafisz pomóc?! Twoja "odpowiedz w spadku" jest bezuzyteczna, bo pisałeś to w pierwszym swoim poście i wycztalem to z manuala. Po co sie powtarzasz? Dostalem ostrzezenie za to, ze nie doczytujesz moich postow. Nie rozumiesz ich, albo nie chcesz zrozumieć. Wiec jak nie znasz odpowiedzi to po co odpisujesz? Chcesz mieć jak najszybciej 1000 postow?! Czy co?

----edit----
Usunąłem tego posta, którego napisałeś jak niezarejestrowany. Będzie czytelniej winksmiley.jpg
~mike_mech
mike
Cytat
Warning: Variable passed to end() is not an array or object in c:/foxserv/www/grypsy2/dodaj.php on line 13
Dostawałes taki komunikat dlatego że to co przekazywałeś nie było tablicą. count() takiego komunikatu nie wywala bo ona przyjmuje wszystko, ale jak coś nie jest tablicą to zwraca jeden (dlatego tak miałeś). Oznacza to, że źle tworzyłeś tą tablicę. Przede wszystkom źle urzywałeś funkcji file() a dodatkowo możesz mieź złą ścieżkę do pliku (tego nie wiem).

Powiedz jak to działa teraz :?:
  1. <?php
  2.  
  3. error_reporting( E_ALL );
  4. ini_set( 'display_errors', 1 );
  5.  
  6. $data = date( 'H:i [j.m.Y]' );
  7. $punkty = 0;
  8. $tytul = htmlspecialchars( $tytul );
  9.  
  10. $plikid = file( 'grypsy.inc' );
  11.  
  12. $ostatniid = count( $plikiid );
  13.  
  14. if( $tytul == '' )
  15. {
  16. echo('Nie wpisałeś grypsu!');
  17. }
  18.  
  19. if( $autor == '' )
  20. {
  21. echo('Nie wpisałeś autora!');
  22. }
  23. else
  24. {
  25. if ( $ostatniid > 0 )
  26. {
  27. $dane = $tytul . "t" . $autor . "t" . $data . "t" . $punkty . "t" . "<input type='radio' value='" . $id . "' name='" . $id . "'>" . "t" . $id . "n";
  28.  
  29. $plik = fopen( "grypsy.inc", 'a' );
  30.  
  31. flock($plik, LOCK_EX);
  32.  
  33. fwrite($plik, $dane);
  34. flock($plik, LOCK_UN);
  35. fclose($plik);
  36.  
  37. echo('Dodano');
  38. echo '<br><a href="index.php">Strona główna</a>';
  39. }
  40. else
  41. {
  42. $id = 1;
  43. $dane = $tytul . "t" . $autor . "t" . $data . "t" . $punkty . "t" . "<input type='radio' value='" . $id . "' name='" . $id . "'>" . "t" . $id . "n";
  44.  
  45. $plik = fopen( "grypsy.inc", 'a' );
  46.  
  47. flock($plik, LOCK_EX);
  48.  
  49. fwrite($plik, $dane);
  50. flock($plik, LOCK_UN);
  51. fclose($plik);
  52.  
  53. echo('Dodano');
  54. echo '<br><a href="index.php">Strona główna</a>';
  55. }
  56. }
  57.  
  58. ?>

P.S. To jest na bazie Twojego kodu, ale naprawde powinieneś się przerzucić na tablica superglobalne $_POST, $_GET, ...

P.S. 2 Nie martw się - czytam Twoje posty.
Ociu
Ja proponuje:
  1. <?php
  2. $ostatni = count($tablica);
  3. ?>

Tablice są indexowane od 0, więc count wzróci następne, unikanlne id smile.gif
przykład: 0, 1, 2, 3, 4 - zwróci 5, czyli następne unikalne id smile.gif

pozdrawiam
hub3rt
Ok. Działa nareszcie! Mike_mech...Twoja zmiana nic nie dała, niestety :/ Ale Ociu Twoja rada zadziałała. Wcześniej już używałem count() ale nie było żadnego skutku. Przerobiłem kod Mike_mecha dodając to co napisał Ociu i jest O.K. smile.gif Dzieki wielkie.

[edit]

Mam teraz inny problem tongue.gif Rowniez zwiazany z elementem tablicy. Dot. tej samej tablicy co w poprzednim problemie. Ale teraz jest cos takiego, ze:
1. laduje plik z tablica
2. rozbijam tablice za pomoca explode()
3. szukam linii numer $id
4. zmieniam wartosc komorki $punkty dodając do niej 1

mam nadzieje, ze jasno wytlumaczylem. Teraz chyba bedzie trudniej...:/ bo to nie bedzie znalezienie ostatniej wartosci tylko tej wybranej!
+----------+-----+--------+-------+------------+--+
|jakis tekst|autor|godzina|punkty|input_radio|id|
|jakis tekst|autor|godzina|punkty|input_radio|id|
|jakis tekst|autor|godzina|punkty|input_radio|id|
|jakis tekst|autor|godzina|punkty|input_radio|id|
+-----------+-----+--------+-------+------------+-+
przypominam tablice. Mam znalezc wartosc komorki punkty z linii id
mike
Są dwie metody, zalezne od przechowywania danch:
1. W sytuacji kiedy wartości id sa ułożone po kolei od 1 do n to szukasz, np.: dla id = 10, wartości 9 z tablicy zawierającej wczytany plik (indeksoanie od zera);
2. Jeżeli wartości id są ułozone losowo to możesz:
- "przelecieć" smile.gif tablice uzyskaną za pomoca file() pętlę i w każdym obrocie rozbijać bierzący wiersz za pomocą explode() i sprawdzać za pomoca if czy wartość id ma szukaną wartość, jeżeli tak to znalezione, jeżeli nie to "lecimy" dalej;
- za pomoca file() i explode() stworzyć tablicę wielowmiarową (prawie to samo co wyżej) ale wyszukać wiersz możemy za pomocą jednej z funkcji do przeszukiwania tablic wielowymiarowych, które znajdziesz pod dokumentacją array_search() wśród komentarzy użytkowników (jest tam kilka).
hub3rt
Tzn. w tej chwili wszystkie id'y są w kolejności dodawania czyli 1, 2, 3, 4, 5, ...itd. ale wkrótce to zmienie. Będą sortowane według liczby pkt. A co do tej tablicy wielowymiarowej to będzie tak, że znajdzie id. Ok, ale ostatecznym tym konkretnym celem jest komórka 'punkty' obok konkretnego id'u smile.gif rozumiesz? heh, taka jakby sonda w której pytania dodają użytkownicy a następnie mogą głosować. Tylko, że skrypt musi sam się wywiedzieć ile jest w chwili głosowania pytań (bo za każdym razem ta liczba może się zmienić), znaleźć id pytania na które został oddany głos i na koniec zmienić wartość komórki punkty przy tym pytaniu (numerze id). Troche to zagmatwane. Ale to jest najtrudniejsza część całego skryptu. Zapytałbym o to wcześniej ale zapomnialem. Jak to zrobie to pojdzie z gorki <- mam nadzieje :|

[edit]
Proszę o konkretny i szeczógłowy opis rozwiazania. smile.gif Taki troche jak dla malego dziecka (albo idioty jak kto woli winksmiley.jpg ), bo moge nie zrozumiec tongue.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.