Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySql][PHP] Formularz rejstracji
Forum PHP.pl > Forum > Przedszkole
artdem
Witam,

W pocie czoła pracuję nad uruchomieniem formularza rejestracyjnego na mojej stronie. Niestety gotowy skrypt, którym dysponowałem posiada wiele wad i niestety muszę go poprzerabiać. Niestety moja znajomość PHP jest znikoma w związku z czym potrzebuję, aby ktoś fachowym okiem rzucił okiem na efekty mojej pracy.

Poniżej przesyłam kod do formularza:
  1. include('connect.php');
  2. $result = mysql_query("SELECT * FROM sitesettings");
  3. while($row = mysql_fetch_array($result))
  4. $title = "".$row["domain"]." - Zarejestruj się";
  5. include "header.php";
  6. $usrv = 'Wprowadź nazwę użytkownika';
  7. $usrt = 'Nazwa użytkownika zajęta';
  8. $usri = 'Niedozwolone znaki';
  9. $passv = 'Wprowadź hasło';
  10. $passn = 'Wprowadzone hasła się nie zgadzają';
  11. $emailv = 'Wprowadź prawidłowy adres e-mail';
  12. $emailt = 'Podany adres został już użyty';
  13. $pattern = "/^([a-zA-Z0-9_])+$/";
  14. $patternm = "/^[-0-9a-zA-Z_\.]+@([-0-9a-zA-Z_\.]+\.)+([0-9a-zA-Z]){2,4}$/i";
  15. $usrn = $_POST['login'];
  16. $usrm = $_POST['email'];
  17. $login = mysql_real_escape_string($_POST['login']);
  18. $pass = mysql_real_escape_string(md5(sha1($_POST['pass'])));
  19. $pass2 = mysql_real_escape_string(md5(sha1($_POST['pass2'])));
  20. $email = mysql_real_escape_string($_POST['email']);
  21. $logincheck = "SELECT COUNT(*) FROM username WHERE username='$login'";
  22. $idlogincheck = mysql_query($logincheck);
  23. $loginz = mysql_fetch_row($idlogincheck);
  24. $mailcheck = "SELECT COUNT(*) FROM username WHERE email='$email'";
  25. $idmailcheck = mysql_query($mailcheck);
  26. $mailz = mysql_fetch_row($idmailcheck);
  27. ?>


Trochę przekombinowane chyba, no ale tak mi wyszło. Całą resztę, czyli wpisywanie danych do bazy i wysyłanie maila z kluczem jest załatwione przez plik verify.php. W pierwotnej wersji działało ok, ale po moich poprawkach nie działa. W skrypcie jest jeden kod PHP, który, jak mi się wydaje, odsyła do tego pliku:

  1. <?
  2. $pattern = "/^([a-zA-Z0-9_])+$/";
  3. $usrn = $_POST['login'];
  4. if(isset($_POST['register'])){
  5. if(empty($_POST['login']) || $loginz >0 || $mailz >0 || empty($_POST['pass']) || $_POST['pass2'] != $_POST['pass'] || $_POST['email'] == "" || !preg_match($pattern,$usrn)){
  6. }else{
  7. $usname = strtolower($_POST['login']);
  8. $uspass = $_POST['pass'];
  9. $uspassv = $_POST['pass2'];
  10. $emai = strtolower($_POST['email']);
  11. $sr = "1";
  12. $_SESSION['login'] = $usname;
  13. $_SESSION['pass'] = $uspass;
  14. $_SESSION['pass2'] = $uspassv;
  15. $_SESSION['email'] = $emai;
  16. $_SESSION['status'] = $sr;
  17. header( 'Location: verify.php' ) ;
  18. }
  19. };
  20. ?>


Nigdzie indziej w kodzie nie pojawia "verify.php", dlatego wnioskuję, że za odsyłanie do tej strony odpowiada właśnie ten fragment kodu. Tylko, że teraz to odsyłanie nie działa i nie wiem dlaczego. Proszę o pomoc.
piszczu
  1. $result = mysql_query("SELECT * FROM sitesettings");
  2. while($row = mysql_fetch_array($result))
Niezbyt rozumiem po co ta pętla.
  1. include "header.php";
  2. include('connect.php');

Albo A albo B, zdecyduj się. 2 opcja jest lepsza.
  1. $pass = mysql_real_escape_string(md5(sha1($_POST['pass'])));
  2. $pass2 = mysql_real_escape_string(md5(sha1($_POST['pass2'])));

