Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] True/false
topcio
post 26.04.2017, 16:55:41
Post #1





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


Cześć
Mam pytanko, w jaki najprostszy sposób sprawdzić czy funkcja wykonała się cała popranie

User.class.php
  1. public function forgetten($data) {
  2. $errors = [];
  3. if($data['user_login'] == '') {
  4. $errors[] = 'Musisz podać login.';
  5. }
  6. if($data['user_email'] == '') {
  7. $errors[] = 'Musisz podać adres e-mail.';
  8. }
  9. if(!empty($data['user_email'])) {
  10. if(filter_var($data['user_email'], FILTER_VALIDATE_EMAIL) === false) {
  11. $errors[] = 'Podany adres email jest nieprawidłowy.';
  12. }
  13. }
  14. if(count($errors) == 0) {
  15. $this->sql->query("SET NAMES utf8");
  16. $result = $this->sql->query("SELECT user_id FROM users WHERE user_login = '{$data['user_login']}' AND user_email = '{$data['user_email']}' LIMIT 1");
  17.  
  18. if($result->num_rows > 0) {
  19. $value = mysqli_fetch_object($result);
  20. $user_id = $value->user_id;
  21. $data = $this->get_data($user_id);
  22.  
  23. // TEST //
  24.  
  25. foreach($data as $key => $value) {
  26. echo "<p>".$key." = ".$value."</p>";
  27. }
  28.  
  29. // TEST //
  30.  
  31. function generateRandomPasswd($length = 12) {
  32. $user_pass_random_characters = '[]{}/?!@#$%&()0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  33. $charactersLength = strlen($user_pass_random_characters);
  34. $user_pass_random = '';
  35. for ($i = 0; $i < $length; $i++) {
  36. $user_pass_random .= $user_pass_random_characters[rand(0, $charactersLength - 1)];
  37. }
  38. return $user_pass_random;
  39. }
  40.  
  41. if(isset($_SESSION['user_pass_random'])) {unset($_SESSION['user_pass_random']);}
  42. $_SESSION['user_pass_random'] = generateRandomPasswd();
  43. // echo $_SESSION['user_pass_random'] . "<br />";
  44. if(isset($_SESSION['user_pass_random_hash'])) {unset($_SESSION['user_pass_random_hash']);}
  45. $_SESSION['user_pass_random_hash'] = $this->code_passwd($_SESSION['user_pass_random']);
  46. // echo $_SESSION['user_pass_random_hash'] . "<br />";
  47. } else {
  48. echo "Niezgodność loginu, e-mail lub odpowiedzi na pytanie pomocnicze.";
  49. }
  50. $query = "
  51. UPDATE users
  52. SET
  53. user_pass_tmp = '".$this->code_passwd($_SESSION['user_pass_random'])."',
  54. user_pass = ''
  55. WHERE user_id = '{$user_id}'
  56. ";
  57. if($this->sql->query($query)) {
  58. return true;
  59. } else {
  60. return ['Wystąpił błąd z bazą danych.'];
  61. }
  62. } else {
  63. return $errors;
  64. }
  65.  
  66. }
  67.  


index.php
  1. case 'forgetten':
  2. echo "<p>Wygeneruj nowe hasło</p>";
  3. echo "<form action=\"index.php?action=forgetten_submit\" method=\"post\">";
  4. echo "<input type=\"text\" placeholder=\"Login\" name=\"user_login\">";
  5. echo "<input type=\"email\" placeholder=\"email\" name=\"user_email\">";
  6. echo "<input type=\"submit\" value=\"Generuj\">";
  7. echo "</form>";
  8.  
  9.  
  10.  
  11. break;
  12.  
  13.  
  14.  
  15. case 'forgetten_submit':
  16. if(!empty($_POST)) {
  17. foreach ($_POST as $key => $value) {
  18. $value = $sql->clear($value);
  19. echo $key . " : " . $value."</p>";
  20. }
  21. echo "<br />";
  22. $users->forgetten($_POST);
  23. }
  24. break;


Mam coś takiego i chciałbym aby jeśli funkcja jest TRUE zrobiła coś (np wysłała maila), a jeśli Jest FALSE wypisała info

Dzięki wielkie za pomoc

Ten post edytował topcio 26.04.2017, 16:59:19
Go to the top of the page
+Quote Post
Pyton_000
post 26.04.2017, 16:59:14
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


podstawy...

if(forgetten($data) === true) {}
Go to the top of the page
+Quote Post
topcio
post 26.04.2017, 17:04:31
Post #3





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


