Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Problem z funkcją logowania się
xsalok
post 21.01.2016, 15:24:16
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 18.01.2016

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


Piszę prostą stronę na której będzie można się rejestrować oraz logować, mam problem z funkcją logowania się i pomimo wielu prób nie mogę go rozwiązać.
Teoretycznie funkcja log_in z klasy User_Log_In powinna obliczać ilość linii odpowiedzi z bazy danych i na tej podstawie decydować czy użytkownik istnieje w systemie (wówczas liczba linii w odpowiedzi powinna wynosic 1) i właśnie tutaj mam problem.

W tym momencie wywala mi błąd : "Fatal error: Can't use function return value in write context in C:\xampp\htdocs\php_new\classes\user_log_in.php on line 23"
Ale podejrzewam, że coś innego również może być nie tak.

Na dole zamieszczam listing poszczególnych plików:

1.logowanie.php
  1. <html>
  2. <head>
  3. <title> Logowanie </title>
  4. </head>
  5.  
  6. <body>
  7.  
  8. <form method="POST" action="" onsubmit="">
  9. <table border=0>
  10.  
  11. <tr>
  12. <td>Login </td>
  13. <td align="center"><input type="text" name="login" size="40" maxlength="50" /></td>
  14. </tr>
  15. <tr>
  16. <td>Hasło</td>
  17. <td><input type="password" name="password" size="40" maxlength="50" /></td>
  18. </tr>
  19. <tr>
  20. <td colspan="2" align="center">
  21. <input name="zaloguj" type="submit" value="Zaloguj"/>
  22. <button>
  23. <a href="index.html">Wstecz</a>
  24. </button>
  25. </td>
  26. </tr>
  27. </table>
  28. </form>
  29.  
  30. <?php
  31.  
  32. if(isset($_POST['zaloguj'])) {
  33. include 'classes/user.php';
  34. include 'classes/user_log_in.php';
  35.  
  36. if(User_Log_In::checkForm_login($_POST['login'],$_POST['password'])){
  37. $user = new User_Log_In($_POST['login'],'',$_POST['password']);
  38. $user->db();
  39. $user->log_in();
  40. }
  41. }
  42.  
  43.  
  44.  
  45. ?>
  46.  
  47.  
  48.  
  49. </body>
  50.  
  51. </html>


2.User.php
  1. <?php
  2.  
  3. class User{
  4.  
  5. public $login;
  6. public $email;
  7. public $password;
  8. public $checkError;
  9. public $db;
  10.  
  11. function __construct($login,$email,$password){
  12. $this->login = $login;
  13. $this->password = $password;
  14. if(isset($email)){
  15. $this->email = $email;
  16. }
  17. }
  18.  
  19.  
  20.  
  21. function db(){
  22. $class_db_file = 'classes/data_base.php';
  23. if (file_exists($class_db_file)){
  24. require_once($class_db_file);
  25. $this->db = new data_base();
  26. }
  27. else{
  28. echo 'Klasa ' .$class_db_file. ' nie została odnaleziona';
  29. }
  30. }
  31.  
  32. }
  33. ?>


3.user_log_in.php
  1. <?php
  2.  
  3. class User_Log_In extends User{
  4.  
  5. public static function checkForm_login($login,$password){
  6.  
  7. if(!filter_var($login,FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=>"/[a-zA-Z0-9]{3,12}/")))){
  8. echo'Nie prawidłowy login lub hasło.';
  9. return false;
  10. }
  11. if(!filter_var($password,FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=>"/[a-zA-Z0-9]{3,12}/")))){
  12. echo'Nie prawidłowy login lub hasło.';
  13. return false;
  14. }
  15. return true;
  16. }
  17.  
  18.  
  19. function log_in(){
  20.  
  21. if ($this->db->connect()){
  22. $sql = "SELECT * FROM `users` WHERE `login` = '".mysql_real_escape_string($this->login)." AND `password` =".mysql_real_escape_string(md5($this->password))."'";
  23. if(mysql_num_rows($this->db->select($sql))=1){
  24. echo "Zalogowany jako " .$this->login;
  25. }
  26. else{
  27. echo'Niepoprawne dane logowania';
  28. }
  29.  
  30. }
  31. }
  32.  
  33. }
  34.  
  35. ?>


