Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z Logowaniem
Forum PHP.pl > Forum > Przedszkole
Sillence
Witam. Otóż posiadam problem z logowaniem. Polega on na tym że jak kliknę przycisk loguj to 'loguje' mnie nawet jak nie ma wpisanych danych.

login.php:
  1. <?php
  2. //8
  3. if( $_GET['action']=="login" )
  4. {
  5.  
  6. //9
  7. $login = $_POST['username'];
  8. $pass = $_POST['pass'];
  9.  
  10. //10
  11. $db = mysql_connect( "46.4.177.235" , "Starve", "......." );
  12. mysql_select_db( "........" );
  13. $query = "SELECT `Haslo` FROM `mapa_players` WHERE `Nick`='$login'";
  14. $query = mysql_query( $query );
  15. $haslo = mysql_fetch_row( $query );
  16.  
  17. //11
  18. if( $haslo[0]==$pass )
  19. {
  20. echo"DZIAŁA !";
  21. }
  22. else{ echo"Zły login lub hasło!"; }
  23.  
  24. }
  25. ?>


A to index.php
  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Login Form - CodePen</title>
  7. <link rel="stylesheet" href="css/style.css" media="screen" type="text/css" />
  8. </head>
  9.  
  10. <body>
  11.  
  12. <div id="login">
  13. <h1>Logowanie do Panelu Gracza</h1>
  14. <form action="login.php?action=login" method=post>
  15. <input type="text" id="username" placeholder="Nick" />
  16. <input type="password" id="password" placeholder="Haslo" />
  17. <input type="submit" value="Log in" />
  18. </form>
  19. </div>
  20.  
  21. <script src='http://codepen.io/assets/libs/fullpage/jquery.js'></script>
  22. <script src="js/index.js"></script>
  23.  
  24. </body>
  25. </html>
  26.  
  27. <?php
  28. //12
  29. include("sessions.php");
  30.  
  31. //13
  32. if($_SESSION["USER_AUTH"]==TRUE){ include("panel.php"); }
  33. else{ include("login.php"); }
  34. ?>
Forti
Dlaczego sessions masz w odzielnym pliku? Pokaz kod.


Dlaczego na koncu dokumentu, po /html masz warunek sprawdzenia sesji? Jestem na telefonie wiec nie pomoge, ale dla mnoe to wywal co wszystko i napisz od nowa. Calosc jest jeden wielki bajzel. Wiem ze nie ponagam za bardzo, ale jak dla mnie to tu jest za duzo bledow.
Turson
Inputom trzeba nadać name wink.gif
Sillence
A posiadacie może jakiś poprawnie działający prosty system logowania i rejestracji ? smile.gif
Forti
p-programowanie.pl/php/system-logowania-i-rejestracji/

Nie wiem czy moge tak podac linka, bodajze 4 link z gory. Masz dokladny opis co i jak i z czym.
kartin
Myślę, że można się zgodzić z zawartą na tej stronie informacją o wpisach "ich poziom jest bardzo różny"
  • varchar(255) dla pola w którym zawsze będą dokładnie 32 znaki
  • przechowywanie IP jako ciągu znaków
  • mysql_num_rows(mysql_query("SELECT login FROM uzytkownicy WHERE login = '".$login."';")) aby policzyć ilość wierszy, dodatkowo autor wybitnie lubi średniki
  • filtrowanie znaków w haśle, aby łatwiej było przeprowadzać ewentualne ataki brute force po wycieku bazy
Turson
Cytat(Sillence @ 4.06.2014, 16:23:03 ) *
A posiadacie może jakiś poprawnie działający prosty system logowania i rejestracji ? smile.gif

http://turson.pl/blog/php-mysql-prosty-skr...nych-mysql-pdo/
kartin
Wyjdzie, że czepiam się wszystkiego i wszystkich, ale w jakim celu jest:
  1. $password = trim($_POST['password']);
Spacja w haśle to znak jak każdy inny, niezależnie czy jest na początku w środku czy na końcu.

Powinno się oddzielać kod PHP od HTML. Poniższe jest lekkim przegięciem.
  1. //Formularz logowania
  2. function form(){
  3. echo '
  4. <form action="" method="post">
  5. <label for="login">Login</label>
  6. <input type="text" name="login" required>
  7. <br>
  8. <label for="password">Hasło</label>
  9. <input type="password" name="password" required>
  10. <br>
  11. <input type="submit" name="wyslano" value="Zaloguj się"/>
  12. </form>
  13. ';
  14. }