No ale właśnie nie działa, i tu powstaje pytanie dlaczego
mam PHP7 i wyczytałem gdzieś, że === nie jest obsługiwane.
chyba że literówka gdzieś. Hmmm

  1. if($users->forgetten($data) === true) {
  2. echo "OK";
  3. } else { echo "NIE OK"; }


Jeśli dam == zawsze mam OK
Jeśli dam === zawsze mam NIE OK
Go to the top of the page
+Quote Post
Pyton_000
post 26.04.2017, 17:04:53
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


=== nie obsługiwane... dobre... To było, jest i będzie....

Jak nie działa to włącz raportowanie błędów. Temat: Najczestsze bledy

Updated:

  1. $result = $users->forgetten($data);
  2. if($result === true) { echo 'OK'; }
  3. else {
  4. var_dump($result);
  5. }


Ten post edytował Pyton_000 26.04.2017, 17:06:38
Go to the top of the page
+Quote Post
Tomplus
post 26.04.2017, 17:07:50
Post #5





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

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


Kto ci to na opowiadał?
Gdyby nie było obsługiwane w PHP 7, to miałbyś komunikat w manualu PHP że należy nie używać tego porównania.

Zobacz sobie tą stronę:
http://php.net/manual/en/types.comparisons.php

Typy porównań wraz z tym jak działają poszczególne porównania.

Podsumowując:

$users->forgetten($data) nie jest ma typu bool tylko int albo string.

Ten post edytował Tomplus 26.04.2017, 17:09:40
Go to the top of the page
+Quote Post
topcio
post 26.04.2017, 21:00:11
Post #6





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


Dziękuję za naprowadzenie błąd naprawiłem.
Zamiast $data wstawiłem $_POST i wszystko działa jak powinno.

A odnośnie ===, pisałem tylko że gdzieś wyczytałem, nie pamiętam nawet gdzie (w jakimś serwisie).
Dobrze, że jest i działa.

Podsumowując
Końcowy efekt

Jeśli ktoś ma jakieś sugestie w kwestii bezpieczeństwa lub ogólne
Każda krytyka mile widziana

Users.class.php
  1. public function forgetten($data) {
  2. $errors = [];
  3. if($data['user_login'] == '') {
  4. $errors[] = 'Musisz podać login.';
  5. }
  6. if($data['user_email'] == '') {
  7. $errors[] = 'Musisz podać adres e-mail.';
  8. }
  9. if(!empty($data['user_email'])) {
  10. if(filter_var($data['user_email'], FILTER_VALIDATE_EMAIL) === false) {
  11. $errors[] = 'Podany adres email jest nieprawidłowy.';
  12. return $errors;
  13. }
  14. }
  15. if(!empty($data['user_email']) && !empty($data['user_login'])) {
  16. $result = $this->sql->query("SELECT user_id FROM users WHERE user_login = '{$data['user_login']}' LIMIT 1");
  17. if($result->num_rows == 0) {
  18. $errors[] = "Nie istnieje login";
  19. return $errors;
  20. }
  21. $result = $this->sql->query("SELECT user_id FROM users WHERE user_email = '{$data['user_email']}' LIMIT 1");
  22. if($result->num_rows == 0) {
  23. $errors[] = "Nie istnieje email";
  24. return $errors;
  25. }
  26. $result = $this->sql->query("SELECT user_id FROM users WHERE user_email = '{$data['user_email']}' AND user_login = '{$data['user_login']}' LIMIT 1");
  27. if($result->num_rows == 0) {
  28. $errors[] = "Niezgodność login i email";
  29. return $errors;
  30. }
  31. }
  32. if(count($errors) == 0) {
  33. if($result->num_rows > 0) {
  34. $value = mysqli_fetch_object($result);
  35. $user_id = $value->user_id;
  36. $data = $this->get_data($user_id);
  37.  
  38. // TEST //
  39.  
  40. foreach($data as $key => $value) {
  41. echo "<p>".$key." = ".$value."</p>";
  42. }
  43.  
  44. // TEST //
  45.  
  46. function generateRandomPasswd($length = 12) {
  47. $user_pass_random_characters = '[]{}/?!@#$%&()0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  48. $charactersLength = strlen($user_pass_random_characters);
  49. $user_pass_random = '';
  50. for ($i = 0; $i < $length; $i++) {
  51. $user_pass_random .= $user_pass_random_characters[rand(0, $charactersLength - 1)];
  52. }
  53. return $user_pass_random;
  54. }
  55.  
  56. if(isset($_SESSION['user_pass_random'])) {unset($_SESSION['user_pass_random']);}
  57. $_SESSION['user_pass_random'] = generateRandomPasswd();
  58. if(isset($_SESSION['user_pass_random_hash'])) {unset($_SESSION['user_pass_random_hash']);}
  59. $_SESSION['user_pass_random_hash'] = $this->code_passwd($_SESSION['user_pass_random']);
  60.  
  61. $query = "
  62. UPDATE users
  63. SET
  64. user_pass_tmp = '".$this->code_passwd($_SESSION['user_pass_random'])."'
  65. WHERE user_id = '{$user_id}'
  66. ";
  67. $result = $this->sql->query($query);
  68. if($result === false) {
  69. $errors[] = "Wystąpił błąd z bazą danych.";
  70. return $errors;
  71. }
  72. }
  73. } else {
  74. return $errors;
  75. }
  76. }


