Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sesje i dane z formularza
Forum PHP.pl > Forum > Przedszkole
-pax-
Witam serdecznie,
Tworzę prosty kreator testów jednokrotnego wyboru i napotkałem pewną przeszkodę. W pliku kreator.php mam switch:

  1. <?php
  2. switch ($krok)
  3. ?>

który prowadzi krok po kroku przez tworzenie testu. Przykładowo w pierwszym kroku wpisuje się do formularza informacje takie jak tytuł, czy liczbę pytań. W kroku 2 sprawdzam poprawność danych i w razie potrzeby wyświetlam link zwrotny, aby poprawić nieprawidłowe dane. Dostęp do kreatora mają tylko zalogowani użytkownicy, dlatego też skorzystałem z sesji, aby sprawdzać, czy użytkownik jest zalogowany. I tu pojawia się mój problem. Wcześniej, przed wprowadzeniem użytkowników, po kliknięciu przycisku przenoszącego wstecz, aby poprawić dane, wszystkie dane wpisane w pola input były zapamiętane. Teraz natomiast, po wprowadzeniu sesji, dane są kasowane i wszystko trzeba wpisywać od nowa. Czy to jest normalne zachowanie sesji? Zależy mi na tym, aby przy najmniejszym błędzie nie trzeba było wpisywać wszystkiego ponownie, tylko dane były zapamiętywane. Da się to jakoś zrobić? Może to zachowanie wynika z mojego błędu. Na początku skryptu umieściłem:

  1. <?php
  2. if (session_id() == "")
  3. ?>

Korzystam też z funkcji sprawdzającej, czy użytkownik jest zalogowany.
  1. <?php
  2. function sprawdz_uzyt()
  3. // sprawdzenie czy użytkownik jest zalogowany
  4. {
  5. if (isset($_SESSION['uzyt']))
  6. {
  7. echo 'Zalogowano jako '.stripslashes($_SESSION['uzyt']).'.';
  8. return true;
  9. }
  10. else
  11. {
  12. echo 'Nie jesteś zalogowany.';
  13. return false;
  14. }
  15. }
  16. ?>

Będę wdzięczny za wszelkie wskazówki, jak rozwiązać ten problem.
help_mee
a wszędzie podtrzymujesz sesje, aby nie wygasły?
marcio
NOm to raz to co napisal help_me ale jest jeszcze jedna rzecz gdy ty dasz link zwrotny i ktos na niego kliknie to strona sie przeladowywuje wiec to jest normalne jednak jak zrobisz skrypt w js history.back(-1) czy jakos tak to to dziala na zasadzie wstecz w przegladarce i dane zostaja w cache wiec nic sie nie kasuje ale nie jestem pewny tego co mowie i czy o to ci chodzi
-pax-
Link zwrotny mam w postaci
  1. <a href="javascript:history.back()">Wróć, aby poprawić dane.</a>

więc powinien działać prawidłowo.

Co do podtrzymywania sesji: na samym początku strony, jeszcze przed switchem, dałem session_start() " title="Zobacz w manualu PHP" target="_manual, nie wiem, czy to wystarczy. W switchu też muszę coś zapisać, aby sesje były poprawnie podtrzymywane?
help_mee
każda strona musi podtrzymywać daną sesje ;x
-pax-
Ale kod do wszystkich kolejnych kroków umieszczony jest w tym samym pliku, na jego górze jest rozpoczęcie sesji, sprawdzenie, czy użytkownik jest zalogowany i dopiero później switch z kodem do poszczególnych kroków, więc sesja jest już chyba podtrzymywana. Po dodaniu session_start() do każdego case'a i tak jest ten sam błąd.
piotrooo89
a ja do tego dołożę kodowanie utf-8 bez BOM
-pax-
Przeczytałem o tej funckji ob_start w manualu, wyszukałem kilka przykładów jej użycia, ale nadal nie wiem, jak ją zastosować u siebie.