Wytłumacz mi po co ci tutaj mysql_real_escape_string, albo powiedz czy rozumiesz chociaż jak ta funkcja działa czy tez używasz jej bo ma w nazwie "mysql".

Co konkretnie nie działa i co to za plik w 2 listingu?
artdem
1. Nie wiem po co tam ta pętla. Była w oryginale i nie wiem czy jest potrzebna.

2. Header i Connect muszą być, bo ten drugi odpowiada tylko za połączenia z bazą danych.

3. Jeśli chodzi o mysql_real_escape_string, to nie wiem po co to jest. Było w oryginale.

4. Verify.php odpowiada za dodanie Usera do bazy danych i wysłanie maila z kodem aktywujacym Usera. Wyglada to tak, że ze strony signup.php przechodzi na verify.php, która wysyła maila i dopisuje dane Usera.
piszczu
Jeżeli dobrze zrozumiałem to ten cały kod to 1 plik. Zmienne loginz i mailz to tablice, a tablice zawsze są większe od zera.
Błędy masz przy przypisywaniu wartości tym zmiennym
  1. $logincheck = "SELECT COUNT(*) FROM username WHERE username='$login'";
  2. $idlogincheck = mysql_query($logincheck);
  3. $loginz = [color="#FFFF00"]intval(end[/color](mysql_fetch_row($idlogincheck)));

I analogiczna sytuacja przy $mailz. intval() może być zbędny, nie pamiętam czy jest automatyczne rzutowanie. Tablice to zbiory, a jak wiadomo nie istnieje coś takiego jak pusty zbiór, są zbiory z pustym elementem.

A co do include to zobacz jak są zbudowane.
artdem
Tak, oba kody pochodzą z tego samego pliku - signup.php.

Poprawiłem wskazane błędy i rzeczywiście za pierwszym razem rejestracja poszła ok i już nawet byłem zadowolony, ale potem okazało się, że formularz przestał wychwytywać błąd o powtarzającym się loginie i mailu. To znaczy wychwytuje go i rejestracja nie przechodzi do pliku verify.php, ale nie wyświetla informacji o tym, że login i mail się powtarzają.