Turson
1. Nie spotkałem się z sytuacją jeszcze, żeby ktoś miał spację w haśle. Nie szkodzi usunąc jak komus nie pasuje
2. Owszem biggrin.gif
Sillence
Teraz mam tak:
logowanie.php
  1. <?php
  2. mysql_connect("46.4.177.235","Starve",".....");
  3. mysql_select_db(".....");
  4. ?>
  5.  
  6. <?php
  7. if (isset($_GET['wyloguj'])==1)
  8. {
  9. $_SESSION['zalogowany'] = false;
  10. }
  11. ?>
  12.  
  13. <?php
  14. function filtruj($zmienna)
  15. {
  16. $zmienna = stripslashes($zmienna); // usuwamy slashe
  17.  
  18. // usuwamy spacje, tagi html oraz niebezpieczne znaki
  19. }
  20.  
  21. if (isset($_POST['loguj']))
  22. {
  23. $login = filtruj($_POST['login']);
  24. $haslo = filtruj($_POST['haslo']);
  25. $ip = filtruj($_SERVER['REMOTE_ADDR']);
  26.  
  27. // sprawdzamy czy login i hasło są dobre
  28. if (mysql_num_rows(mysql_query("SELECT Nick, Haslo FROM mapa_players WHERE Nick = '".$login."' AND Haslo = '".$haslo."';")) > 0)
  29. {
  30. // uaktualniamy date logowania oraz ip
  31.  
  32. $_SESSION['zalogowany'] = true;
  33. $_SESSION['login'] = $login;
  34.  
  35. // zalogowany
  36.  
  37. }
  38. else echo "Wpisano złe dane.";
  39. }
  40.  
  41. if ($_SESSION['zalogowany']==true)
  42. {
  43. echo "Witaj <b>".$_SESSION['login']."</b><br><br>";
  44.  
  45. echo '<a href="?wyloguj=1">[Wyloguj]</a>';
  46. }
  47. ?>
  48.  
  49. <?php if ($_SESSION['zalogowany']==false): ?>
  50.  
  51.  
  52. <?php endif; ?>
  53.  
  54. <?php mysql_close(); ?>


index.php
  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Login Form - CodePen</title>
  7. <link rel="stylesheet" href="css/style.css" media="screen" type="text/css" />
  8. </head>
  9.  
  10. <body>
  11.  
  12. <div id="login">
  13. <h1>Logowanie do Panelu Gracza</h1>
  14. <form method="POST" action="logowanie.php">
  15. <input type="text" name="login" placeholder="Nick" />
  16. <input type="password" name="haslo" placeholder="Haslo" />
  17. <input type="submit" value="Log in" />
  18. </form>
  19. </div>
  20.  
  21. <script src='http://codepen.io/assets/libs/fullpage/jquery.js'></script>
  22. <script src="js/index.js"></script>
  23.  
  24. </body>
  25. </html>


I niestety dalej coś nie trybi. Nie ważne co wpiszę to pokazuje się pusta strona logowanie.php.
Turson
Masz to na jakimś serwerze i adres w przeglądarce to np. 127.0.0.1/logowanie.php a nie D:/coś/tam/logowanie.php questionmark.gif
Włącz error_reporting
Sillence
Mam to na tej stronie:
http://sillence99.ct8.pl/panel/
Forti
Skad ty masz ten kod? Turson podal ci bardzo dobry system logowanie i rejestracji. Wystarczy 5 minut abys to podmienil u siebie.

I wlacz raportowanie bledow (patrz post kolegi wyzej).



Jezeli przy rejestracji kodowales haslo to przy sprawdzeniu warunku z haslem, pobrania z bazy rowniez musisz je w ten sam sposob kodowac

