Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Rejestracja w kilku krokach
Forum PHP.pl > Forum > PHP
falcone


A więc, mam pewien problem ze swoim skryptem rejestracji nowych użytkowników serwisu. Proces tworzenia nowego user'a jest taki jak na powyższym rysunku, tzn. składa się z trzech kroków, z których każdy jest osobnym plikiem PHP. Między kolejnymi etapami dane już podane są przesyłane metodą POST. Aby nie 'stracić' danych wprowadzonych w pierwszym kroku gdy dochodzimy do ostatniego, w pliku 'krok2.php' dane z tablicy $_POST wrzucam do ukrytych (atrybut hidden) znaczników <INPUT> jako ich wartość poniższą metodą:

  1. <INPUT (...) VALUE=" <?php echo $_POST['zmienna_z_1_kroku']; ?> ">


Wszystko niby dobrze, ale mam z tym skryptem jeden problem i jedną wątpliwość na dokładkę. Po pierwsze, jeśli ktoś specjalnie bądź przez nieuwagę odświeży którąś ze stron to wszystko co do tej pory było w tablicy $_POST jak wiadomo 'gine'. Muszę taką okoliczność wyifować, delikwenta przerzucić do pierwszego kroku i wyświetlić informację, że niestety ale ma pecha bo wszystko zaczyna od początku tongue.gif Druga rzecz to wspomniana wątpliwość. Chodzi o to, że nie jestem do końca przekonany do całego modelu rejestracji. Z podziału na etapy/kroki nie mogę zrezygnować z tego powodu, że to co będzie możliwe do wyboru w stepie trzecim jest zależne od tego co niedoszły użytkownik wybrał w stepie pierwszym itd. Moje wątpliwości budzi jednak wybór metody POST do obsługi tego skryptu. Pytanie moje brzmi, jak rozwiązać problem takiej kilkustopniowej rejestracji. Jakby to mogło przyzwoicie/profesjonalnie być rozwiązane? Dodatkowo powiem, że każdy z trzech kroków nie musi znajdować się w osobnym pliku, mogą być zawarte w jednym z zastrzeżeniem, że np. każdy 'etap' będzie osobnym if'em, czyli poniekąd będzie wyraźny podział rejestracji na trzy części. Z góry dziękuję za wszelkie odpowiedzi i komentarze smile.gif
erix
A o sesjach, to Waść nie słyszał?
falcone
A właśnie, nie wspomniałem. Myślałem tu o sesjach, ale w pierwszej chwili wydało mi się, że gdy będę wprowadzane dane odbierał przez POST, a następnie przechowywał w tablicy $_SESSION to będzie to jakieś za bardzo przekombinowane tongue.gif Nie mam póki co doświadczenia w pisaniu aplikacji webowych i po prostu odniosłem wrażenie, że w takim stylu w jakim chciałbym to zaklepać się zwyczajnie nie pisze. Może jednak jestem w błędzie i takie 'przeplatanie' POST i sesji to częsta praktyka? No bo z jednej strony mam już coś w tablicy $_POST i mogę z tego skorzystać, a z drugiej jeszcze raz to zapisuję na serwerze z użyciem sesji...
erix
Właśnie sesje są do tego celu, użyszkodnik ma tylko podstawiać, do którego kroku przechodzić, po co tyle danych niepotrzebnie przesyłać?
falcone
Po co? Dobre pytanie tongue.gif Jakbym mógł, to bym w ogóle nie używał tablicy POST do tego całego 'przesyłania'. Sęk w tym, że nie wiem jak inaczej miałbym odebrać dane wprowadzone w formularzu (np. z pierwszego kroku) jeśli właśnie nie przez $_POST - $_GET odpada z wiadomych powodów smile.gif ...
R4D3K
Najprostsza metoda, żeby step 2 czy 3 był odporny na odświeżanie to :
  1. <?php
  2. if (isset($_POST['zmienna_z_1_kroku'])) {
  3.   // STEP 2
  4. }
  5. else {
  6. // odświeżasz stronę wiec cfaniaku wracaj do STEP 1
  7. }
  8. ?>