4.data_base.php z komentarzami dla siebie samego żeby lepiej zrozumieć kod
  1. <?php
  2. class Data_Base{
  3.  
  4. // na początek zmienny prywatne, niedostępne poza klasą
  5. // ustalamy zmienne na stałe które w pliku php ustalamy
  6. // za pomocą define(DB_HOST, 'db_host');
  7. private $db_host = 'localhost'; // podstawiamy host bazy danych
  8. private $db_name = 'users'; // podajemy nazwę bazy danych
  9. private $db_user = 'user'; // podajemy nazwę użytkownika z uprawnieniami odczytu i zapisu
  10. private $db_passw = 'user'; // podajemy hasło dla użytkownika;
  11.  
  12. // zmienne publiczne - dostępne poza klasą
  13. public $connection; // połączenie
  14. public $error; // ew. błąd zwrócony przez bazę danych
  15.  
  16.  
  17. //łaczenie z bazą danych
  18. public function connect(){
  19. //sprawdzam czy uda mi się nawiązać połączenie z bazą danych
  20. //jeśli połączenie zostanie nawiązane podstawiam je pod zmienną $connection
  21. if($connection = mysql_connect($this->db_host, $this->db_user, $this->db_passw))
  22. //sprawdzam czy uda mi się wybrać bazę danych, jeśli tak to podstawiam pod $connection połączenie i zwracam true
  23. if(mysql_select_db($this->db_name, $connection)){
  24. $this->connection = $connection;
  25. return true;
  26. }
  27. //jeśli nie podstawiam pod zmienną error błąd MYSQL do późniejszego sformatowania
  28. else {
  29. $this->error=mysql_error();
  30. return false;
  31. }
  32. }
  33.  
  34.  
  35. //w przypadku powodzenia zwraca wynik zapytania SQL
  36. public function select($sql){
  37. //sprawdzam czy istnieje aktywne połączenie z bazą danych
  38. if($this->connection){
  39. //ustawiam kodowanie dla połączenia na UTF-8
  40. mysql_set_charset('utf8',$this->connection);
  41. //sprawdzam czy $sql zaiwera zapytanie SQL do bazy danych i czy nie jest pusta
  42. if(isset($sql) && $sql!=''){
  43. //wysyłam zapytanie do bazy jeśli operacja skończy się sukcesem to zwracam wynik
  44. if($result = mysql_query($sql)){
  45. return result;
  46. }
  47. //jeśli nie to błąd do $error
  48. else {
  49. $this->error = mysql_error();
  50. return false;
  51. }
  52. }
  53. else{
  54. $this->error = 'Błąd zapytania SQL';
  55. return false;
  56. }
  57. }
  58. else{
  59. $this->error = 'Brak połączenia z bazą danych';
  60. return false;
  61. }
  62. }//eof select();
  63.  
  64.  
  65. //funkcja która zwraca TRUE jako potwierdzenie pomyślnego wykonania operacji
  66. public function query($sql){
  67. if (isset($sql) && $sql != '') {
  68. if ($this->connection) {
  69. mysql_set_charset('utf8', $this->connection);
  70. //różnica pomiędzy selectem jest tutaj
  71. if (mysql_query($sql)){
  72. return true;
  73. } //eof różnica
  74. else {
  75. $this->error = mysql_error();
  76. return false;
  77. }
  78. }
  79. else {
  80. $this->error = 'Brak połączenia z bazą danych';
  81. return false;
  82. }
  83. }
  84. else {
  85. $this->error = 'Błąd zapytania SQL';
  86. return false;
  87. }
  88. }//eof query();
  89.  
  90.  
  91. //zamknięcie połączenia z bazą danych
  92. public function close(){
  93. if($this->connection){
  94. if (mysql_close($this->connection)){
  95. return true;
  96. }
  97. else{
  98. $this->error = mysql_error();
  99. return false;
  100. }
  101. }
  102. else{
  103. $this->error = 'Brak aktywnego połączenia';
  104. return false;
  105. }
  106.  
  107. }//eof close();
  108. }
  109. ?>


Myślę że może to być jakiś głupi błąd, bo nie jestem doświadczony, dlatego umieszczam w dziale przedszkole.

Korzystam z phpMyAdmin

