Здравствуйте, форумчане! Вообщем пишу я восстановление пароля. Не пинайте меня сильно, но я правда не понимаю, почему вместе не работают два SELECT-a? То есть если убрать первый php-кусок, то второй прекрасно работает. А когда вместе нет. Ниже привожу пример: PHP: <?php $host = '127.0.0.1'; $db = 'user'; $user = 'root'; $pass = ''; $charset = 'utf8'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $opt = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try { $db = new PDO($dsn, $user, $pass, $opt); echo "Подключение есть<br/>"; } catch (PDOException $e) { print "Ошибка соединения!: " . $e->getMessage() . "<br/>"; die(); } ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>Документ без названия</title> </head> <body> <?php $id = 1; if ($id = 1) { $sth = $db->prepare('SELECT * FROM users WHERE id=:id'); $sth->bindParam(':id', $id, PDO::PARAM_INT); $sth->execute(); $user = $sth->fetch(); print_r($user); echo '<br/>'; //Функция генерации пароля function generatePassword($length){ $chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789'; $numChars = strlen($chars); $string = ''; for ($i = 0; $i < $length; $i++) { $string .= substr($chars, rand(1, $numChars) - 1, 1); } return $string; } //echo "Пароль из 8 символов: " . . "\n"; $pass = generatePassword(8); $result = $db->prepare('UPDATE users SET pass = :pass WHERE id = :id'); $result->bindParam(':pass', $pass, PDO::PARAM_STR); $result->bindParam(':id', $id, PDO::PARAM_INT); return $result->execute(); } else { echo 'Sorry, Bro'; } ?> <?php //Здесь я пытаюсь просмотреть получившийся результат: $i=1; $sthn = $db->prepare('SELECT * FROM users WHERE id=:i'); $sthn->bindParam(':i', $i, PDO::PARAM_INT); $sthn->execute(); $us = $sthn->fetch(); echo '<br/>'; print_r($us); echo '<br/>'; ?> </body> </html>
Сократила код, так более понятно. Вообщем после UPDATE-a не отображается SELECT PHP: <?php $host = '127.0.0.1'; $db = 'user'; $user = 'root'; $pass = ''; $charset = 'utf8'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $opt = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try { $db = new PDO($dsn, $user, $pass, $opt); echo "Подключение есть<br/>"; } catch (PDOException $e) { print "Ошибка соединения!: " . $e->getMessage() . "<br/>"; die(); } ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>Документ без названия</title> </head> <body> <?php $id = 1; //Функция генерации пароля function generatePassword($length){ $chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789'; $numChars = strlen($chars); $string = ''; for ($i = 0; $i < $length; $i++) { $string .= substr($chars, rand(1, $numChars) - 1, 1); } return $string; } //echo "Пароль из 8 символов: " . . "\n"; $pass = generatePassword(8); $result = $db->prepare('UPDATE users SET pass = :pass WHERE id = :id'); $result->bindParam(':pass', $pass, PDO::PARAM_STR); $result->bindParam(':id', $id, PDO::PARAM_INT); return $result->execute(); $sth = $db->prepare('SELECT * FROM users WHERE id=:id'); $sth->bindParam(':id', $id, PDO::PARAM_INT); $sth->execute(); $user = $sth->fetch(); print_r($user); echo '<br/>'; ?> </body> </html> --- Добавлено --- Может нельзя два запроса на одной странице применять? --- Добавлено --- или у PDO какие-то свои фитчи?
Зачем у Вас return в 59 строчке? PHP: return $result->execute(); Попробуйте так PHP: $result->execute();
password_hash password_verify Юзайте https://php.ru/forum/threads/obnovlenie-tokena.64346/#post-524757
@MouseZver Спасибо, я учту. Вообщем, пока я сделала так(код оставлю вдруг кому-то из новичков понадобится). Хотя я поняла, что этот вариант не очень хорош и что лучше реализовать смену пароля после прохождения по ссылки на эмайл. Я пока правда не разобралась как это делать. Создать ещё одну таблицу? Хранить в ней временно сгенерированную ссылку? Вообщем голова взрывается от мыслей... Если есть какие-то советы с радостью прочту =) А вот мой недокод: HTML: <div> <div> <p><b>Восстановление пароля</b></p> </div> <div> <form name="form1" method="post" action="vosst_pass.php"> <p><i>Логин </i><input type="text" name="email" size="30" /></p> <p> <input type="submit" value="Восстановление" size="30"> </p> </form> </div> </div> PHP: <?php $host = '127.0.0.1'; $db = 'passrecover'; $user = 'user438_kate'; $pass = '***********'; $charset = 'utf8'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $opt = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try { $db = new PDO($dsn, $user, $pass, $opt); //echo "Подключение есть<br/>"; } catch (PDOException $e) { print "Ошибка соединения!: " . $e->getMessage() . "<br/>"; die(); } ?> <?php $email = $_POST['email']; //Функция генерации пароля function generatePassword($length){ $chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789'; $numChars = strlen($chars); $string = ''; for ($i = 0; $i < $length; $i++) { $string .= substr($chars, rand(1, $numChars) - 1, 1); } return $string; } //echo "Пароль из 8 символов: " . . "\n"; $pass = generatePassword(8); $result = $db->prepare('UPDATE users SET pass = :pass WHERE email = :email'); $result->bindParam(':pass', $pass, PDO::PARAM_STR); $result->bindParam(':email', $email, PDO::PARAM_STR); $result->execute(); $sth = $db->prepare('SELECT * FROM users WHERE email=:email'); $sth->bindParam(':email', $email, PDO::PARAM_INT); $sth->execute(); $user = $sth->fetch(); //print_r($user); $password=$user['pass']; $email=$user['email']; $username=$user['name']; $subject="Запрос на восстановление пароля"; $message="Здравствуйте, ".$username.". Ваш новый пароль: ".$password; mail($email, $subject, $message); echo "На ваш почтовый ящик было отправлено письмо с новый паролем"; ?> Проверялось, работает.
Небезопасный метод сброса пароля. Ведь любой, кому известен адрес почты пользователя может сменить пароль. Именно для предотвращения этого и нужно на почту кидать ссылку с подтверждением (посредством секретного ключа, хранимого в дополнительной таблице)
@[pandora] Когда-то интересовался этим вопросом, лучше при отправке письма на почту генерировать уникальную строку, по которой юзер перейдет и поменяет пароль. А эта строка будет храниться в отдельной таблице. Когда он перешёл и поменял пароль то удаляем сразу ту строку, можно сделать ограничения по времёни смени пароля, если время истекло и юзер перешёл по ссылке просто удаляем эту строку из базы и говорим время истекло.