Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa logowania usera
Forum PHP.pl > Forum > PHP
michalboss
Witam

Napisałem taką klasę logowania użytkownika w systemie.
Nie jest jeszcze skończona, ale chciałem prosić o ewentualne wskazanie błędów w w/w kodzie, ponieważ dopiero zaczynam OOP w php.

  1. <?php
  2.  
  3. class Login
  4. {
  5.  
  6. private $_dbh;
  7. private $_config;
  8. private $_lang;
  9. private $_isLoggin = FALSE;
  10. private $_idSession;
  11. private $_email;
  12. private $_password;
  13.  
  14. public function __construct($dbh, $config, $lang)
  15. {
  16. $this -> _dbh = $dbh;
  17. $this -> _config = $config;
  18. $this -> _lang = $lang;
  19. }
  20.  
  21. /**
  22.   * Metoda sprawdza czy user jest zalogowany w systemie
  23.   *
  24.   * @access public
  25.   * @return bool
  26.   */
  27. public function checkLoggin()
  28. {
  29. return $this -> _isLoggin;
  30. }
  31.  
  32. /**
  33.   * Metoda sprawdza czy istnieją zmienne sesyjne - jeśli tak, to loguje usera w klasie
  34.   *
  35.   * @access public
  36.   * @return bool
  37.   */
  38. protected function isLoggin()
  39. {
  40. if($_SESSION['isLoggin'] == TRUE)
  41. {
  42. $this -> _isLoggin = $_SESSION['isLoggin'];
  43. $this -> _idSession = session_id();
  44. $this -> _email = $_SESSION['email'];
  45. return TRUE;
  46. }
  47. else
  48. {
  49. return FALSE;
  50. }
  51. }
  52.  
  53. /**
  54.   * Metoda logowania - sprawdzania czy użytkownik jest zalogowany i czy istnieją zmienne formularza logowania
  55.   * Jeśli tak, to sprawdza w bazie poprawność e-mail oraz hasła i dokonuje logowania w systemie
  56.   *
  57.   * @access public
  58.   * @return void
  59.   */
  60. public function userLogin()
  61. {
  62. $errorMsg = '';
  63. if(!($this -> _isLoggin) && isset($_POST['logEmail']) && isset($_POST['logPassword']))
  64. {
  65. $sql = $this -> _dbh -> prepare('SELECT A.IdUser, A.Email, A.Password, A.Salt, A.FirstName, A.LastName, A.ErrorLogin, A.ErrorLoginTime, A.Current '
  66. . 'FROM `users` A '
  67. . 'WHERE A.Email=:email LIMIT 1');
  68. $sql -> bindValue(':email', $_POST['logEmail'], PDO::PARAM_STR);
  69. $sql -> execute();
  70. if($sql -> rowCount() > 0)
  71. {
  72. if($row = $sql -> fetch())
  73. {
  74. if(self::encode($_POST['logPassword'], $row['Salt']) == $row['Password'])
  75. {
  76. $_SESSION['isLoggin'] = TRUE;
  77. $_SESSION['email'] = $row['Email'];
  78. $_SESSION['IdUser'] = $row['IdUser'];
  79. $this -> isLoggin();
  80. }
  81. else
  82. {
  83. $errorMsg = $this -> _lang['errorLogin'];
  84. }
  85. }
  86. }
  87. else
  88. {
  89. $errorMsg = $this -> _lang['errorLogin'];
  90. }
  91.  
  92. if(!empty($errorMsg))
  93. {
  94. throw new Exception($errorMsg);
  95. }
  96. }
  97. else if(!($this -> _isLoggin) && isset($_SESSION['isLoggin']) && $_SESSION['isLoggin'] == TRUE)
  98. {
  99. $this -> isLoggin();
  100. }
  101. }
  102.  
  103. /**
  104.   * Metoda wylogowuje uzytkownika i usuwa sesję
  105.   *
  106.   * @access public
  107.   * @return void
  108.   */
  109. public function userLogout()
  110. {
  111. unset($_SESSION);
  112. unset($this -> _isLoggin);
  113. unset($this -> _idSession);
  114. unset($this -> _email);
  115. header("Location: index.php?msg=logout");
  116. }
  117.  
  118. /**
  119.   * Metoda hashuje hasło używając podanej soli z kartoteki usera
  120.   *
  121.   * @access public
  122.   * @param string $Password
  123.   * @param string $Salt
  124.   * @return string
  125.   */
  126. public static function encode($Password, $Salt)
  127. {
  128. return hash('sha256', $Salt . hash('sha256', $Password . $Salt));
  129. }
  130.  
  131. /**
  132.   * Metoda tworzy sól podanego hasła
  133.   *
  134.   * @access public
  135.   * @param string $Password
  136.   * @return string
  137.   */
  138. public static function salt($Password)
  139. {
  140. return substr(hash('sha256', microtime() . substr($Password, 0, 3)), 0, 5);
  141. }
  142.  
  143. public static function timemicro()
  144. {
  145. list($z1, $se) = explode(" ", microtime());
  146. return ((float) $z1 + (float) $se);
  147. }
  148.  
  149. }
  150. ?>
Damonsson
Żeby było szybciej napiszę co jest dobrze: nic. Nie jestem złośliwy w tym wypadku, uwierz. Może komuś będzie się chciało tłumaczyć, więc nie kasuj wątku.

Wygoogluj sobie: php oop example, php oop login example itp.
CuteOne
Szybkie code review:
1.
  1. $this -> _dbh

znacznie czytelniejsza wersja
  1. $this->dbh