Ale jak pisze erix, jeśli zapiszesz sobie dane z POSTu do SESSION to będziesz mógł przejść dalej i nawet jak user odświeży stronę to spowrotem załadujesz sobie dane z tablicy SESSION
bełdzio
wkładaj po każdym kroku do bazy; i tak wszystkie przesłane dane wylądują w bazie więc po co bawić się w tymczasowe trzymanie ich w hidden albo w sesji? po kazdym kroku wrzucasz dane do bazy + oznaczasz, że są niekompletne, po ostatnim kroku zmieniasz flage na kompletne i juz smile.gif
Kshyhoo
Proponuję if zamienić na switch:
  1. <?php
  2. if (isset($_POST['krok']) && $_POST['krok'] == "1") {
  3.  
  4. echo "<form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST'>";
  5.  
  6. // tu krok 1
  7.  
  8. echo "<input type='hidden' name='krok' value='2'>\n";
  9. echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  10.  
  11. } elseif (isset($_POST['krok']) && $_POST['krok'] == "2") {
  12.  
  13. echo "<form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST'>";
  14.  
  15. // tu krok 2
  16.  
  17. echo "<input type='hidden' name='krok' value='3'>";
  18. echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  19.  
  20. } elseif (isset($_POST['krok']) && $_POST['krok'] == "3") {
  21.  
  22. echo "<form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST'>";
  23.  
  24. // tu krok 3
  25.  
  26. echo "<input type='hidden' name='krok' value='4'>\n";  
  27. echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  28.  
  29. } else {
  30.  
  31. echo "<form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST'>";
  32.  
  33. // tu strona łądowana jako pierwsza
  34.  
  35. echo "<input type='hidden' name='krok' value='1'>\n";  
  36. echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  37.  
  38. }
  39. ?>
falcone
Cytat(bełdzio @ 5.07.2009, 17:47:06 ) *
wkładaj po każdym kroku do bazy; i tak wszystkie przesłane dane wylądują w bazie więc po co bawić się w tymczasowe trzymanie ich w hidden albo w sesji?

Chyba jednak zostanę przy POST i sesji. Takie wkładanie do bazy na raty nie za dobrze mi się kojarzy. Wierząc, że każdy kto przejdzie pierwszy krok, przejdzie i następne i z sukcesem zakończy proces rejestracji nie ma się o co martwić. Jeśli jednak nasz użyszkodnik przestraszy się tego, jakie informacje się chce od niego wyciągnąć na finish'u całego formularza i jednym kliknięciem opuści nasz serwis - o zgrozo - pozostajemy z niekompletnymi rekordami w bazie danych, które trzeba cyklicznie sprawdzać i sukcesywnie usuwać. A co gdy np. wspomniany wcześniej, niedoszły user serwisu się zreflektuje i zapragnie dokończyć rejestrację? Mamy się zaprzeć nawróconego grzesznika? Zatem dopuszczamy go do procesu rejestracji. Okazuje się jednak, że podaje on inny login niż w ostatnim niedokończonym procesie. Czyli tak, login podmieniamy na nowy w naszej bazie, email bez zmian i dalej puste pola... może się wkrótce zapełnią? A więc nadal czekamy, nie czyścimy wpisu w bazie. Albo usuwamy i zaczynamy od nowa? Jednym słowem, za dużo hałasu o nic. Jak dla mnie, jeśli wrzucać coś do bazy - to tylko w pełnym składzie, aż po lewego skrzydłowego - nigdy na raty.

Co do ostatecznego rozwiązania, wybrałem zwyczajnie pobieranie danych z formularzy metodą POST, które zaraz potem trafiają do sesji (broń Boże do ciastek). Ustawiam na nią jakiś rozsądny czas, żeby niedokończona rejestracja nie odbiła się za bardzo czkawką całemu systemowi, natomiast, żeby można ją spokojnie doprowadzić do końca. If succeed - sru i nie ma sesji, dane trafiają do bazy i znika wszelki ślad po ostatniej działalności na formularzach. Teraz tylko poszukam na forum jakiegoś tematu o automatycznym czyszczeniu plików sesyjnych na serwerze i można by rzec... formularz gotowy tongue.gif Łaaał smile.gif
KoPcIu
Ostatnio borykałem się z takim samym problemem winksmiley.jpg Skorzystałem z POST lecz, po czasie było to trochę denerwujące, jedno odświeżenie strony i nie ma nic, a więc myślałem jak naprościej napisać to na sesjach i wpadłem na:

  1. <?php
  2. if(isset($_POST['step1']))
  3. {
  4.    $_SESSION['step'] = 1;
  5. } elseif(isset($_POST['step2']))
  6. {
  7.    $_SESSION['step'] = 2;
  8. }
  9. ?>


+ do tego wyświetlenie danych:

  1. <?php
  2. if(empty($_SESSION['step']))
  3. {
  4. echo 'Krok Pierwszy<br>';
  5. echo '<form action="" method="post">';
  6.     echo '<input type="submit" name="step1" value="Następny krok">';
  7. echo'</form>';
  8. } else if($_SESSION['step'] == 1)
  9. {
  10. echo 'Krok Drugi<br>';
  11. echo '<form action="" method="post">';
  12.      echo '<input type="submit" name="step2" value="Następny krok">';
  13. echo'</form>';
  14. }
  15. ?>


A jeśli chodzi o zapis danych aby nie tracić ich, to najlepsza będzie sesja.

Tam gdzie u mnie w kodzie jest dodawanie sesji krok, możesz wstawić też zapis danych z formularza winksmiley.jpg

Jeśli chodzi o czyszczenie danych sesji to:
  1. <?php
  2. ?>

Możesz je wykorzystać podczas wyświetlenia tekstu końcowego winksmiley.jpg Czyli np dziękujemy za rejestrację winksmiley.jpg

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