Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Rejestracja w kilku krokach
falcone
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.06.2009

Ostrzeżenie: (0%)
-----


(IMG:http://img193.imageshack.us/img193/1373/rejj.png)

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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A o sesjach, to Waść nie słyszał?
Go to the top of the page
+Quote Post
falcone
post
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.06.2009

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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...

Ten post edytował falcone 4.07.2009, 20:58:43
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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ć?
Go to the top of the page
+Quote Post
falcone
post
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.06.2009

Ostrzeżenie: (0%)
-----


Po co? Dobre pytanie (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ...
Go to the top of the page
+Quote Post
R4D3K
post
Post #6





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


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

Ten post edytował R4D3K 5.07.2009, 00:21:41
Go to the top of the page
+Quote Post
bełdzio
post
Post #7





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #8





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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. ?>
Go to the top of the page
+Quote Post
falcone
post
Post #9





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.06.2009

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Łaaał (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
KoPcIu
post
Post #10





Grupa: Zarejestrowani
Postów: 47
Pomógł: 1
Dołączył: 23.10.2008

Ostrzeżenie: (0%)
-----


Ostatnio borykałem się z takim samym problemem (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

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

Możesz je wykorzystać podczas wyświetlenia tekstu końcowego (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Czyli np dziękujemy za rejestrację (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Pozdrawiam (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 20:37