Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja ze zmienną statyczną, inkrementowanie zmiennej
Forum PHP.pl > Forum > PHP
dami86
Jak uzyskać efekt, żeby po naciśnięciu przycisku "Dalej" funkcja zwracała kolejne wartości zmiennej $i.
Samo wywołanie funkcji jedna pod drugą daje taki efekt, ale jak chcę to zrobić poprzez formularz wyświetla tylko jedną następna wartość i dalej już nic się nie zmienia.
Efekt chcę uzyskać bez użycia baz danych.

  1. <?php
  2.  
  3. function dalej()
  4. {
  5. static $i=0;
  6.  
  7. echo '<form name=sTest action="" method=post>
  8. <input type="radio" name="answer" value ="1"> ';
  9. echo $i;
  10. echo '<input type="submit" name="action" class="wysylanie" value="Dalej" />
  11. </form>';
  12. $i++;
  13. }
  14.  
  15. if ($i==0)
  16. {
  17. dalej();
  18. }
  19. if ($_POST["action"] == "Dalej")
  20. {
  21. dalej();
  22. }
  23. ?>


1 wywołanie wyświetla:
0 Dalej

po naciśnięciu "Dalej" wyświetla:
1 Dalej

po naciśnięciu "Dalej" wyświetla:
1 Dalej (i tak non stop)

bastard13
Możesz przetrzymywać ilość clicków w sesji: http://ru.php.net/manual/en/book.session.php
thek
Lepiej poczytaj o czasie życia zmiennych, bo jak widzę niezbyt rozumiesz. Po przeładowaniu strony zmienna statyczna Ci się zeruje! Masz więc:
1. Zmienna $i = 0, więc pierwszy IF jest prawdziwy i wykonuje się dalej() i mamy: 0 Dalej
2. Klikamy submit.
3. Łapiemy cale wyjście w OB -> ob_start, $i nam sie wyzerowało w tle po przeładowaniu, ale nie wyswietliło nam sprawdzenia $i == 0 bo to złapaliśmy funkcją ob_start, $i sie zinkrementowało do 1.
4. Był post więc drugi warunek prawdziwy, robimy ob_clean i usuwamy sobie wszystko z bufora
5. Dalej pokazuje nam 1 i inkrementuje do $i do 2.
6. Klikamy Dalej i wracamy do punktu 3 i już krązymy tak w kółko jak debile.

Nie wierzysz? Usuń sobie ob_clean() a zobaczysz, że za każdym razem w tle Ci się niejawnie wykonuje raz funkcja dalej(), ale jej wyniku nie widzisz, bo masz wszystko w buforze, który czyścisz ob_clean zanim zdołasz cokolwiek wyświetlić. Aplikacje WEBowe to nie desktop, gdzie masz funkcje cały czas w pamięci. Każda akcja skryptu jest jego wywołaniem od zera. Aby zrobić to co chcesz, musisz jakoś przesyłać między instancjami skryptu zmianną jako zmienne $_GET, $_POST lub $_SESSION.
dami86
funkcja ob_clean nie gra tutaj większej roli po jej usunięciu efekt jest nie mal identyczny poza tym, że wyświetlają się dwie linijki "0 Dalej " i "1 Dalej" czego chciałem uniknąć. Na sessjach też już próbowałem to zrobić z mizernym skutkiem dlatego spróbowałem na zmiennych statycznych. Po dodaniu tamtego postu przeczytałem na necie o zerowaniu tej zmiennej po wykonaniu skryptu o czym przed zadaniem pytania nie miałem pojęcia.

Jak jednak to logicznie rozwiązać. Sposób postępowania, który da mi uzyskać pożądany efekt. Jest to malutki fragment dużo większego projektu, który jest mi niezbędny i siedzę nad tym fragmentem i kombinuje już dłuższy czas. Wcześniej miałem ten problem rozwiązany przy wykorzystaniu baz danych ale teraz muszą to zrobić bez ich użycia.
darko
Co powstrzymuje Cię od użycia wspomnianej wcześniej sesji?
dami86
jak zastąpie zmienną statyczną zmienną sessyjna dostaje taki sam efekt...
bastard13
Dodaj session_start() na początku kodu i zamiast:
  1. static $i=0;

daj:
  1. $i = array_key_exists('counter', $_SESSION) ? $_SESSION['counter'] : 0;
  2. $_SESSION['counter'] = $i;
darko
Nie chodzi o zastąpienie zmiennej statycznej zmienną sesyjną, a o poprawne użycie mechanizmu sesji.
  1. if (isset($_SESSION['x'])) {
  2. $_SESSION['x'] += 1;
  3.  
  4. }
  5. else {
  6. $_SESSION['x'] = 1;
  7. }
  8.  
  9. var_dump($_SESSION['visit']);

[za: http://www.justskins.com/forums/session-va...blem-35191.html]
dami86
po co w tym wszystkim
  1. var_dump($_SESSION['visit']);
?
Do czego do służy?
U siebie to wyrzuciłem i skrypt spełnia swoje zadanie ale jestem ciekawy tego fragmentu...
IceManSpy
Inglisz umi?
Cytat
This function displays structured information about one or more expressions that includes its type and value.

Pokaże Ci na stronie zawartość tablicy $_SESSION , ale ładnie sformatowane, z typami danych i ich długością.
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.