Ten post edytował xsalok 21.01.2016, 15:27:16
Go to the top of the page
+Quote Post
redeemer
post 21.01.2016, 15:29:34
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Operatory porównania to == i === a nie = (to operator przypisania).

"Fatal error: Can't use function return value in write context in C:\xampp\htdocs\php_new\classes\user_log_in.php on line 23"

Ten post edytował redeemer 21.01.2016, 15:31:12


--------------------
Go to the top of the page
+Quote Post
xsalok
post 21.01.2016, 15:31:47
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 18.01.2016

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


Okej, wcześniej musiałem mieć prawidłowy ale zacząłem grzebać w kodzie i zmieniać.

Aktualnie wyrzuca mi takie błędy:


Notice: Use of undefined constant result - assumed 'result' in C:\xampp\htdocs\php_new\classes\data_base.php on line 45

Warning: mysql_num_rows() expects parameter 1 to be resource, string given in C:\xampp\htdocs\php_new\classes\user_log_in.php on line 23
Go to the top of the page
+Quote Post
redeemer
post 21.01.2016, 15:33:58
Post #4





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Masz dokładną nazwę pliku i numer linii.
  1. ...
  2. return result;
  3. ...
Nie widzisz tu nic dziwnego?


--------------------
Go to the top of the page
+Quote Post
darko
post 21.01.2016, 15:34:26
Post #5





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Zamiast return result; powinno być return $result;


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
xsalok
post 21.01.2016, 15:37:52
Post #6





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 18.01.2016

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


Przed chwilą to zauważyłem smile.gif

Głupie błędy początkującego.

Mimo to, ten warunek mi nie działa i nie wyświetla komunikatu o zalogowaniu się.
  1.  
  2. if(mysql_num_rows($this->db->select($sql))==1){
  3.  
  4. echo "Zalogowany jako " .$this->login;
  5. }
  6. else{
  7. echo'Niepoprawne dane logowania';
  8. }
  9.  


A zarówno login jak i hasło są poprawne :/

Ten post edytował xsalok 21.01.2016, 15:39:30
Go to the top of the page
+Quote Post
redeemer
post 21.01.2016, 15:39:53
Post #7





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Złe zapytanie SQL:
  1. $sql = "SELECT * FROM `users` WHERE `login` = '".mysql_real_escape_string($this->login)." AND `password` =".mysql_real_escape_string(md5($this->password))."'";
Zwróc uwagę na apostrofy.

Ten post edytował redeemer 21.01.2016, 15:41:53


--------------------
Go to the top of the page
+Quote Post
xsalok
post 21.01.2016, 15:43:23
Post #8





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 18.01.2016

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


  1. $sql = "SELECT * FROM `users` WHERE `login` = ' ".mysql_real_escape_string($this->login)." ' AND `password` = ' ".mysql_real_escape_string(md5($this->password))." ' ";


Wydaje mi się że to zapytanie jest już poprawne, ale błąd wciąż występuje.
Go to the top of the page
+Quote Post
redeemer
post 21.01.2016, 15:44:23
Post #9





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Nie jest ;-) Wyświetl je sobie na ekran echo $sql, a zobaczysz czemu.

Ten post edytował redeemer 21.01.2016, 15:45:39


--------------------
Go to the top of the page
+Quote Post
xsalok
post 21.01.2016, 15:50:53
Post #10





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 18.01.2016

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



zapytanie wygenerowane (za pomocą narzędzi) z bazy danych:
  1. SELECT * FROM `users` WHERE `login` = 'user' AND `password` = 'ee11cbb19052e40b07aac0ca060c23'


zapytanie wygenerowane przez php:
  1. SELECT * FROM `users` WHERE `login` = 'user' AND `password` = 'ee11cbb19052e40b07aac0ca060c23ee'


Gołym okiem widać różnicę biggrin.gif
Otóż mądry ja zapomniałem że md5 musi mieć 32 znaki w polu które go przechowuje, a w bazie ustaliłem password na 30, stąd cały ambaras że obcinał o te 2 znaki i logowanie faktycznie było niepoprawne
Go to the top of the page
+Quote Post
viking
post 21.01.2016, 16:20:46
Post #11





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


To teraz jeszcze przejdź na PDO zamiast nieaktualne mysql_*() oraz poczytaj o password_hash() password_verify().


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 02:47