Może trzeba poprawić coś tutaj

  1. <?
  2. }
  3. elseif($loginz[0]!=0){
  4. ?>
  5. <span class="error">
  6. <? echo $usrt;?>
  7. </span>
piszczu
Jeżeli robisz coś inaczej niż ci powiedziałem to posyłaj cały kod, a nie jego fragment. Skąd ja mam wiedzieć co to za zmienne, co jest dalej i jak to ma niby działać? Na pierwszy rzut oka widzę, ze twój skrypt najpierw sprawdza czy w bazie istnieje login "Piszczu", potem dodaje do bazy "piszczu". Gdy znowu chcesz dodać "Piszczu", skrypt idzie dalej bo nie ma takiego loginu w bazie. Pominę również fakt że sprawdzasz czy jest "/'piszczu" a dodajesz "'piszczu". Albo usuń strlower() albo dodaj je też przed selectem. Dodaj też mysql_real_escape_string() w insercie.
artdem
No to cały kod wygląda tak:
  1. include "connect.php";
  2. $result = mysql_query("SELECT * FROM sitesettings");
  3. while($row = mysql_fetch_array($result))
  4. $title = "".$row["domain"]." - Zarejestruj się";
  5. include "header.php";
  6. $usrv = 'Wprowadź nazwę użytkownika';
  7. $usrt = 'Nazwa użytkownika zajęta';
  8. $usri = 'Niedozwolone znaki';
  9. $passv = 'Wprowadź hasło';
  10. $passn = 'Wprowadzone hasła się nie zgadzają';
  11. $emailv = 'Wprowadź prawidłowy adres e-mail';
  12. $emailt = 'Podany adres został już użyty';
  13. $pattern = "/^([a-zA-Z0-9_])+$/";
  14. $patternm = "/^[-0-9a-zA-Z_\.]+@([-0-9a-zA-Z_\.]+\.)+([0-9a-zA-Z]){2,4}$/i";
  15. $usrn = $_POST['login'];
  16. $usrm = $_POST['email'];
  17. $login = mysql_real_escape_string($_POST['login']);
  18. $pass = mysql_real_escape_string(md5(sha1($_POST['pass'])));
  19. $pass2 = mysql_real_escape_string(md5(sha1($_POST['pass2'])));
  20. $email = mysql_real_escape_string($_POST['email']);
  21. $logincheck = "SELECT COUNT(*) FROM username WHERE username='$login'";
  22. $idlogincheck = mysql_query($logincheck);
  23. $loginz = intval(end(mysql_fetch_row($idlogincheck)));
  24. $mailcheck = "SELECT COUNT(*) FROM username WHERE email='$email'";
  25. $idmailcheck = mysql_query($mailcheck);
  26. $mailz = intval(end(mysql_fetch_row($idmailcheck)));


  1. function filename_safe($filename) {
  2. $temp = $filename;
  3. $temp = strtolower($temp);
  4. $temp = str_replace(" ", "_", $temp);
  5. $temp = str_replace("'", "", $temp);
  6. $temp = str_replace("+", "_", $temp);
  7.  
  8.  
  9. // Loop through string
  10. $result = '';
  11. for ($i=0; $i<strlen($temp); $i++) {
  12. if (preg_match('([0-9]|[a-z]|_)', $temp[$i])) {
  13. $result = $result . $temp[$i];
  14. }
  15. }
  16.  
  17. // Return filename
  18. return $result;
  19. }


  1. $pattern = "/^([a-zA-Z0-9_])+$/";
  2. $usrn = $_POST['login'];
  3. if(isset($_POST['register'])){
  4. if(empty($_POST['login']) || $loginz >0 || $mailz >0 || empty($_POST['pass']) || $_POST['pass2'] != $_POST['pass'] || $_POST['email'] == "" || !preg_match($pattern,$usrn)){
  5. }else{
  6. $usname = $_POST['login'];
  7. $uspass = $_POST['pass'];
  8. $uspassv = $_POST['pass2'];
  9. $emai = $_POST['email'];
  10. $sr = "1";
  11. $_SESSION['login'] = $usname;
  12. $_SESSION['pass'] = $uspass;
  13. $_SESSION['pass2'] = $uspassv;
  14. $_SESSION['email'] = $emai;
  15. $_SESSION['status'] = $sr;
  16. header( 'Location: verify.php' ) ;
  17. }
  18. };


Teraz sytuacja wygląda tak, że rejestrując nowego użytkownika, jest dobrze - tzn. z formularza przechodzi na stronę verify, która wysyła maila z kodem aktywacji i dopisuje użytkownika do bazy.

Ale jeśli próbuję dopisać jeszcze raz użytkownika z takim samym loginem (niezależnie czy pisane z małej czy wielkiej) lub mailem, to po wciśnięciu buttona rejestracji odświeża mi stronę signup i nie wyświetlają się żadne błędy. Inne błędy - niewypełnione pola, niewłaściwe hasło, niewłaściwy email się pojawiają.




Rid
Cytat
Ale jeśli próbuję dopisać jeszcze raz użytkownika z takim samym loginem

A nie lepiej jest sprawdzić czy użytkownik istnieje już w bazie?questionmark.gif
Jeśli tak to przerwać rejestracje,np komunikatem
Podany użytkownik istnieje już w naszej bazie danych ,proszę użyć innej nazwy użytkownika.

Jeśli nie to normalnym tokiem rejestracja.

Dodatkowego zabezpieczenia można użyć wartości unique w kolumnie z loginem w bazie danych.
artdem
Przecież sprawdzam i jeśli użytkownik już jest, to nie da się dopisać drugiego takiego samego, ale nie wyświetla mi się o tym błąd o tym informujący.
Rid
$idlogincheck = mysql_query($logincheck);
Możnaby użyć if:

if ($idlogincheck==0){
......To zarejestruj} else {
........wyświetl komunikat z błędem}
artdem
To jest później:
  1. <td>Użytkownik</td>
  2. <td>
  3. <?
  4. if(isset($_POST['register'])){
  5. if(empty($_POST['login'])){
  6. ?>
  7. <span class="error">
  8. <? echo $usrv;?>
  9. </span>
  10. <?
  11. }
  12. if(!empty($_POST['login'])){
  13. if(!preg_match($pattern, $usrn)){
  14. ?>
  15. <span class="error">
  16. <? echo $usri;?>
  17. </span>
  18. <?
  19. }
  20. if($loginz[0]!=0){
  21. ?>
  22. <span class="error">
  23. <? echo $usrt;?>
  24. </span>
  25. <?
  26. }
  27. }
  28. };
  29. ?>
  30. <input type="text" name="login" class="textfield"/></td>


I analogicznie dla pola z mailem.
piszczu
Zastanów się. Najpierw posłałeś 3 kawałki kodu i powiedziałeś, że to wszystko, potem dosłałeś jeszcze coś i właściwie nie wiadomo z którego to pliku. Jeżeli chcesz żeby ktoś ci pomógł to posyłaj kod w formie niezakodowanej w czytelny tylko dla Ciebie sposób. Mnie uczyli, że każdy skrypt PHP zaczyna się od <?php, u ciebie tego nie widzę, więc wnioskuję, że to nie cały kod. To raz.

Druga sprawa to zakładając, że kod dosłany w ostatnim poście jest częścią pierwszego pliku, używasz $loginz jako tablicy, a jak wiadomo jest to liczba (wynika to chociażby z intval())

Trzecia sprawa. PHP ma wbudowaną z pozoru niepotrzebną funkcję, która w rzeczywistości jest potężnym narzędziem do debugowania, mowa tu o var_dump(). Dodaj ją po ob_start() [$loginz jako argument] i przeanalizuj wyniki.
artdem
Poniżej przesyłam całość kodu dla strony signup.php. Wcześniej tego nie zrobiłem, bo myślałem, że wystarczą tylko te phpowe fragmenty. Będę wdzięczny za pomoc i sprawdzenie.

  1. <?php session_start();
  2. include "connect.php";
  3. $result = mysql_query("SELECT * FROM sitesettings");
  4. while($row = mysql_fetch_array($result))
  5. $title = "".$row["domain"]." - Zarejestruj się";
  6. include "header.php";
  7. $usrv = 'Wprowadź nazwę użytkownika';
  8. $usrt = 'Nazwa użytkownika zajęta';
  9. $usri = 'Niedozwolone znaki';
  10. $passv = 'Wprowadź hasło';
  11. $passn = 'Wprowadzone hasła się nie zgadzają';
  12. $emailv = 'Wprowadź prawidłowy adres e-mail';
  13. $emailt = 'Podany adres został już użyty';
  14. $pattern = "/^([a-zA-Z0-9_])+$/";
  15. $patternm = "/^[-0-9a-zA-Z_\.]+@([-0-9a-zA-Z_\.]+\.)+([0-9a-zA-Z]){2,4}$/i";
  16. $usrn = $_POST['login'];
  17. $usrm = $_POST['email'];
  18. $login = mysql_real_escape_string($_POST['login']);
  19. $pass = mysql_real_escape_string(md5(sha1($_POST['pass'])));
  20. $pass2 = mysql_real_escape_string(md5(sha1($_POST['pass2'])));
  21. $email = mysql_real_escape_string($_POST['email']);
  22. $logincheck = "SELECT COUNT(*) FROM username WHERE username='$login'";
  23. $idlogincheck = mysql_query($logincheck);
  24. $loginz = intval(end(mysql_fetch_row($idlogincheck)));
  25. $mailcheck = "SELECT COUNT(*) FROM username WHERE email='$email'";
  26. $idmailcheck = mysql_query($mailcheck);
  27. $mailz = intval(end(mysql_fetch_row($idmailcheck)));
  28. ?>
  29. <?
  30. function filename_safe($filename) {
  31. $temp = $filename;
  32. $temp = strtolower($temp);
  33. $temp = str_replace(" ", "_", $temp);
  34. $temp = str_replace("'", "", $temp);
  35. $temp = str_replace("+", "_", $temp);
  36.  
  37.  
  38. // Loop through string
  39. $result = '';
  40. for ($i=0; $i<strlen($temp); $i++) {
  41. if (preg_match('([0-9]|[a-z]|_)', $temp[$i])) {
  42. $result = $result . $temp[$i];
  43. }
  44. }
  45.  
  46. // Return filename
  47. return $result;
  48. }
  49. ?>
  50. <?
  51. $pattern = "/^([a-zA-Z0-9_])+$/";
  52. $usrn = $_POST['login'];
  53. if(isset($_POST['register'])){
  54. if(empty($_POST['login']) || $loginz !=0 || $mailz !=0 || empty($_POST['pass']) || $_POST['pass2'] != $_POST['pass'] || $_POST['email'] == "" || !preg_match($pattern,$usrn)){
  55. }else{
  56. $usname = $_POST['login'];
  57. $uspass = $_POST['pass'];
  58. $uspassv = $_POST['pass2'];
  59. $emai = $_POST['email'];
  60. $sr = "1";
  61. $_SESSION['login'] = $usname;
  62. $_SESSION['pass'] = $uspass;
  63. $_SESSION['pass2'] = $uspassv;
  64. $_SESSION['email'] = $emai;
  65. $_SESSION['status'] = $sr;
  66. header( 'Location: verify.php' ) ;
  67. }
  68. };
  69. ?>
  70.  
  71. <div class="art-Post">
  72. <div class="art-Post-tl"></div>
  73. <div class="art-Post-tr"></div>
  74. <div class="art-Post-bl"></div>
  75. <div class="art-Post-br"></div>
  76. <div class="art-Post-tc"></div>
  77. <div class="art-Post-bc"></div>
  78. <div class="art-Post-cl"></div>
  79. <div class="art-Post-cr"></div>
  80. <div class="art-Post-cc"></div>
  81. <div class="art-Post-body">
  82. <div class="art-Post-inner">
  83. <div class="art-PostMetadataHeader">
  84. <h2 class="art-PostHeaderIcon-wrapper">
  85. <img src="images/PostHeaderIcon.png" width="32" height="32" alt="PostHeaderIcon">
  86. <span class="art-PostHeader">Zarejestruj się</span>
  87. </h2>
  88. </div>
  89. <div class="art-PostContent"><div class="cleared1"></div>
  90. <form action="" method="post" name="myform" id="myform">
  91. <table width="100%" border="0" align="left" cellpadding="3" cellspacing="3" class="forms">
  92. <tr>
  93. <td>Użytkownik</td>
  94. <td>
  95. <?
  96. if(isset($_POST['register'])){
  97. if(empty($_POST['login'])){
  98. ?>
  99. <span class="error">
  100. <? echo $usrv;?>
  101. </span>
  102. <?
  103. }
  104. if(!empty($_POST['login'])){
  105. if(!preg_match($pattern, $usrn)){
  106. ?>
  107. <span class="error">
  108. <? echo $usri;?>
  109. </span>
  110. <?
  111. }
  112. if($loginz[0]!=0){
  113. ?>
  114. <span class="error">
  115. <? echo $usrt;?>
  116. </span>
  117. <?
  118. }
  119. }
  120. };
  121. ?>
  122. <input type="text" name="login" class="textfield"> (Tylko litery, liczby i podkreślniki)</td>
  123. </tr>
  124. <tr>
  125. <td>Hasło</td>
  126. <td>
  127. <?
  128. if(isset($_POST['register'])){
  129. if(empty($_POST['pass']))
  130. {
  131. ?>
  132. <span class="error">
  133. <? echo $passv; ?>
  134. </span>
  135. <?
  136. }
  137. };
  138. ?>
  139. <input type="password" name="pass" class="textfield"></td>
  140. </tr>
  141. <tr>
  142. <td>Powtórz hasło</td>
  143. <td>
  144. <?
  145. if(isset($_POST['register'])){
  146. if($_POST['pass2'] != $_POST['pass'])
  147. {
  148. ?>
  149. <span class="error">
  150. <? echo $passn; ?>
  151. </span>
  152. <?
  153. }
  154. };
  155. ?>
  156. <input type="password" name="pass2" class="textfield"></td>
  157. </tr>
  158. <tr>
  159. <td>Email</td>
  160. <td>
  161. <?
  162. if(isset($_POST['register'])){
  163. if($_POST['email'] == "")
  164. {
  165. ?>
  166. <span class="error">
  167. <? echo $emailv; ?>
  168. </span>
  169. <?
  170. }
  171. if(!empty($_POST['email'])){
  172. if(!preg_match($patternm, $usrm)){
  173. ?>
  174. <span class="error">
  175. <? echo $emailv;?>
  176. </span>
  177. <?
  178. }
  179. if($mailz [0]!=0){
  180. ?>
  181. <span class="error">
  182. <? echo $emailt; ?>
  183. </span>
  184. <?
  185. }
  186. }
  187. };
  188. ?>
  189. <input type="text" name="email" class="textfield"> (Wymagany właściwy adres w celu weryfikacji)</td>
  190. </tr>
  191. </table>
  192. <div class="cleared1"></div>
  193. <p align="center">
  194. <input type="submit" name="register" class="searchbutton" value="Zarejestruj się">
  195. </p>
  196. </form>
  197. </div>
  198. <div class="cleared"></div>
  199. </div>
  200.  
  201. </div>
  202. </div>
  203. <div class="cleared"></div>
  204. <?
  205. include "right.php";
  206. include "footer.php";
  207. ?>

piszczu
Zdebugowałeś? Nie!
Zmieniłeś $loginz[0] na $loginz? Nie!
Przeczytałeś moje porady do końca? Nie!
Człowieku, nikt nie będzie poprawiał za Ciebie kodu. Daje ci wskazówki a czytasz je wybiórczo. A skoro czytasz wybiórczo to skrypt również działa wybiórczo.
Jeżeli chcesz żeby ktoś napisał za Ciebie kod to nie proś o pomoc tylko o numer konta.
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.