Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Kilka problemów z rejestracją
Forum PHP.pl > Forum > Przedszkole
ArthaS_Delano
Witam smile.gif

Mam oto taki kod rejestracji użytkownika:

  1. <?php
  2.  require('libs/Smarty.class.php');
  3.  include('data/config.php');
  4.  $smarty = new Smarty;
  5.  
  6. //session_start();
  7. //$_SESSION['token'] = '';
  8. for($i=0;$i<5;$i++) {
  9.  $liczba = rand(0,9);
  10.  $token .= $liczba;
  11.  $img .= '<img src="images/token/'.$liczba.'.gif" />';
  12. }
  13.  
  14. $error = '';
  15.  
  16. if (($_POST['nick']) && ($_POST['haslo']) && ($_POST['haslo2']) && ($_POST['email']) && ($_POST['email2']) && ($_POST['token']))
  17. {
  18.  
  19. $db = "SELECT nick FROM player";
  20. $player = mysql_fetch_array($db);
  21.  
  22. if ($_POST['nick'] != $player)
  23. {
  24.  if ($_POST['haslo'] == $_POST['haslo2'])
  25.  {
  26. if ($_POST['email'] == $_POST['email2'])
  27. {
  28.  if ($_POST['token_spr'] == $_POST['token'])
  29.  {
  30.  
  31.  $nick = $_POST['nick'];
  32.  $haslo = md5($_POST['haslo']);
  33.  $email = $_POST['email'];
  34.  
  35.  $db = "INSERT INTO `player` (`id`, `nick`, `haslo`, `email`) VALUES ('', '$nick', '$haslo', '$email')";
  36.  $start = mysql_query($db);
  37.  $error = '! Rejestracja zakończona powodzeniem !';
  38.  }
  39. }
  40.  }
  41. }
  42. }
  43.  
  44. if ((!$_POST['nick']) || (!$_POST['haslo']) || (!$_POST['haslo2']) || (!$_POST['email']) || (!$_POST['email2']) || (!$_POST['token']))
  45. {
  46. $error .= '! Wypelnij wszystkie pola !<br />';
  47. }
  48.  
  49. if (($_POST['nick']) == $player)
  50. {
  51. $error .= '! Taki nick juz istnieje !<br />';
  52. }
  53.  
  54. if (($_POST['haslo']) != ($_POST['haslo2']))
  55. {
  56. $error .= '! Zle przepisales haslo !<br />';
  57. }
  58.  
  59. if (($_POST['email']) != ($_POST['email2']))
  60. {
  61. $error .= '! Zle przepisales e-mail !<br />';
  62. }
  63.  
  64. if (($_POST['token']) != ($_POST['token_spr']))
  65. {
  66. $error .= '! Zle przepisales kod z obrazka !<br />';
  67. }
  68.  
  69.  $smarty -> assign('img', $img);
  70.  $smarty -> assign('error', $error);
  71.  $smarty -> assign('token', $token);
  72.  $smarty -> display('register.tpl');
  73. ?>


All jest niby ok rejestracja przebiega prawidłowo przy sprawdzeniu większości warunków.. Token również działa bezbłednie.. W czym problem ? Są 2.. Otóż kiedy chce sprawdzić czy dany użytkownik istnieje po 1 zaraz na starcie pokazuje mi że "Taki nick już istnieje" w sytuacji gdy przecież nie zdąrzyłem jeszcze nic wpisać.. Po 2 i tak mimo wpisania tego samego nicku ( istniejącego już w bazie ) rejestruje mnie bezproblemowo.. Teoretycznie "domyślam" co jest nie tak, w praktyce nie udaje mi się z tym nic zrobić.. Stąd moja prośba do osób które znalazły by chwilkę aby zerknąć w mój kod.. Chętnie przyjmę też jakieś rady co do ulepszenia tego kodu gdyż jako początkujący wiem że perfekcyjny to ten kod nie jest smile.gif

