За последние 24 часа нас посетили 53478 программистов и 1715 роботов. Сейчас ищут 888 программистов ...

Восстановление пароля.

Тема в разделе "PHP для новичков", создана пользователем [pandora], 7 июл 2017.

  1. [pandora]

    [pandora] Активный пользователь

    С нами с:
    18 сен 2012
    Сообщения:
    71
    Симпатии:
    1
    Здравствуйте, форумчане! Вообщем пишу я восстановление пароля. Не пинайте меня сильно, но я правда не понимаю, почему вместе не работают два SELECT-a? То есть если убрать первый php-кусок, то второй прекрасно работает. А когда вместе нет. Ниже привожу пример:
    PHP:
    1. <?php
    2.  
    3.     $host = '127.0.0.1';
    4.     $db   = 'user';
    5.     $user = 'root';
    6.     $pass = '';
    7.     $charset = 'utf8';
    8.  
    9.     $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    10.     $opt = [
    11.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    12.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    13.         PDO::ATTR_EMULATE_PREPARES   => false,
    14.     ];
    15.  
    16.  
    17.  
    18. try {
    19.     $db = new PDO($dsn, $user, $pass, $opt);
    20.     echo "Подключение есть<br/>";
    21.  
    22. } catch (PDOException $e) {
    23.     print "Ошибка соединения!: " . $e->getMessage() . "<br/>";
    24.     die();
    25. }
    26.  
    27.  
    28. ?>
    29.  
    30. <!doctype html>
    31. <html>
    32. <head>
    33. <meta charset="utf-8">
    34. <title>Документ без названия</title>
    35. </head>
    36.  
    37. <body>
    38.  
    39. <?php
    40. $id = 1;
    41.  
    42.  
    43. if ($id = 1) {
    44.    
    45. $sth = $db->prepare('SELECT * FROM users WHERE id=:id');
    46. $sth->bindParam(':id', $id, PDO::PARAM_INT);
    47. $sth->execute();
    48. $user = $sth->fetch();  
    49.  
    50. print_r($user);
    51.     echo '<br/>';
    52.    
    53. //Функция генерации пароля  
    54. function generatePassword($length){
    55.   $chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
    56.   $numChars = strlen($chars);
    57.   $string = '';
    58.   for ($i = 0; $i < $length; $i++) {
    59.     $string .= substr($chars, rand(1, $numChars) - 1, 1);
    60.   }
    61.   return $string;
    62. }  
    63.    
    64.  
    65. //echo "Пароль из 8 символов: " .  . "\n";
    66. $pass = generatePassword(8);
    67.  
    68. $result = $db->prepare('UPDATE users SET pass = :pass WHERE id = :id');
    69. $result->bindParam(':pass', $pass, PDO::PARAM_STR);
    70. $result->bindParam(':id', $id, PDO::PARAM_INT);
    71. return $result->execute();
    72.  
    73. } else {
    74.     echo 'Sorry, Bro';
    75. }
    76.  
    77. ?>
    78.  
    79. <?php
    80. //Здесь я пытаюсь просмотреть получившийся результат:
    81.  
    82.  
    83. $i=1;  
    84. $sthn = $db->prepare('SELECT * FROM users WHERE id=:i');
    85. $sthn->bindParam(':i', $i, PDO::PARAM_INT);
    86. $sthn->execute();
    87. $us = $sthn->fetch();  
    88. echo '<br/>';
    89. print_r($us);
    90.     echo '<br/>';
    91. ?>
    92.  
    93.  
    94. </body>
    95. </html>
     
  2. [pandora]

    [pandora] Активный пользователь

    С нами с:
    18 сен 2012
    Сообщения:
    71
    Симпатии:
    1
    Сократила код, так более понятно. Вообщем после UPDATE-a не отображается SELECT
    PHP:
    1. <?php
    2.  
    3.     $host = '127.0.0.1';
    4.     $db   = 'user';
    5.     $user = 'root';
    6.     $pass = '';
    7.     $charset = 'utf8';
    8.  
    9.     $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    10.     $opt = [
    11.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    12.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    13.         PDO::ATTR_EMULATE_PREPARES   => false,
    14.     ];
    15.  
    16.  
    17.  
    18. try {
    19.     $db = new PDO($dsn, $user, $pass, $opt);
    20.     echo "Подключение есть<br/>";
    21.  
    22. } catch (PDOException $e) {
    23.     print "Ошибка соединения!: " . $e->getMessage() . "<br/>";
    24.     die();
    25. }
    26.  
    27.  
    28. ?>
    29.  
    30. <!doctype html>
    31. <html>
    32. <head>
    33. <meta charset="utf-8">
    34. <title>Документ без названия</title>
    35. </head>
    36.  
    37. <body>
    38.  
    39. <?php
    40. $id = 1;
    41.    
    42. //Функция генерации пароля  
    43. function generatePassword($length){
    44.   $chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
    45.   $numChars = strlen($chars);
    46.   $string = '';
    47.   for ($i = 0; $i < $length; $i++) {
    48.     $string .= substr($chars, rand(1, $numChars) - 1, 1);
    49.   }
    50.   return $string;
    51. }  
    52.    
    53. //echo "Пароль из 8 символов: " .  . "\n";
    54. $pass = generatePassword(8);
    55.  
    56. $result = $db->prepare('UPDATE users SET pass = :pass WHERE id = :id');
    57. $result->bindParam(':pass', $pass, PDO::PARAM_STR);
    58. $result->bindParam(':id', $id, PDO::PARAM_INT);
    59. return $result->execute();
    60.  
    61.  
    62.    
    63. $sth = $db->prepare('SELECT * FROM users WHERE id=:id');
    64. $sth->bindParam(':id', $id, PDO::PARAM_INT);
    65. $sth->execute();
    66. $user = $sth->fetch();  
    67.  
    68. print_r($user);
    69. echo '<br/>';
    70.  
    71. ?>
    72.  
    73.  
    74.  
    75. </body>
    76. </html>
    --- Добавлено ---
    Может нельзя два запроса на одной странице применять?
    --- Добавлено ---
    или у PDO какие-то свои фитчи?
     
  3. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Зачем у Вас return в 59 строчке?
    PHP:
    1. return $result->execute();
    Попробуйте так
    PHP:
    1. $result->execute();
     
    [pandora] нравится это.
  4. [pandora]

    [pandora] Активный пользователь

    С нами с:
    18 сен 2012
    Сообщения:
    71
    Симпатии:
    1
    @Maputo Ну...эмм, я не заметила( Вообщем эта та самая ошибка над которой я ломала голову :) Спасибо!)
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
  6. [pandora]

    [pandora] Активный пользователь

    С нами с:
    18 сен 2012
    Сообщения:
    71
    Симпатии:
    1
    @MouseZver Спасибо, я учту.

    Вообщем, пока я сделала так(код оставлю вдруг кому-то из новичков понадобится). Хотя я поняла, что этот вариант не очень хорош и что лучше реализовать смену пароля после прохождения по ссылки на эмайл. Я пока правда не разобралась как это делать. Создать ещё одну таблицу? Хранить в ней временно сгенерированную ссылку? Вообщем голова взрывается от мыслей... Если есть какие-то советы с радостью прочту =)

    А вот мой недокод:
    HTML:
    1. <div>
    2.     <div>
    3.       <p><b>Восстановление пароля</b></p>
    4.     </div>
    5. <div>
    6.             <form name="form1" method="post" action="vosst_pass.php">
    7.             <p><i>Логин </i><input type="text" name="email" size="30" /></p>
    8.             <p>
    9.                 <input type="submit" value="Восстановление" size="30">
    10.             </p>
    11.             </form>
    12.     </div>
    13. </div>
    PHP:
    1. <?php
    2.  
    3.     $host = '127.0.0.1';
    4.     $db   = 'passrecover';
    5.     $user = 'user438_kate';
    6.     $pass = '***********';
    7.     $charset = 'utf8';
    8.  
    9.     $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    10.     $opt = [
    11.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    12.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    13.         PDO::ATTR_EMULATE_PREPARES   => false,
    14.     ];
    15.  
    16.  
    17.  
    18. try {
    19.     $db = new PDO($dsn, $user, $pass, $opt);
    20.     //echo "Подключение есть<br/>";
    21.  
    22. } catch (PDOException $e) {
    23.     print "Ошибка соединения!: " . $e->getMessage() . "<br/>";
    24.     die();
    25. }
    26.  
    27.  
    28. ?>
    29.  
    30.  
    31.  
    32. <?php
    33.  
    34. $email = $_POST['email'];
    35.    
    36. //Функция генерации пароля  
    37. function generatePassword($length){
    38.   $chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
    39.   $numChars = strlen($chars);
    40.   $string = '';
    41.   for ($i = 0; $i < $length; $i++) {
    42.     $string .= substr($chars, rand(1, $numChars) - 1, 1);
    43.   }
    44.   return $string;
    45. }  
    46.    
    47. //echo "Пароль из 8 символов: " .  . "\n";
    48. $pass = generatePassword(8);
    49.  
    50. $result = $db->prepare('UPDATE users SET pass = :pass WHERE email = :email');
    51. $result->bindParam(':pass', $pass, PDO::PARAM_STR);
    52. $result->bindParam(':email', $email, PDO::PARAM_STR);
    53. $result->execute();
    54.  
    55.  
    56.  
    57. $sth = $db->prepare('SELECT * FROM users WHERE email=:email');
    58. $sth->bindParam(':email', $email, PDO::PARAM_INT);
    59. $sth->execute();
    60. $user = $sth->fetch();  
    61.  
    62. //print_r($user);
    63.  
    64. $password=$user['pass'];
    65. $email=$user['email'];
    66. $username=$user['name'];
    67.  
    68. $subject="Запрос на восстановление пароля";
    69. $message="Здравствуйте, ".$username.". Ваш новый пароль: ".$password;
    70.  
    71. mail($email, $subject, $message);
    72. echo "На ваш почтовый ящик было отправлено письмо с новый паролем";
    73.  
    74. ?>

    Проверялось, работает.
     
  7. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Небезопасный метод сброса пароля. Ведь любой, кому известен адрес почты пользователя может сменить пароль.
    Именно для предотвращения этого и нужно на почту кидать ссылку с подтверждением (посредством секретного ключа, хранимого в дополнительной таблице)
     
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @[pandora]
    Когда-то интересовался этим вопросом, лучше при отправке письма на почту генерировать уникальную строку, по которой юзер перейдет и поменяет пароль. А эта строка будет храниться в отдельной таблице. Когда он перешёл и поменял пароль то удаляем сразу ту строку, можно сделать ограничения по времёни смени пароля, если время истекло и юзер перешёл по ссылке просто удаляем эту строку из базы и говорим время истекло.
     
    [pandora] и denis01 нравится это.