2. Nazwy metod z 4 liter. np "checkLoggin()"
3. $_SESSION['isLoggin'] rzuci notice jeżeli klucz nie istnieje
4. Odpowiedz mi na pytanie, po cholerę w metodzie, która ma przypisać coś do czegoś robisz return bool? Zamiast zwyczajnie przypisać i opuścić metodę
  1. /**
  2.   * Metoda sprawdza czy istnieją zmienne sesyjne - jeśli tak, to loguje usera w klasie
  3.   *
  4.   * @access public
  5.   * @return bool
  6.   */
  7. protected function isLoggin()
  8. {
  9. if($_SESSION['isLoggin'] == TRUE)
  10. {
  11. $this -> _isLoggin = $_SESSION['isLoggin'];
  12. $this -> _idSession = session_id();
  13. $this -> _email = $_SESSION['email'];
  14. return TRUE;
  15. }
  16. else
  17. {
  18. return FALSE;
  19. }
  20. }

5. Zbędny else
  1. if (1 == 1) {
  2. return true;
  3. }
  4. return false;

6. Przeczytaj co to SÓL, bo ta metoda nie ma z nią nic wspólnego
7. Po co ci statyczne metody?

Reszty już nie chce mi się sprawdzać - wszystko jest nie tak jak być powinno sad.gif

@edit a o hashowaniu hashó masz pogadankę w podczepionych
michalboss
Dzięki za odp - poprawię ten kod i dam jeszcze raz.
Nie rozumiem tylko punktu 2 oraz 6 - możesz rozwinąć?
Skie
2. Tutaj koledze chodziło o to, że nazwy metod jakie dobierasz odbiegają daleko od tego co dana metoda robi - np. isLoggin (lepsza nazwa to byłoby bodajże isLogged) sugeruje, że akcja sprawdza czy użytkownik jest zalogowany - tylko to. Twoja wersja z kolei jeszcze pod spodem robi własne logowanie, o czym nazwa metody nie mówi nic a nic.

6. Poczytaj o soli tutaj Temat: podwojne hashowanie hasel . Generalnie chodzi o to, że sól to pewny tajny string, którego używasz do konkatenacji z wpisanym przez użytkownika hasłem, by bronić się przed tęczowymi tablicami. Ta sól powinna być zahardkodowana gdzieś w kodzie Twojej aplikacji lub pobierana z jakichś plików źródłowych - nie powinna być trzymana w bazie danych koło hasła, bo wtedy skuteczność używania tej metody spada praktycznei do zera.
Damonsson
Cytat(Skie @ 1.08.2015, 14:55:48 ) *
Ta sól powinna być zahardkodowana gdzieś w kodzie Twojej aplikacji lub pobierana z jakichś plików źródłowych - nie powinna być trzymana w bazie danych koło hasła, bo wtedy skuteczność używania tej metody spada praktycznei do zera.

Jeżeli będzie zahardkodowana w kodzie, to będzie taka sama dla każdego usera i jej użyteczność bardzo mocno spadnie, w przypadku jej poznania. Znowu jeżeli będzie w bazie danych to będzie widoczna dla każdego hasła. Dlatego jestem zwolennikiem trzymania soli zarówno zahardkodowanej w kodzie jak i w bazie danych dla każdego hasła innej. Gdybym musiał wybierać nad tylko jednym sposobem trzymania soli, wybieram zdecydowanie opcję w bazie danych.
michalboss
To chyba najlepiej podwójne hashowanie sola z bazy + solą ogólną dla systemu?
Pyton_000
A nie lepiej użyć jednego kodowania ale mocnego? Dajmy na to BlowFish, sha512 lub whirlpool ? Złamanie takiego hasła jest *nie możliwe (* nie możliwe w rozsądnym czasie)
Skie
Cytat
Dlatego jestem zwolennikiem trzymania soli zarówno zahardkodowanej w kodzie jak i w bazie danych dla każdego hasła innej.


Bez sensu trzymać sól w bazie danych, skoro używa się jej właśnie po to, by włamywacz nie był w stanie odszyfrować hasz haseł za pomocą tęczowych tablic po zdobyciu dostępu / zrzutu bazy danych aplikacji. Jest super mało prawdopodobne, że ktoś taki zdobędzie same hasze z bazy , ale soli już nie, dlatego tak jak pisałem - albo hardkodujemy sól w kodzie aplikacji albo pobieramy z zewnętrznego źródła. Polecam jednak hardkodować, bo jak w jakiś sposób stracisz sole wygenerowane dla pojedynczych użytkowników to będzie przeje.... smile.gif
borabora
Cytat(Skie @ 1.08.2015, 21:29:07 ) *
Bez sensu trzymać sól w bazie danych, skoro używa się jej właśnie po to, by włamywacz nie był w stanie odszyfrować hasz haseł za pomocą tęczowych tablic po zdobyciu dostępu / zrzutu bazy danych aplikacji.


nikt nie powiedział, że kod musi wyglądać tak:
  1. haszowanie($sol.$haslo)


