Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] True/false
Forum PHP.pl > Forum > PHP
topcio
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
Pyton_000
podstawy...

if(forgetten($data) === true) {}
topcio
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
Pyton_000
=== 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. }
Tomplus
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.
topcio
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.  
com
A to Ci dobre, mamy typy i operator porównania po typach mieli by usunąć, internet laugh.gif
topcio
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.
viking
Sprawdź sobie wiadomość bo nie dostaniesz jej jako utf-8. Dlaczego nie bindujesz parametrów w mysqli?
topcio
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.
Pyton_000
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".
topcio
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?
com
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
topcio
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.
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.