Pozdrawiam i z góry dziekuję bardzo za rady smile.gif
Pilsener
Zagmatwałeś to niepotrzbnie, kolejność powinna być taka:
1. Odbierasz dane od użytkownika - pamiętaj o walidacji!
2. Sprawdzasz, czy pola nie są puste - sugeruję użyć empty
3. Teraz sprawdzasz, czy np. hasło = hasło2, email = email2 itp.
4. Dopiero teraz sprawdzasz, czy nick/login istnieje w bazie
  1. <?php
  2. $db = "SELECT nick FROM player";
  3. ?>
- dlaczego tak? Powinno być tak:
  1. <?php
  2. $db = "SELECT nick FROM player WHERE nick=$_POST['nick']";
  3. ?>
- jeśli wynik zapytania będzie niepusty, to znaczy, że nick już istnieje
5. Na samym końcu dodajesz do bazy

I ja np. nie lubię zagnieżdżać w sobie ifów. Wolę już użyć dodatkowej zmiennej, której używam w następnym ifie - tak jest mi wygodniej.
ArthaS_Delano
Rozumiem..

Mam jeszcze jedno pytanie odnośnie tego.. Jak sprawdzić czy przycisk submit był już wciśniety ? Bo jak narazie tekst "Wypelnij wszystkie pola" pokazuje mi od razu na stronie rejestracji zanim cokolwiek na niej zrobie.. a chce zeby pokazywal sie dopiero jak dane zostana wyslane i wtedy bedzie mozna wiedziec czy uzytkownik wpisal wszystkie dane..
qqrq
Tutaj masz odpowiedź:

Cytat(Pilsener @ 2.04.2008, 09:27:15 ) *
2. Sprawdzasz, czy pola nie są puste - sugeruję użyć empty


Po prostu jeśli pola są puste, to formularz nie został jeszcze zatwierdzony.
ArthaS_Delano
Pisze tak:

  1. <?php
  2. $error = '';
  3.  
  4. $nick = $_POST['nick'];
  5. $haslo = md5($_POST['haslo']);
  6. $haslo2 = md5($_POST['haslo2']);
  7. $email = $_POST['email'];
  8. $email2 = $_POST['email2'];
  9.  
  10.  if ( (empty($_POST['nick'])) || (empty($_POST['haslo'])) || (empty($_POST['haslo2'])) || (empty($_POST['email'])) || (empty($_POST['email2'])) )
  11.  {
  12.  $error = "Blad";
  13.  }
  14. ?>


Tylko ze wtedy po wejsciu na strone rejestracji na starcie pisze mi "Blad" a chce zeby pisalo dopiero kiedy ktos wcisnie submit..

EDIT:

  1. <?php
  2. if(isset($_POST['submit']))
  3. {
  4.  
  5. $error = NULL;
  6.  
  7. if (empty($_POST['nick']))
  8. {
  9. $nick = FALSE;
  10. $error .= '<P>Zapomnialeś podać nazwę użytkownika!</P>';
  11. }
  12. else
  13. { $nick = $_POST['nick']; }
  14.  
  15.  
  16. if (empty($_POST['haslo']))
  17. {
  18. $haslo = FALSE;
  19. $error .= '<P>Zapomnialeś podać hasło!</P>';
  20. }
  21. else
  22. { $haslo = $_POST['haslo']; }
  23.  
  24. }
  25. ?>


Taki kod też mi nie działa, niby nie pokazuje nic na poczatku ale jak wcisne ok to nic rowniez sie nie pokazuje a powinno ze brak hasla i nicku..
qqrq
Nie potrzebny jest pierwszy if - przez niego twój kod wywoła się tylko w przypadku zatwierdzenia formularza.
ArthaS_Delano
Ale mi wlasnie o to chodzi smile.gif All ma sie dziac dopieo jak wcisne ok smile.gif Ale juz sobie z tym poradzilem smile.gif

Mam jednak malutki problem gdyz w kodzie:

  1. <?php
  2. $db = "SELECT nick FROM player WHERE nick = $_POST['nick']";
  3. if (!empty($db))
  4. {
  5. $nick = FALSE;
  6. $error .= '<P>Taki nick juz istnieje!</P>';
  7. }
  8. ?>