sól z bazy możesz zmienić w skrypcie w sposób, w jaki Ci się podoba
michalboss
Trochę zmieniłem kod klasy - może to jest trochę bardziej prawidłowe od poprzedniego?
Jeśli chodzi o metody statyczne to zdefiniowałem je aby także użyć w innych klasach jak user -> rejestracja.

  1. <?php
  2.  
  3. class Login
  4. {
  5.  
  6. private $dbh;
  7. private $config;
  8. private $lang;
  9. private $isLogged = FALSE;
  10. private $idSession;
  11. private $email;
  12. private $idUser;
  13.  
  14. public function __construct($dbh, $config, $lang)
  15. {
  16. $this->dbh = $dbh;
  17. $this->config = $config;
  18. $this->lang = $lang;
  19. }
  20.  
  21. /**
  22.   * Metoda sprawdza czy user jest zalogowany w systemie
  23.   *
  24.   * @access public
  25.   * @return bool
  26.   */
  27. public function checkLogged()
  28. {
  29. return $this->isLogged;
  30. }
  31.  
  32. /**
  33.   * Metoda sprawdza czy uzytkownik jest zalogowany (w klasie) - jeśli tak, to zapisuje dane z klasy do sesji
  34.   *
  35.   * @access public
  36.   * @return bool
  37.   */
  38. protected function setSessionData()
  39. {
  40. if($this->isLogged == TRUE)
  41. {
  42. $_SESSION['isLogged'] = $this->isLogged;
  43. $_SESSION['idUser'] = $this->idUser;
  44. $_SESSION['email'] = $this->email;
  45. }
  46. }
  47.  
  48. /**
  49.   * Metoda sprawdza czy uzytkownik jest zalogowany (sesję) - jeśli tak, to zapisuje dane z sesji do klasy
  50.   *
  51.   * @access public
  52.   * @return bool
  53.   */
  54. protected function getSessionData()
  55. {
  56. if(isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)
  57. {
  58. $this->isLogged = $_SESSION['isLogged'];
  59. $this->idUser = $_SESSION['idUser'];
  60. $this->email = $_SESSION['email'];
  61. $this->idSession = session_id();
  62. }
  63. }
  64.  
  65. /**
  66.   * Metoda logowania - sprawdza czy użytkownik nie jest już zalogowany i czy istnieją zmienne formularza logowania
  67.   * Jeśli tak, to sprawdza w bazie poprawność e-mail oraz hasła i dokonuje logowania w systemie
  68.   * Sprawdzana jest także ilość błędnych logowań - max 5 oraz czas od pierwszego błędnego logowania.
  69.   *
  70.   * @access public
  71.   * @return void
  72.   */
  73. public function userLogin()
  74. {
  75. $errorMsg = '';
  76. if(!($this->isLogged) && isset($_POST['logEmail']) && isset($_POST['logPassword']))
  77. {
  78. $sql = $this->dbh->prepare('SELECT A.IdUser, A.Email, A.Password, A.Salt, A.FirstName, A.LastName, A.ErrorLogin, A.ErrorLoginTime, A.Current '
  79. . 'FROM `users` A '
  80. . 'WHERE A.Email=:email LIMIT 1');
  81. $sql->bindValue(':email', $_POST['logEmail'], PDO::PARAM_STR);
  82. $sql->execute();
  83. if($sql->rowCount() > 0)
  84. {
  85. if($row = $sql->fetch())
  86. {
  87. $timeActual = strtotime(date("Y-m-d H:i:s"));
  88. $timeLogin = strtotime($row['ErrorLoginTime']);
  89. $timeCheck = $timeActual - $timeLogin;
  90. $timeCheckMin = round(60 - ($timeCheck / 60), 0);
  91.  
  92. if(self::decode($_POST['logPassword'], $row['Password']) == TRUE)
  93. {
  94. if($row['Current'] == 0)
  95. {
  96. $errorMsg = $this->lang['errorLoginCurrentError'];
  97. }
  98. else if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
  99. {
  100. $errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
  101. }
  102. else
  103. {
  104. $this->isLogged = TRUE;
  105. $this->email = $row['Email'];
  106. $this->idUser = $row['IdUser'];
  107. $this->idSession = session_id();
  108. $this->setSessionData();
  109. if($row['ErrorLogin'] > 0 || $row['ErrorLoginTime'] != NULL)
  110. {
  111. $this->resetErrorLogin();
  112. }
  113. }
  114. }
  115. else
  116. {
  117. if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
  118. {
  119. $errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
  120. }
  121. else
  122. {
  123. $this->updateErrorLogin($_POST['logEmail']);
  124. $errorMsg = $this->lang['errorLogin'];
  125. }
  126. }
  127. }
  128. }
  129. else
  130. {
  131. $this->updateErrorLogin($_POST['logEmail']);
  132. $errorMsg = $this->lang['errorLogin'];
  133. }
  134.  
  135. if(!empty($errorMsg))
  136. {
  137. throw new Exception($errorMsg);
  138. }
  139. }
  140. else if(!($this->isLogged) && isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)
  141. {
  142. $this->getSessionData();
  143. }
  144. }
  145.  
  146. /**
  147.   * Metoda resetuje ilośc błędów logowania oraz czas,
  148.   * dla użytkownika, w przypadku powodzenia logowania
  149.   *
  150.   * @access public
  151.   * @return void
  152.   */
  153. protected function resetErrorLogin()
  154. {
  155. $sql2 = $this->dbh->prepare('UPDATE `users` SET ErrorLogin = 0, ErrorLoginTime = NULL '
  156. . 'WHERE Email=:email');
  157. $sql2->bindValue(':email', $this->email, PDO::PARAM_STR);
  158. $sql2->execute();
  159. }
  160.  
  161. /**
  162.   * Metoda zwiększa ilośc błędnych logowań oraz zapisuje czas pierwszego błednego logowania
  163.   *
  164.   * @access public
  165.   * @return void
  166.   */
  167. protected function updateErrorLogin($logEmail)
  168. {
  169. $sql2 = $this->dbh->prepare('UPDATE `users` SET '
  170. . 'ErrorLogin = ErrorLogin+1, '
  171. . 'ErrorLoginTime = if(ErrorLoginTime IS NULL, \'' . date("Y-m-d H:i:s") . '\', ErrorLoginTime) '
  172. . 'WHERE Email=:email');
  173. $sql2->bindValue(':email', $logEmail, PDO::PARAM_STR);
  174. $sql2->execute();
  175. }
  176.  
  177. /**
  178.   * Metoda wylogowuje uzytkownika, niszczy sesję i usuwa dane
  179.   *
  180.   * @access public
  181.   * @return void
  182.   */
  183. public function userLogout()
  184. {
  185. unset($_SESSION);
  186. unset($this->isLogged);
  187. unset($this->idSession);
  188. unset($this->email);
  189. unset($this->idUser);
  190. header("Location: index.php?msg=logout");
  191. }
  192.  
  193. /**
  194.   * Metoda hashuje hasło używając podanej soli z kartoteki usera
  195.   *
  196.   * @access public
  197.   * @param string $Password
  198.   * @param string $Salt
  199.   * @return string
  200.   */
  201. public static function encode($password, $salt, $rounds = 10000)
  202. {
  203. // pass in the password, the number of rounds, and the salt
  204. // $5$ specifies SHA256-CRYPT, use $6$ if you really want SHA512
  205. return crypt($password, sprintf('$6$rounds=%d$%s$', $rounds, $salt));
  206. }
  207.  
  208. /**
  209.   * Metoda rozszyfrowuje podane hasło
  210.   *
  211.   * @access public
  212.   * @param string $Password
  213.   * @param string $Salt
  214.   * @return string
  215.   */
  216. public static function decode($password, $dbPassword)
  217. {
  218. // extract the hashing method, number of rounds, and salt from the stored hash
  219. // and hash the password string accordingly
  220. $parts = explode('$', $dbPassword);
  221. $testPassword = crypt($password, sprintf('$%s$%s$%s$', $parts[1], $parts[2], $parts[3]));
  222. return ($dbPassword === $testPassword) ? TURE : FALSE;
  223. }
  224.  
  225. /**
  226.   * Metoda tworzenia 16-znakowej soli
  227.   *
  228.   * @access public
  229.   * @return string
  230.   */
  231. public static function salt()
  232. {
  233. //return substr(hash('sha256', microtime() . substr($Password, 0, 3)), 0, 5);
  234. return substr(str_replace('+','.',base64_encode(md5(mt_rand(), true))),0,16);
  235. }
  236. }
  237. ?>