index.php

  1. case 'forgetten':
  2. echo "<p>Wygeneruj nowe hasło</p>";
  3. echo "<form action=\"index.php?action=forgetten_submit\" method=\"post\">";
  4. echo "<input type=\"text\" placeholder=\"Login\" name=\"user_login\">";
  5. echo "<input type=\"email\" placeholder=\"email\" name=\"user_email\">";
  6. echo "<input type=\"submit\" value=\"Generuj\">";
  7. echo "</form>";
  8. break;
  9.  
  10. case 'forgetten_submit':
  11. if(!empty($_POST)) {
  12. foreach ($_POST as $key => $value) {
  13. $value = $sql->clear($value);
  14. echo $key . " : " . $value."</p>";
  15. }
  16. echo "<br />";
  17. // $users->forgetten($_POST);
  18.  
  19. $result = $users->forgetten($_POST);
  20.  
  21. if($result === true) {
  22. $email_headers = "Reply-to: ".PHP_EOL;
  23. $email_headers .= "From: ".PHP_EOL;
  24. $email_headers .= "MIME-Version: 1.0".PHP_EOL;
  25. $email_headers .= "Content-type: text/html; charset=UTF-8".PHP_EOL;
  26. $email_message = '
  27. Dostajesz tego maila ponieważ Ty albo osoba podająca się za Ciebie<br />
  28. zarządała wygenerowania nowego hasła do serwisu [url="[/url] /><br />
  29. Jeśli to Ty zarządałeś zmiany hasła kliknij proszę w link poniżej<br />
  30. ' . $link . '
  31. W przeciwnym wypadku zgłoś proszę ten fakt do administartora<br />
  32. ';
  33.  
  34. if(mail($_POST['user_email'], 'Temat', $email_message, $email_headers))
  35. {
  36. echo 'Wiadomość została wysłana';
  37. }
  38.  
  39. } else {
  40. echo implode($result);
  41. }
  42. }
  43. break;
  44.  


Ten post edytował topcio 26.04.2017, 21:02:19
Go to the top of the page
+Quote Post
com
post 27.04.2017, 00:00:12
Post #7





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


A to Ci dobre, mamy typy i operator porównania po typach mieli by usunąć, internet laugh.gif
Go to the top of the page
+Quote Post
topcio
post 27.04.2017, 08:26:06
Post #8





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


Wybacz ale nie rozumiem.
Nie prosiłem o wyśmiewająca komentarze
com - jeśli nie masz nic ciekawego do powiedzenia to lepiej się nie odzywaj, bo wystawiasz świadectwo sobie.
Ja się dopiero uczę i jak każdy popełniam błędy, których chciałbym uniknąć w przyszłości.


Ten post edytował topcio 27.04.2017, 08:33:07
Go to the top of the page
+Quote Post
viking
post 27.04.2017, 08:44:09
Post #9





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

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


Sprawdź sobie wiadomość bo nie dostaniesz jej jako utf-8. Dlaczego nie bindujesz parametrów w mysqli?


--------------------
Go to the top of the page
+Quote Post
topcio
post 27.04.2017, 09:01:56
Post #10





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


Cytat(viking @ 27.04.2017, 09:44:09 ) *
Sprawdź sobie wiadomość bo nie dostaniesz jej jako utf-8. Dlaczego nie bindujesz parametrów w mysqli?


Jak zamiast UTF-8 wpisałem ISO-8859-2 to dostaje maila z krzaczkami, dlatego zmieniłem na UTF-8
cały dokument mam w UTF-8
  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


Jak pisałem jestem świeży w temacie, coś umiem ale nie wiele, bindowania nigdy nie próbowałem stosować, ale postaram się spreparować kod do tej postaci.
Uczę się sam, troszkę z tutorali, ale więcej z tego forum i na własnych błędach.
Go to the top of the page
+Quote Post
Pyton_000
post 27.04.2017, 09:03:27
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Po co tutaj:
  1. if(!empty($data['user_email']) && !empty($data['user_login'])) {
  2. $result = $this->sql->query("SELECT user_id FROM users WHERE user_login = '{$data['user_login']}' LIMIT 1");
  3. if($result->num_rows == 0) {
  4. $errors[] = "Nie istnieje login";
  5. return $errors;
  6. }
  7. $result = $this->sql->query("SELECT user_id FROM users WHERE user_email = '{$data['user_email']}' LIMIT 1");
  8. if($result->num_rows == 0) {
  9. $errors[] = "Nie istnieje email";
  10. return $errors;
  11. }
  12. $result = $this->sql->query("SELECT user_id FROM users WHERE user_email = '{$data['user_email']}' AND user_login = '{$data['user_login']}' LIMIT 1");
  13. if($result->num_rows == 0) {
  14. $errors[] = "Niezgodność login i email";
  15. return $errors;
  16. }
  17. }


aż 3 warunki? Zostaw tylko ostatni i napisz jakiś bardziej generyczny komunikat typu "Podane dane są nieprawidłowe".
Go to the top of the page
+Quote Post
topcio
post 27.04.2017, 09:43:47
Post #12





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


Cytat(Pyton_000 @ 27.04.2017, 10:03:27 ) *
Po co tutaj:
  1. if(!empty($data['user_email']) && !empty($data['user_login'])) {
  2. $result = $this->sql->query("SELECT user_id FROM users WHERE user_login = '{$data['user_login']}' LIMIT 1");
  3. if($result->num_rows == 0) {
  4. $errors[] = "Nie istnieje login";
  5. return $errors;
  6. }
  7. $result = $this->sql->query("SELECT user_id FROM users WHERE user_email = '{$data['user_email']}' LIMIT 1");
  8. if($result->num_rows == 0) {
  9. $errors[] = "Nie istnieje email";
  10. return $errors;
  11. }
  12. $result = $this->sql->query("SELECT user_id FROM users WHERE user_email = '{$data['user_email']}' AND user_login = '{$data['user_login']}' LIMIT 1");
  13. if($result->num_rows == 0) {
  14. $errors[] = "Niezgodność login i email";
  15. return $errors;
  16. }
  17. }


aż 3 warunki? Zostaw tylko ostatni i napisz jakiś bardziej generyczny komunikat typu "Podane dane są nieprawidłowe".


Miałem tak na początku jednak chciałem aby końcowy użytkownik wiedział co jest nie tak.
Ale Twoja sugestia jest dobra, bo analizując po co ktoś ma sprawdzać aż w końcu trafi na login, który istnieje w bazie.
Jest do przeanalizowania ten kawałek kodu. - Muszę to przemyśleć.


Cytat(topcio @ 27.04.2017, 10:01:56 ) *
Jak zamiast UTF-8 wpisałem ISO-8859-2 to dostaje maila z krzaczkami, dlatego zmieniłem na UTF-8
cały dokument mam w UTF-8
  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


Jak pisałem jestem świeży w temacie, coś umiem ale nie wiele, bindowania nigdy nie próbowałem stosować, ale postaram się spreparować kod do tej postaci.
Uczę się sam, troszkę z tutorali, ale więcej z tego forum i na własnych błędach.


Czy bindowanie można robić tylko wykorzystując PDO?
Go to the top of the page
+Quote Post
viking
post 27.04.2017, 09:48:58
Post #13





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

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


http://php.net/manual/en/mysqli-stmt.bind-param.php


--------------------
Go to the top of the page
+Quote Post
com
post 27.04.2017, 11:53:59
Post #14





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


topcio ale ja się zgadzam z Tobą, napisałeś że coś takiego wyczytałeś, wiec to tylko udowadnia, jakie słabe jet źródło do php w internecie poza manuałem smile.gif i to wyśmiałem, że ktoś wgl na taki pomysł wpadł, broń boże Ciebie, Ty bardzo dobrze że pytasz i propsy za użycie mysqli, ale poczytaj o wspomnianym powyżej bindowaniu zmiennych, bo tak narażasz się na sql injection smile.gif

tam w kodzie masz http://php.net/manual/en/mysqli-result.fetch-object.php, jak używasz formy obiektowej to nie powinieneś mieszać z proceduralna biggrin.gif nie używasz tego ale tak na przyszłość wink.gif
Go to the top of the page
+Quote Post
topcio
post 27.04.2017, 12:26:01
Post #15





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


Szczerze, to nawet nie wiedziałem, że dobrze to napisałem, po prostu wziąłem na logikę
com sorki za najechanie i dzięki za sugestie i opinie.
Przyjrzę się temu bindowaniu, już mniej więc troszkę kumam, ale jest to coś dla mnie zupełnie nowego.
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: 29.03.2024 - 09:14