Wywala blad:

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/delano/public_html/register.php on line 27

Czyli w linijce gdzie pobieram dane z bazy tak jak mi radzono wyzej.. Nie wiem co znaczy ten blad..
qqrq
A która to ta linijka 27 questionmark.gif
mike
~ArthaS_Delano tak Ci się wydaje że coś pobierasz z bazy a w rzeczywistości Twój kod nic nie robi.
Przygotowujesz zapytanie. W sumie to lepiej daj tak:
  1. <?php
  2.  
  3. $db = "SELECT nick FROM player WHERE nick = '" . $_POST['nick'];
  4.  
  5. ?>

I... ? I nie pytasz o nic bazę.
Zamiast tego sprawdzasz czy zmienna $db, która jest stringiem nie jest pusta.

Musisz to zapytanie zadać bazie danych.
Zapraszam do manuala i dokumentacji funkcji mysql_query()
ArthaS_Delano
Najpierw dziekuje za pomoc, jestem mile zaskoczony ze nikt mnie nie zjechal tylko dzieki Wam na kilka rzeczy juz nauczylem sie zwracac uwage smile.gif

Problem mam w tym ze 'wedlug mnie' teraz juz all dobrze napisalem:

  1. <?php
  2. if (empty($_POST['nick']))
  3. {
  4. $nick = FALSE;
  5. $error .= '<P>Zapomnialeś podać nazwę użytkownika!</P>';
  6. }
  7. else
  8.  {
  9. $db = mysql_query ("SELECT nick FROM player WHERE nick= ".$_POST['nick']);
  10. if (!empty($db))
  11. {
  12. $nick = FALSE;
  13. $error .= '<P>Taki nick juz istnieje!</P>';
  14. }
  15. else
  16. {
  17. $nick = $_POST['nick'];
  18. $error .= '<P>Dziala!</P>';
  19. }
  20.  }
  21. ?>


Niestety nawet po podaniu nicku ktory juz w bazie istnieje wciaz pisze mi "dziala".. Siedze nad tym od powrotu z uczelni ale nic nie moge wymyslec..
mike
To teraz dalej. mysql_query() zwraca zasób wyniku zapytania.
Żeby sprawdzić co baza Ci odpowiedziała musisz na wyniku funkcji mysql_query() zadziałać innymi funkcjami:
Na przykład: mysql_num_rows() żeby sprawdzić ile było wyników lub mysql_fetch_array() żeby pobrać dany wiersz wyników.

Poczytaj dokładnie dokumentacje wspomnianych funkcji i koniecznie przykłady. W przykładach właśnie będziesz miał gotowce począwszy od zadania zapytania po wybranie i wyświetlenie wyników.
qqrq
Poczytaj sobie w manualu o funkcji empty - to nie tak działa. Poza tym zapoznaj się też w funkcjami mysql-a.
ArthaS_Delano
Ja juz to przegladalem, zazwyczaj rozwiazywanie problemow zaczynam od manuali.. Czasem nie umiem ich poprostu zastosowac.. Nie wiem jak uzyc mysql_fetch_array w tym konretnym przypadku..

bo wychodzi takie cos:

  1. <?php
  2. $db = mysql_query ("SELECT nick FROM player WHERE nick= ".$_POST['nick']);
  3. $player = mysql_fetch_array($db);
  4. if ($player['nick'] == $_POST['nick'])
  5. {
  6. $nick = FALSE;
  7. $error .= '<P>Taki nick juz istnieje!</P>';
  8. }
  9. else
  10. {
  11. $nick = $_POST['nick'];
  12. $error .= '<P>Dziala!</P>';
  13. }
  14. ?>


Wciaz jednak pokazuje mi ze "dziala" mimo ze probuje rejestracji pod identycznym nickiem jaki juz w bazie istnieje..


EDIT:

Taka wersja tez nie zadzialala poprawnie:

  1. <?php
  2. $db = mysql_query ("SELECT nick FROM player WHERE nick= ".$_POST['nick']);
  3. if (mysql_num_rows($db) == 1)
  4. {
  5. $nick = FALSE;
  6. $error .= '<P>Taki nick juz istnieje!</P>';
  7. }
  8. else
  9. {
  10. $nick = $_POST['nick'];
  11. $error .= '<P>Dziala!</P>';
  12. }
  13. ?>