CuteOne
Już trochę lepiej to wygląda ale gdybyś pracował jako programista taki kod nigdy nie wszedłby na produkcję wink.gif Dobra rada - spróbuj swoich sił z jakimś frameworkiem np. Zend 1/2, Symfony 2, CakePHP. Zobaczysz jak powinno się pisać aplikacje, czym tak naprawdę jest OPP (to nie zbiór metod w klasie X) i jak z niego korzystać

Szybkie CR
1. Nie rób jednej klasy, która robi masę różnych rzeczy - widziałeś kiedyś bolida F1, który kosi trawnik, ora pole i rozwozi mleko? Podziel tą klasę na mniejsze odpowiadające różnym zadaniom
- coś odpowiedzialnego za obsługę sesji
- coś co filtruje/waliduje dane
- klasa autoryzacji (nie myl z "logowaniem" - klasa logowania jedynie korzysta z klas autoryzacji)
- klasa obsługująca akcje autoryzacyjne - logowanie, wylogowanie czy rejestracja
- klasa trzymająca dane użytkownika - login, id itp.
- klasa obsługująca hashowanie
itp.
2. Za dużo if else. Poważnie... przemyśl czy nie da się tego uprościć/rozbić na kilka metod
3. " header("Location: index.php?msg=logout");" to powinno wylecieć, metoda logout ma TYLKO jedno zadanie - usuń sesję użytkownika - tyle, żadnych redirectów czy echów. To samo tyczy się innych metod
4. Do konstruktora, możesz przekazać tablicę jako handler bazy danych (brak "wymuszenia" typu danych)
5. Pomijam ocenę tych czasochłonnych operacji przy generowaniu soli (kwestia gustu) jednak istnieją prostsze metody jej generowania wink.gif
6. Cóż to za potworek.. ?
  1. else if(!($this->isLogged) && isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)

7. I kolejny
  1. (...)$errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';(...)
  2. (...)$errorMsg = $this->lang['errorLogin'];(...)
  3. //itp.
  4. // a później..
  5. if(!empty($errorMsg))
  6. {
  7. throw new Exception($errorMsg);
  8. }


@edit w metodzie 'userLogin()' robisz
  1. $this->isLogged = TRUE;
  2. $this->email = $row['Email'];
  3. $this->idUser = $row['IdUser'];
  4. $this->idSession = session_id();
  5. $this->setSessionData();

po czym w setSessionData() robisz ponownie to samo...
michalboss
Z tego co piszesz to rozumiem że lepiej zrobić zamiast:

  1. if($row['Current'] == 0)
  2. {
  3. $errorMsg = $this->lang['errorLoginCurrentError'];
  4. }
  5. else if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
  6. {
  7. $errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
  8. }