Zamias SELECT user, pass... Wpisz SELECT * FROM...
Sillence
Logowanie jest już okej, ale natomiast nie działa rejestracja. Pokazuje się okno że konto zostało założone, ale jednak w bazie danych nic nie tworzy:
  1. <?PHP
  2. //Formularz rejestracji
  3. function form(){
  4. echo '
  5. <form action="" method="post">
  6. <label for="login">Login</label>
  7. <input type="text" name="login" required>
  8. <br>
  9. <label for="password">Hasło</label>
  10. <input type="password" name="password" required>
  11. <br>
  12. <label for="password2">Powtórz hasło</label>
  13. <input type="password" name="password2" required>
  14. <br>
  15. <input type="submit" name="wyslano" value="Załóż konto"/>
  16. </form>
  17. ';
  18. }
  19.  
  20. //Połączenie z bazą danych MySQL PDO
  21. $db = new PDO('mysql:host=46.4.177.235;dbname='.....', 'Starve', '.....', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")) or die();
  22.  
  23. if(isset($_POST['wyslano'])){ //Sprawdzamy, czy submit został wciśnięty
  24. //Usuwamy białe znaki z przesłanych danych
  25. $login = trim($_POST['login']);
  26. $password = trim($_POST['password']);
  27. $password2 = trim($_POST['password2']);
  28.  
  29. $errors = NULL; //Tworzymy zmienną przechowująca ewentualne błędy
  30.  
  31. //Sprawdzamy, czy przesłane dane mają odpowiednią ilość znaków
  32. if(strlen($login)<3) $errors .= 'Login musi zawierać co najmniej 3 znaki<br>';
  33. if(strlen($password)<6) $errors .= 'Hasło musi zawierać co najmniej 6 znaków<br>';
  34. if($password!==$password2) $errors .= 'Hasła nie są takie same<br>';
  35.  
  36. //Sprawdzamy czy użytkownik o takim samym loginie już nie istnieje
  37. $stmt = $db->prepare("SELECT COUNT(UID) FROM mapa_players WHERE Nick=:login");
  38. $stmt->bindValue(":login", $login, PDO::PARAM_STR);
  39. $stmt->execute();
  40. $row = $stmt->fetch();
  41. if($row[0]>0) $errors .= 'Konto o takim loginie już istnieje<br>';
  42.  
  43.  
  44. if(empty($errors)){ //Jeśli nie ma błędów, rejestrujemy użytkownika
  45. $password = sha1($password); //kodujemy hasło
  46. $dodaj = $db->prepare("INSERT INTO mapa_players VALUES (null, $login, $password)");
  47. $dodaj->bindValue(":login", $login, PDO::PARAM_STR);
  48. $dodaj->bindValue(":password", $password, PDO::PARAM_STR);
  49. $dodaj->execute();
  50. echo "Zarejestrowałeś się. Możesz się teraz <a href=\"login.php\">zalogować</a>";
  51. }
  52. else{
  53. echo '<div style="color:red">'.$errors.'</div>';
  54. form(); //Wyświetlamy formularz
  55. }
  56. }
  57. else form();
  58. ?>
Forti
Linia 21 brak apostrofu zamykajacego. Przynajmniej dlatego calosc jest na niebiesko. Analizuje dalej.
Sillence
Apostrof w ten sposób ?
  1. $db = new PDO('mysql:host=46.4.177.235;dbname=BazaTestowa', 'Starve', 'swinkapepa1232', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';")) or die();
johny_s
  1. $dodaj = $db->prepare("INSERT INTO mapa_players VALUES (null, :login, :password)");
  2. $dodaj->bindValue(":login", $login, PDO::PARAM_STR);
  3. $dodaj->bindValue(":password", $password, PDO::PARAM_STR);
Forti
Kolega wyzej wyjasnil szybciej co jeszcze. Ahh ten moj telefon jest za wolny smile.gif
johny_s
tak z ciekawości to co wyżej to prawdziwe dane do logowania do Twojej bazy?
Sillence
Hasło nie smile.gif Pierwsze lepsze. biggrin.gif

Ale dalej coś nie pasi, bo nie tworzy konta w bazie :/
Turson
  1. $dodaj = $db->prepare("INSERT INTO mapa_players VALUES (null, :login, :password)");
  2. $dodaj->bindValue(":login", $login, PDO::PARAM_STR);
  3. $dodaj->bindValue(":password", $password, PDO::PARAM_STR);
  4. if(!$dodaj->execute()) print_r($dodaj->errorInfo());

zrób tak
Sillence
Wyświwtliło mi:
Array ( [0] => 21S01 [1] => 1136 [2] => Column count doesn't match value count at row 1 )
Turson
albo wyszczególniasz kolumny do jakich dodajesz, np.
INSERT INTO mapa_players(id,login,password) VALUES (null, :login, :password)
albo w VALUES podajesz wszystkie wartosci do wszystkich kolumn
Sillence
Konto tworzy, ale je duplikuje. Cały kod wygląda teraz tak:
  1. <?PHP
  2. //Formularz rejestracji
  3. function form(){
  4. echo '
  5. <form action="" method="post">
  6. <label for="login">Login</label>
  7. <input type="text" name="login" required>
  8. <br>
  9. <label for="password">Hasło</label>
  10. <input type="password" name="password" required>
  11. <br>
  12. <label for="password2">Powtórz hasło</label>
  13. <input type="password" name="password2" required>
  14. <br>
  15. <input type="submit" name="wyslano" value="Załóż konto"/>
  16. </form>
  17. ';
  18. }
  19.  
  20. //Połączenie z bazą danych MySQL PDO
  21. $db = new PDO('mysql:host=46.4.177.235;dbname=BazaTestowa', 'Starve', 'cicholak1232', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';")) or die();
  22.  
  23. if(isset($_POST['wyslano'])){ //Sprawdzamy, czy submit został wciśnięty
  24. //Usuwamy białe znaki z przesłanych danych
  25. $login = trim($_POST['login']);
  26. $password = trim($_POST['password']);
  27. $password2 = trim($_POST['password2']);
  28.  
  29. $errors = NULL; //Tworzymy zmienną przechowująca ewentualne błędy
  30.  
  31. //Sprawdzamy, czy przesłane dane mają odpowiednią ilość znaków
  32. if(strlen($login)<3) $errors .= 'Login musi zawierać co najmniej 3 znaki<br>';
  33. if(strlen($password)<6) $errors .= 'Hasło musi zawierać co najmniej 6 znaków<br>';
  34. if($password!==$password2) $errors .= 'Hasła nie są takie same<br>';
  35.  
  36. //Sprawdzamy czy użytkownik o takim samym loginie już nie istnieje
  37. $stmt = $db->prepare("SELECT COUNT(UID) FROM mapa_players WHERE Nick=:login");
  38. $stmt->bindValue(":login", $login, PDO::PARAM_STR);
  39. $stmt->execute();
  40. $row = $stmt->fetch();
  41. if($row[0]>0) $errors .= 'Konto o takim loginie już istnieje<br>';
  42.  
  43.  
  44. if(empty($errors)){ //Jeśli nie ma błędów, rejestrujemy użytkownika
  45. $dodaj = $db->prepare("INSERT INTO mapa_players(UID,Nick,Haslo) VALUES (null, :login, :password)");
  46. $dodaj->bindValue(":login", $login, PDO::PARAM_STR);
  47. $dodaj->bindValue(":password", $password, PDO::PARAM_STR);
  48. if(!$dodaj->execute()) print_r($dodaj->errorInfo());
  49. $dodaj->execute();
  50. echo "Zarejestrowałeś się. Możesz się teraz <a href=\"login.php\">zalogować</a>";
  51. }
  52. else{
  53. echo '<div style="color:red">'.$errors.'</div>';
  54. form(); //Wyświetlamy formularz
  55. }
  56. }
  57. else form();
  58. ?>
kartin
Cytat(Forti @ 4.06.2014, 21:43:36 ) *
Zamias SELECT user, pass... Wpisz SELECT * FROM...
Akurat jawne podawanie nazw pól (zamiast pobierania wszystkiego jak leci) to bardzo dobra praktyka.

Skoro masz tabelę:
UID | Nick | Haslo | Pieniadze | Punkty
to zapytanie
  1. INSERT INTO mapa_players VALUES (NULL, :login, :password)
nie przejdzie.

Musisz podać wszystkie pola z tabeli albo musisz podać nazwy pól które chcesz uzupełnić:
  1. INSERT INTO mapa_players (UID, Nick, Haslo) VALUES (NULL, :login, :password)


Nie przechowuj haseł w bazie w formie jawnej.
johny_s
  1. if(!$dodaj->execute()) print_r($dodaj->errorInfo());
  2. $dodaj->execute();


sam je 2x duplikujesz smile.gif
Sillence
Czyli jak to powinno wyglądać poprawnie ?

O dziwo już wszystko działa poprawnie. Dziękuję bardzo wszystkim za pomoc smile.gif W razie problemów będę pisać w temacie smile.gif
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.