Lejto
zobacz tak:
  1. <?php
  2. $wynik = mysql_query ("SELECT nick FROM player WHERE nick= '".$_POST['nick']."'");
  3. if (!$wynik)
  4.  
  5. echo 'Wykonanie zapytania nie powiodło się.';
  6.  
  7. if (mysql_num_rows($wynik)>0) 
  8. {
  9. echo 'Nazwa użytkownika zajęta';
  10. }
  11. ?>
ArthaS_Delano
Tamto juz dziala, dodalem troche zabezpieczen i jest ok.. teraz problem z logowaniem, chociaz narazie to typowy problem poczatkujacego..

  1. <?php
  2.  require('libs/Smarty.class.php');
  3.  include('data/config.php');
  4.  $smarty = new Smarty;
  5.  
  6. $nick = $_POST['nick'];
  7. $email = $_POST['email'];
  8.  
  9. $db = mysql_query ("SELECT nick, haslo FROM players");
  10. $login = mysql_fetch_array($db);
  11.  
  12. if ($nick == $login['nick']) && ($haslo == $login['haslo']) // linijka 13
  13. {
  14. echo 'zalogowany';
  15. }
  16.  
  17. ?>


Ktos mi podpowie co ja zle formuluje ?
Pojawia sie blad:

Parse error: syntax error, unexpected T_BOOLEAN_AND in /home/delano/public_html/login.php on line 13
qqrq
if (($nick == $login['nick']) && ($haslo == $login['haslo']))
ArthaS_Delano
Dziekuje bardzo smile.gif

Mam problem nad ktorym siedze pol dnia i nie wiem co jest zle..

  1. <?php
  2.  require('libs/Smarty.class.php');
  3.  include('data/config.php');
  4.  include('data/player.php');
  5.  $smarty = new Smarty;
  6.  
  7.  require_once("data/head.php");
  8.  $db = mysql_query ("SELECT * FROM players WHERE nick= '".$_SESSION['nick']."'");
  9.  $player = mysql_fetch_array($db);
  10.  
  11.  $nick = $player['nick'];
  12.  
  13.  $smarty -> assign('nick', $nick);
  14.  $smarty -> display('ogrimmar.tpl');
  15.  require_once("data/foot.php");
  16. ?>