to:

  1. if (!$this->checkCurrent())
  2. {
  3. throw new Exception($this->lang['errorLoginCurrentError']);
  4. }
  5.  
  6. if (!$this->checkErrorLoggin())
  7. {
  8. throw new Exception($this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min');
  9. }


Czy taki zapis będzie lepszy od else if ?
Wtedy też likwiduje to ten dziwny zapis:
  1. if(!empty($errorMsg))
  2. {
  3. throw new Exception($errorMsg);
  4. }




Ten pierwszy potworek:
  1. else if(!($this->isLogged) && isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)

sprawdza czy user jest zalogowany (w klasie) i jeśli nie jest, a istnieją dane sesyjne to ma przypisać ich wartości do pól klasy.
Czy po prostu to powinien zrobić konstruktor - np sprawdzić przy tworzeniu obiektu czy są zmienne sesyjne i je przypisać?
marcio
Jesli chcesz spojrz na moja klase do logowania nie jest to na pewno jakis super kod ale moze ci pomoc, tak jak widzisz klasa uzywa wiele innych bibliotek i jest podzielona na wiecej "czesci"
https://github.com/marcio199226/Volta-frame...ollers/auth.php
Pyton_000
I jest równie fatalnie napisana co autora wątku.
marcio
Cytat(Pyton_000 @ 3.08.2015, 13:50:24 ) *
I jest równie fatalnie napisana co autora wątku.

No skoro tak twierdzisz to pokaz twoja wink.gif
Pyton_000
A kto powiedział że takową mam. Ja nie wymyślam koła na nowo wink.gif
audiodesign10
Cytat(Damonsson @ 31.07.2015, 21:48:38 ) *
Żeby było szybciej napiszę co jest dobrze: nic. Nie jestem złośliwy w tym wypadku, uwierz. Może komuś będzie się chciało tłumaczyć, więc nie kasuj wątku.

Wygoogluj sobie: php oop example, php oop login example itp.



Witam,
więc prosiłbym abyś pokazał dobry przykład jak to się dokładnie robi, aby początkujący programiści nie musieli na przyszłość błądzić.

Pozdrawiam wink.gif
marcio
Cytat(Pyton_000 @ 3.08.2015, 19:55:57 ) *
A kto powiedział że takową mam. Ja nie wymyślam koła na nowo wink.gif

Ja tez nie, uzywam rozne fw ale to mi nie przeszkadza w napisaniu czegos mojego w wolnym czasie skoro jestes taki dobry tylko w uzywaniu np symfony2 to po co sie odzywasz widze ze ostatnio na tym forum cos sie ludzia w glowkach popitolilo zejdzie na ziemie ludzie.
!*!
Cytat(marcio @ 4.08.2015, 10:06:32 ) *
... widze ze ostatnio na tym forum cos sie ludzia w glowkach popitolilo zejdzie na ziemie ludzie ...


Niektórzy tak lubią, z lenistwem i stagnacją nie wygrasz. A co do dobrej klasy logowania, to praktycznie każdy FW ma takową w dokumentacji.
Damonsson
Cytat(audiodesign10 @ 3.08.2015, 22:00:29 ) *
Witam,
więc prosiłbym abyś pokazał dobry przykład jak to się dokładnie robi, aby początkujący programiści nie musieli na przyszłość błądzić.

Pozdrawiam wink.gif

Po co mam wymyślać koło na nowo, jak już wspomniał kolega wyżej, jest 100000000000 klas logowania OOP w sieci.
marcio
Cytat(Damonsson @ 4.08.2015, 13:05:15 ) *
Po co mam wymyślać koło na nowo, jak już wspomniał kolega wyżej, jest 100000000000 klas logowania OOP w sieci.

I wszystkie sa takie zajebiste...to moze byc podal biblioteke kogos ktora wedlug ciebie jest jakims guru wsrod innych.Po co sie w ogole udzielasz ostatnio tak patrze na posty @Damonsson i innych user-ow i oni naprawde maja sie za jakis majsterow to przynajmniej jak jestescie tacy dobrzy to podajcie link komus "gorszemu" jak juz musicie pisac glupie odpowiedzi jak nie to nawet nie zawracajcie sobie i innym dupy.

@!*! no niestety taka prawda widac ze w pracy nie robia niczego ciekawego ;]
viking
Najlepiej podpatrzeć jak to robią duzi:
https://github.com/FriendsOfSymfony/FOSUserBundle
https://github.com/ZF-Commons/ZfcUser
Damonsson
Cytat(marcio @ 4.08.2015, 14:14:54 ) *
I wszystkie sa takie zajebiste...to moze byc podal biblioteke kogos ktora wedlug ciebie jest jakims guru wsrod innych.Po co sie w ogole udzielasz ostatnio tak patrze na posty @Damonsson i innych user-ow i oni naprawde maja sie za jakis majsterow to przynajmniej jak jestescie tacy dobrzy to podajcie link komus "gorszemu" jak juz musicie pisac glupie odpowiedzi jak nie to nawet nie zawracajcie sobie i innym dupy.

@!*! no niestety taka prawda widac ze w pracy nie robia niczego ciekawego ;]

Kolega @viking podał Ci 2 podejrzewam najczęściej wykorzystywane. Jeżeli nie umiesz chociaż jednej wymienić z pamięci to Twój problem, że żyjesz w czasach jakie reprezentuje Twoja klasa. A wygooglowanie tego zajmuje max 30 sekund. Ja nie jestem od nauki jak używać Google. Ja chętnie pomagam innym osobom, szczególnie początkującym. Nie pisałem co jest źle w tej klasie z tematu bo mi się zwyczajnie nie chcę, ale podałem słowa klucze do google, dzięki którym autor tematu w mig pojmie jakie zrobił błędy i jak powinna wyglądać taka klasa. A @CuteOne zrobił fajne review kodu i jak widzisz jest tego sporo i chwała mu za to, że miał chęć to przejrzeć szczegółowo i opisać.

Piszę posta, bo kolega @audiodesign10 odniósł się bezpośrednio do mnie, więc mu odpisałem. Gdyby ktokolwiek wpisał w google php oop login example i przewertował 10 stron google, poświęcił na to max 1h to nie zadawałby głupich pytań. Staram się w każdym moim poście dać pytającym wędkę, żeby sam mógł sobie złowić rybę.