Może dam trochę więcej kodu.
  1. <?php
  2. if (session_id() == "")
  3. if (!sprawdz_uzyt())
  4. die(' Musisz się zalogować, aby dodawać nowe testy.');
  5.  
  6. $krok = intval($_GET['krok']);
  7.  
  8. switch($krok)
  9. {
  10. case '1':
  11.  ?>
  12.  <form action="index.php?go=kreator&krok=2" method="post">
  13.  <input type="text" name="tytul" size="80" />
  14.  //Reszta inputów do wpisania danych
  15.  <input type="submit" value="Dalej" /></form>
  16.  <?php
  17.  break;
  18. case '2':
  19.  //Sprawdzenie poprawności danych
  20.  if ( (strlen($_GET['tytul']) > 250) || (strlen($_GET['tytul']) < 5 ))
  21. {
  22. echo 'Wpisano niepoprawny tytuł.<br />';
  23. $popraw = 1;
  24.  
  25.  }
  26.  //Dalsze sprawdzanie danych
  27.  if ($popraw)
  28. echo '<a href="javascript:history.back()">Wróć, aby poprawić dane.</a>';
  29.  //Jesli dane sa poprawne, przeslanie do kroku 3
  30. ?>



Co w tym przypadku musiałbym objąć funkcjami ob_start i ob_end_flush, żeby dane nie zostały wykasowane przy cofnięciu się do poprzedniej strony?
help_mee
ten kod chyba nie jest poprawnie napisany?! ;x
erix
Cytat
  1. <?php
  2. if (session_id() == "")
  3. ?>

Yyyyy...? Jest sens czegoś takiego?
-pax-
Cytat
ten kod chyba nie jest poprawnie napisany?!

A konkretniej co jest niepoprawnego? To jest tylko wycinek, który miał sprecyzować, w jaki sposób działa ten kreator, wstawianie całego skryptu mija się przecież z celem.

Cytat
Jest sens czegoś takiego?

Znalazłem taki kod w jakimś przykładzie, gdzie była sugestia, że warto sprawdzić, czy sesja jest już rozpoczęta, nie wiem do końca, czy ma to sens. Zresztą, wcześniej rozpoczynałem sesję bez tego warunku i wynik był ten sam.
kosmos
Cytat(-pax- @ 20.06.2008, 12:49:46 ) *
Wcześniej, przed wprowadzeniem użytkowników, po kliknięciu przycisku przenoszącego wstecz, aby poprawić dane, wszystkie dane wpisane w pola input były zapamiętane. Teraz natomiast, po wprowadzeniu sesji, dane są kasowane i wszystko trzeba wpisywać od nowa. Czy to jest normalne zachowanie sesji? Zależy mi na tym, aby przy najmniejszym błędzie nie trzeba było wpisywać wszystkiego ponownie, tylko dane były zapamiętywane. Da się to jakoś zrobić? Może to zachowanie wynika z mojego błędu.


Czy formularz tworzysz na takiej zasadzie questionmark.gif

  1. <?php
  2. .
  3. .
  4. .
  5. .
  6.  
  7. Imi&#281;*:
  8.  </td>
  9.  <td>
  10.  <input type=text size=50 maxlength=40 name=imie value="'.$_SESSION['imie'].'">
  11.  </td>
  12.  </tr>
  13.  <tr>
  14. <td>
  15. Nazwisko*:
  16. </td>
  17. <td>
  18.  <input type=text size=50 maxlength=40 name=nazwisko value="'.$_SESSION['nazwisko'].'">
  19. </td>
  20. .
  21. .
  22. .
  23. .
  24. .
  25. ?>


Nie wydaje mi sie ....
Aby dane były pamiętane po powrocie musisz dodać w formularzu tak jak w moim przykładzie wyraz VALUE gdzie jego wartością będzie zapamiętana w zmiennej sesyjnej wartość wpisana przez użytkownika w pole formularza.
-pax-
Dzięki, pomogło. Co dziwne, wcześniej też ustawiałem value na zmienną zapisaną w sesji, ale nic to nie dało. Najwidoczniej robiłem coś źle. Dzięki za pomoc.
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.