Co ja robie zle ze nie wyswietla mi nicku w pliku tpl..
Domyslam sie ze cos z pobraniem danych z bazy nie tak
robert-0627
Też mam problem z rejestracja wiec nie będę tworzył nowego tematu tylko napisze tutaj

  1. <?php
  2.  
  3. define("OK", 0);
  4. define("SERVER_ERROR", 1);
  5. define("BAD_USER_NAME_LENGTH", 2);
  6. define("BAD_USER_PASS_LENGTH", 3);
  7. define("USER_NAME_ALREADY_EXISTS", 4);
  8. define("EMPTY_FIELDS", 5);
  9.  
  10. function rejestruj($nazwa, $haslo, $imie, $nazwisko, $email)
  11. {
  12. //sprawdzenie poprawności danych
  13.  
  14. $userNameLength = strlen($nazwa);
  15. $userPassLength = strlen($haslo);
  16.  
  17. if($userNameLength < 3 || $userNameLength > 20)
  18. return BAD_USER_NAME_LENGTH;
  19.  
  20. if($userPassLength < 6 || $userPassLength > 40)
  21. return BAD_USER_PASS_LENGTH;
  22.  
  23. if($imie == "" || $nazwisko == "" || $email == "")
  24. return EMPTY_FIELDS;
  25.  
  26. //połączenie z bazą danych
  27.  
  28. if (!$db_lnk = mysql_connect("mysql3.yoyo.pl", "db486994", "xxxxxxxxx")){
  29. //echo('Wystąpił błąd podczas próby połączenia z serwerem MySQL...');
  30. return SERVER_ERROR;
  31. }
  32.  
  33. if(!mysql_select_db('"db486994"')){
  34. //echo('Wystąpił błąd podczas wyboru bazy danych: test...');
  35. return SERVER_ERROR;
  36. }
  37.  
  38. //sprawdzenie, czy użytkownik o podanej nazwie istnieje w bazie
  39.  
  40. $query = "SELECT COUNT(*) FROM Users WHERE Nazwa='$nazwa' ";
  41.  
  42. if(!$result = mysql_query($query, $db_lnk)){
  43. //echo('Wystąpił błąd: Instrukcja SELECT...');
  44. return SERVER_ERROR;
  45. }
  46.  
  47. if(!$row = mysql_fetch_row($result)){
  48. //echo('Wystąpił błąd: nieprawidłowe wyniki zapytania...');
  49. return SERVER_ERROR;
  50. }
  51. else{
  52. if($row[0] > 0){
  53. return USER_NAME_ALREADY_EXISTS;
  54. }
  55. }
  56.  
  57. //dodanie nowego użytkownika
  58.  
  59. $query = "INSERT INTO Users VALUES(";
  60. $query .= "NULL, '$nazwa', '$haslo', '$imie', '$nazwisko', '$email')";
  61.  
  62. if(!$result = mysql_query($query, $db_lnk)){
  63. //echo('Wystąpił błąd: instrukcja INSERT...');
  64. return SERVER_ERROR;
  65. }
  66.  
  67. $count = @mysql_affected_rows();
  68.  
  69. if($count <> 1){
  70. return SERVER_ERROR;
  71. }
  72. else{
  73. return OK;
  74. }
  75. }
  76.  
  77. if(isSet($_SESSION['zalogowany'])){
  78. header("Location: main.php");
  79. }
  80. else if(!isSet($_POST["nazwa"]) || !isSet($_POST["haslo"]) ||
  81. !isSet($_POST["imie"]) || !isSet($_POST["nazwisko"]) ||
  82. !isSet($_POST["email"])){
  83. include "new_user.html";
  84. }
  85. else{
  86.  
  87. ?>
  88.  
  89. <html>
  90. <head>
  91. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  92. <title>Rejestracja</title>
  93. </head>
  94. <body>
  95. <h2 align="center">
  96.  
  97. <?php
  98.  
  99. $nazwa = $_POST["nazwa"];
  100. $haslo = $_POST["haslo"];
  101. $imie = $_POST["imie"];
  102. $nazwisko = $_POST["nazwisko"];
  103. $email = $_POST["email"];
  104.  
  105. $val = rejestruj($nazwa, $haslo, $imie, $nazwisko, $email);
  106.  
  107. if($val == OK){
  108. echo("Rejestracja poprawna. Możesz się <a href='login.php'>zalogować</a>.");
  109. }
  110. else if($val == BAD_USER_NAME_LENGTH){
  111. echo("Nazwa użytkownika musi mieć od 3 do 20 znaków.");
  112. }
  113. else if($val == BAD_USER_PASS_LENGTH){
  114. echo("Hasło musi mieć od 6 do 40 znaków.");
  115. }
  116. else if($val == USER_NAME_ALREADY_EXISTS){
  117. echo("Użytkownik $_POST[nazwa] jest już zarejestrowany.");
  118. }
  119. else if($val == EMPTY_FIELDS){
  120. echo("Proszę wypełnić wszystkie pola formularza.");
  121. }
  122. else{
  123. echo("Błąd serwera. Rejestracja nie powiodła się.");
  124. }
  125. }
  126. ?>
  127.  
  128. </h2>
  129. </body>
  130. </html>

Wyskakuje mi ten ostatni błąd serwera. Ktos wie może o co chodzi ? Przykład z książki . Znajduje sie on u mnie w folderze rejestracja z plikami ma
n.php logout.php login.php form.php i new_user.html  a ten plik powyższy nosi nazwę new_user.php . Jeżeli jest koniecznie przedstawi
 tresc pozostałych skryptów prosze napisać . Pozdrawiam
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.