Nie uważam się za żadnego majstra, dla Ciebie mogę nie znać podstaw HTML'a jeżeli ma Ci to poprawić poczucie własnej wartości, niech tak będzie. Jeżeli musisz się dowartościowywać przez forum i zastanawiać się, czy dany użytkownik ma ciekawą pracy, czy jednak nic ciekawego nie robi, to na jakim poziomie chcesz dyskutować? Załóż sobie temat w offtopicu i tam rozkminiaj czy ktoś robi w pracy coś ciekawego czy może jednak nie.
pyro
Niewymyślanie koła na nowo to teraz oznaka lenistwa i bycia nudnym...

W jakich czasach przyszło nam żyć... biggrin.gif
marcio
Cytat(Damonsson @ 4.08.2015, 17:38:58 ) *
Kolega @viking podał Ci 2 podejrzewam najczęściej wykorzystywane. Jeżeli nie umiesz chociaż jednej wymienić z pamięci to Twój problem, że żyjesz w czasach jakie reprezentuje Twoja klasa. A wygooglowanie tego zajmuje max 30 sekund. Ja nie jestem od nauki jak używać Google. Ja chętnie pomagam innym osobom, szczególnie początkującym. Nie pisałem co jest źle w tej klasie z tematu bo mi się zwyczajnie nie chcę, ale podałem słowa klucze do google, dzięki którym autor tematu w mig pojmie jakie zrobił błędy i jak powinna wyglądać taka klasa. A @CuteOne zrobił fajne review kodu i jak widzisz jest tego sporo i chwała mu za to, że miał chęć to przejrzeć szczegółowo i opisać.

Piszę posta, bo kolega @audiodesign10 odniósł się bezpośrednio do mnie, więc mu odpisałem. Gdyby ktokolwiek wpisał w google php oop login example i przewertował 10 stron google, poświęcił na to max 1h to nie zadawałby głupich pytań. Staram się w każdym moim poście dać pytającym wędkę, żeby sam mógł sobie złowić rybę.

Nie uważam się za żadnego majstra, dla Ciebie mogę nie znać podstaw HTML'a jeżeli ma Ci to poprawić poczucie własnej wartości, niech tak będzie. Jeżeli musisz się dowartościowywać przez forum i zastanawiać się, czy dany użytkownik ma ciekawą pracy, czy jednak nic ciekawego nie robi, to na jakim poziomie chcesz dyskutować? Załóż sobie temat w offtopicu i tam rozkminiaj czy ktoś robi w pracy coś ciekawego czy może jednak nie.

Mnie nie musisz podawac sam sobie znajde ale jak masz sie udzielac w tematach z glupimi odp to nie udzielaj sie wcale kropka potem reszta twoich wypocin mnie nie interesuje.

Cytat
Niewymyślanie koła na nowo to teraz oznaka lenistwa i bycia nudnym...

W jakich czasach przyszło nam żyć... biggrin.gif

No tak stalo sie nudne te forum przez takich jak wy wink.gif
Pyton_000
Zawsze możesz iść na inne gdzie będziesz się lepiej czuł. Głupotą jest nieumiejętność przyjmowania krytyki. Oburzyłeś się wielce że ktoś Ci powiedział że kod który zaprezentowałeś jest miernej jakości, a Ty zamiast albo podyskutować dlaczego, co gdzie i jak to zaczynasz burczeć na cały świat że jest zły, że ludzie są beznadziejni.

Troszkę więcej samokrytycyzmu.
marcio
Cytat(pyro @ 4.08.2015, 18:40:05 ) *
Niewymyślanie koła na nowo to teraz oznaka lenistwa i bycia nudnym...

W jakich czasach przyszło nam żyć... biggrin.gif



Cytat(Pyton_000 @ 5.08.2015, 12:12:43 ) *
Zawsze możesz iść na inne gdzie będziesz się lepiej czuł. Głupotą jest nieumiejętność przyjmowania krytyki. Oburzyłeś się wielce że ktoś Ci powiedział że kod który zaprezentowałeś jest miernej jakości, a Ty zamiast albo podyskutować dlaczego, co gdzie i jak to zaczynasz burczeć na cały świat że jest zły, że ludzie są beznadziejni.

Troszkę więcej samokrytycyzmu.

Stary mam dobra samokrytyke i wiem ze kod nie jest wspanialy i wspomnialem o tym gdy podalem link do niego.
Ale skoro osoba ktora mi odpowiada ze jest zly nie ma do zaproponowania nic swojego i mowi mi ze kod ktory jest utrzymywany przez 10 developer-ow przez lata jest dobry to potrafi kazdy jak juz maja krytykowac to niech to robia z "klasa" jak nie to taka krytyka jest o dupe rozczas.

Mi nie chodzi o moj kod bo wiem jakie ma braki i co jest w nim dobre i na pewno zly nie jest chcialbym zobaczyc jak Damonsson to lepiej napisze skoro jest taki madry, na symfony2 kazdy klepac potrafi lepiej lub gorzej, pozdro i troche wiecej pokory wam potrzeba ;]

No i jak widac na tym forum juz prawie nie siedze bo jak powiedzialem zrobilo sie tu nudno i za duzo specow tu jest.
Ale czasami jak widze niektore odp to krew zalewa
MESSIAH :)
Dokładnie też to zauważyłem. Jeszcze Comandeer próbuje pomagać sensownie a nospor i ten damonsson to już kpina z pomagania. Dlatego wolę o 100% stackoverflow.com tam wyjaśnią i pomogą bez pierdzielenia. Najlepszy jest text który tutaj powtarzają na okrągło: Nie wymyślaj koła na nowo smile.gif . A dlaczego mam nie wymyślać? Bo może większość wymyślonych kół jest kwadratem! Jeśli nie należy wymyślać koła na nowo to powinniście jechać do mechanika aby wam zmienił koła w samochodzie na te z epoki BC czyli kamienne. prosty przykład: jeśli wezmę gotowe koło i mi się zepsuje to będę musiał pytać się wynalazcy jak je naprawić a gdy to ja osobiście zrobie sobie koło wtedy będę wiedział gdzie co i jak.
com
MESSIAH smile.gif no bez jaj, pomaganie !== zrobienie za kogoś gotowca. I nospor, czy Damonsson to rozumieją, a Comandeer jest tu nowy to jemu się jeszcze chcę myśleć za was. Korzystamy z tego samego googla co wy, to jak to jest że my potrafimy coś zaleźć i nie lecimy z trywialnymi problemami na forum a wy nie. Trzeba się samemu zainteresować, poszukać rozwiązania, pogłowić albo zmienić zawód.
KsaR
Offtopując.

Cytat(MESSIAH :) @ 6.08.2015, 21:15:00 ) *
Dokładnie też to zauważyłem. Jeszcze Comandeer próbuje pomagać sensownie a nospor i ten damonsson to już kpina z pomagania.

Nie że coś, tylko TY NIE CZYTASZ Z UWAGĄ.
Widziałem kilka twoich tematów to się dziwie że ci perm-bana nie dali, bo to już ponad trolowanie chyba;

Piszą ci, a ty jesteś leniwy i wolisz mieć na tacy podane do stołu, nie dając żadnego wkładu bo myślisz że tak będzie najlepiej, a prawda taka że tak się nigdy nie poprawisz w programowaniu tylko stale będziesz na jednym poziomie.

Musisz więcej sprawdzać/weryfikować. Ktoś ci pomaga to to uszanuj i kieruj sie wskazowkami zamiast czekac na lepsza odpowiedz (nie wiadomo po jakim czasie), "na tacy".


2. Co do reszty, nie ogarniam tego waszego koła na nowo,
Ktoś chce cos zrobic to niech robi.
Gdyby kazdy tak samo myslal to juz by nic nowego nie było, bo po co?

Po co laczyc sie z baza kolejny raz? Przeciez to kolo na nowo..
Po co dawac kolejny if? Przeciez to kolo na nowo..
Itp.

Rozumiem ze kilka projektow sie wybilo znacznie, i wspiera je byc moze setki osob.
Ale to nie oznacza zeby ktos nie probowal czegos zrobic po swojemu..
com
Róbcie co się wam podoba tylko jak ktoś przychodzi i prosi o ocenę, a nie spojrzy nawet na rozwiązanie które działa i zostało sprawdzone, przetestowane przez całe community to o czym tu rozmawiać.
Damonsson
Skoro moderatorzy nie reagują na raporty, znaczy, że można ciągnąć offtopic, co niniejszym czynię.

Cytat(Ksar @ 6.08.2015, 23:26:31 ) *
2. Co do reszty, nie ogarniam tego waszego koła na nowo,
Ktoś chce cos zrobic to niech robi.
Gdyby kazdy tak samo myslal to juz by nic nowego nie było, bo po co?

Po co laczyc sie z baza kolejny raz? Przeciez to kolo na nowo..
Po co dawac kolejny if? Przeciez to kolo na nowo..
Itp.

Rozumiem ze kilka projektow sie wybilo znacznie, i wspiera je byc moze setki osob.
Ale to nie oznacza zeby ktos nie probowal czegos zrobic po swojemu..

Chyba nie przeczytałeś z uwagą zagadnienia koła na nowo. Użytkownicy wymuszają na nas, vide:

Cytat(audiodesign10 @ 3.08.2015, 22:00:29 ) *
więc prosiłbym abyś pokazał dobry przykład jak to się dokładnie robi, aby początkujący programiści nie musieli na przyszłość błądzić.

Cytat(marcio @ 5.08.2015, 18:04:04 ) *
chcialbym zobaczyc jak Damonsson to lepiej napisze skoro jest taki madry

, żebyśmy my napisali im klasę logowania, a kiedy my dajemy bezpośrednie linki do już napisanych klas lub zapytania po jakich google wyświetli te klasy, które napisalibyśmy w 95% tak samo, jesteśmy wyzywani od nieudaczników i ludzi leniwych. O to się tutaj rozchodzi tylko i wyłącznie w wymyślaniu koła na nowo, nie ma to nic wspólnego z pisaniem własnych klas logowania przez tego kto chce to robić.
KsaR
Cytat(Damonsson @ 6.08.2015, 23:37:55 ) *
Skoro moderatorzy nie reagują na raporty, znaczy, że można ciągnąć offtopic, co niniejszym czynię.


Chyba nie przeczytałeś z uwagą zagadnienia koła na nowo. Użytkownicy wymuszają na nas, vide:



, żebyśmy my napisali im klasę logowania, a kiedy my dajemy bezpośrednie linki do już napisanych klas lub zapytania po jakich google wyświetli te klasy, które napisalibyśmy w 95% tak samo, jesteśmy wyzywani od nieudaczników i ludzi leniwych. O to się tutaj rozchodzi tylko i wyłącznie w wymyślaniu koła na nowo.

No nie doczytałem bo dopiero do domu wróciłem, tyle że już kiedyś czytałem inne tematy na forum.
Nie jestem wstanie wskazać jaki temat/dział ale napewno jeszcze w tym roku, ktoś kogoś o dosłownie jakiś tyci projekt(może z godzina roboty jak nie mniej) pojechał że to "kolo na nowo". I tak kilka postów dalej to samo. Wraz z coraz liczniejszym gronem ktore potwierdzalo zdanie tej osoby..
com
bo robienie czegoś co już jest i dawanie tego do oceny nie robiąc research nie ma najmniejszego sensu, bo to robi się chyba tylko po to żeby pochwalić się jak mało się jeszcze wie. Uwierz, że nie jest łatwo wymyślić czegoś co już jest i zrobić to lepiej niż jest.

Coś takiego dla siebie to sobie można dłubać ale też warto zweryfikować czy się czasem nie odbiegło za bardzo od zamierzonego celu, no ale prosić nas o ocenę czegoś co my wyrzucimy od razu do kosza?...
marcio
@Damonsson:
Cytat
które napisalibyśmy w 95% tak samo,

No wlasnie o to chodzi chcialbym zobaczyc czy napisalbys to tak samo jak dev-y od symfony2 jakos w to nieche mi sie wierzyc wink.gif no sry
!*!
Cytat(marcio @ 7.08.2015, 17:07:29 ) *
@Damonsson:

No wlasnie o to chodzi chcialbym zobaczyc czy napisalbys to tak samo jak dev-y od symfony2 jakos w to nieche mi sie wierzyc wink.gif no sry


Przecież już Ci wyjaśnił że nie, ponieważ nie wymyślałby koła na nowo, tylko skopiował z S2 wink.gif
MESSIAH :)
Cytat(!*! @ 7.08.2015, 18:25:19 ) *
Przecież już Ci wyjaśnił że nie, ponieważ nie wymyślałby koła na nowo, tylko skopiował z S2 ;)

HAHAHAHAHAHA Śmiechłem smile.gif
Faktycznie nie dostanę tutaj gotowca bo myślałem że są tutaj "fachowcy" a na pytanie z kodowania dostaję odpowiedź z przedziału - psychologia gdzie najpierw muszę rozkodować odpowiedź "fachowca" na język polski i następnie szukać rozwiązań w google. Więc po około 3 miesiącach powinienem napisać klase Login przy pomocy "fachowców" smile.gif

Prosty przykład:
ZADAŁEM PYTANIE TUTAJ NA php.pl
Cytat
Dlaczego nie mogę używać polskich znaków w nazwach parametrów bindowania?

"Fachowcy" obruszyli się i zaczęli mnie ganiać że tak nie wolno że kodowanie źle wyglada itp. A na pytanie dlaczego? Nie wiedzieli.
ZADAŁEM TO SAMO PYTANIE NA stockoverflow.com
http://stackoverflow.com/questions/3141560...value-parameter
I szok bo nikt mi nie odpisał że tak nie wolno i nie dobrze to stosować. Wiecie co mi odpisano: Podano mi link gdzie na tacy jest wyjaśnione tak że nawet ślepy to zobaczy.
http://stackoverflow.com/questions/5809951...or-placeholders
memory
przecież dostałeś odpowiedź o co ci teraz chodzi?
CuteOne
@MESSIAH smile.gif jeżeli tamten temat wyglądał jak ten Temat: Czym zastapic eval to się nie dziwię, że zostałeś olany. Nawiasem mówiąc to widzę, że sporo problemów ci "te fachowcy" rozwiązali a psioczysz na nich.. bo?
Daiquiri
Ludziska skończcie proszę te wycieczki osobiste - jest zdecydowanie za gorąco, żeby się dodatkowo pieklić. To po pierwsze smile.gif.

Autor jasno napisał, że się dopiero uczy. Jego twórczość radosna w postaci klasy logowania to po prostu zapis tego, czego się nauczył. Bez tego nie bylibyśmy w stanie mu pomóc w nauce... bo nie moglibyśmy zobaczyć błędów jakie popełnia.

Pisanie o wynajdywaniu koła na nowo - ma na pewno jakiś sens. To jest naprawdę dobra rada (i jakże często niedoceniana!)... aczkolwiek nie powinna zniechęcać do tworzenia własnych rozwiązań - zwłaszcza, jeżeli jest to forma nauki. Od czegoś trzeba zacząć.

I meritum: uważam, że jeżeli krytykujemy rozwiązania to chociaż podajmy namiastkę opisu jak powinno się to zrobić lepiej, lub co jest nie tak. Postarajcie się o te kilka słów więcej.

@Damonsson,
W swojej pierwszej odpowiedzi, to z całą sympatią do Ciebie, ale "(...) co jest dobrze: nic" w połączeniu z "Może komuś będzie się chciało tłumaczyć" to trochę przesada. Bo tak na dobrą sprawę napisałeś "Wszystko jest źle, ale nie chce mi się tłumaczyć dlaczego" :-). Myślę, że na pierwszy rzut oka mógłbyś wskazać kilka drobnych błędów, niekoniecznie od razu wszystkie.
marcio
Cytat
Przecież już Ci wyjaśnił że nie, ponieważ nie wymyślałby koła na nowo, tylko skopiował z S2

To po jakiego wala sie tu udziela ?
!*!
Cytat(marcio @ 8.08.2015, 13:05:01 ) *
To po jakiego wala sie tu udziela ?


W skrócie... bo może. A to czy ktoś z Nas kwestionuje jego wypowiedzi lub innych jest zupełnie innym wątkiem. Rozumiem Cie i też ubolewam z tego powodu, forum jest jakie jest.
Daiquiri
!*!, Marcio - nie zaśmiecajcie już tematu.
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.