Я создал функцию сброса пароля в PHP.
Это работает просто отлично ……….. за исключением того, что по какой-то причине я не могу установить адрес электронной почты получателя: «К«
Код работает следующим образом:
(а) пользователя просят предоставить свой логин / имя пользователя
(b) php отправляет SQL-запрос в базу данных;
(c) если имя пользователя найдено, php берет адрес электронной почты и отправляет ссылку сброса по электронной почте
(d) к этой ссылке сброса прикреплен уникальный токен
(e) пользователь нажимает на ссылку в своем электронном письме и перенаправляется на новую страницу, где он сбрасывает свой пароль
Все работает нормально ……….. за исключением самой структуры электронной почты. Письмо содержит: TO, CC, SUBJECT, BODY и HEADERS.
Все показывается ………. кроме актуальныхК».
Фактически, единственная причина, по которой я знаю, что код работает, заключается в том, что я получаю копию письма черезCC«
Вот мой код:
if(isset($_POST['submit'])) {
$login = $_POST['login'];
$query = "select * from personal_data where login='$login'";
$result = mysqli_query($conn,$query);
$count=mysqli_num_rows($result);
$rows=mysqli_fetch_array($result);
if($count==0) {
echo "Sorry; that username does not exist in our database";
}
else {
function getRandomString($length)
{
$validCharacters = "ABCDEFGHIJKLMNPQRSTUXYVWZ123456789!#+=%&/?*$";
$validCharNumber = strlen($validCharacters);
$result = "";
for ($i = 0; $i < $length; $i++) {
$index = mt_rand(0, $validCharNumber - 1);
$result .= $validCharacters[$index];
}
return $result; }
$token=getRandomString(40);
$q="insert into token (token,login) values ('".$token."','".$login."')";
mysqli_query($conn,$q);
function mailresetlink($to,$token){
$to = $rows['email'];
$subject = "Password Reset";
$uri = 'http://'.$_SERVER['HTTP_HOST'] ;
$message = '
<html>
<head>
<title>Password Reset Link</title>
</head>
<body>
<p>We received a Password-Reset request from your account.</p>
<p>Click on the following link to reset your password : <a
href="'.$uri.'/PHP/password_reset?token='.$token.'">Reset Password</a></p>
</body>
</html>
';
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
$headers .= 'From: Support<[email protected]>' . "\r\n";
$headers .= 'Bcc: Info<[email protected]>' . "\r\n";
if(mail($to, $subject, $message, $headers)) {
echo "A password reset link has been sent to your email address."
}
}
if(isset($_POST['login'])) {
mailresetlink($email,$token);
exit();
}
}
}
Причина, по которой ваш код не работает, заключается в нескольких вещах.
Одним из которых является то, что $rows
должен проживать внутри function mailresetlink($to,$token)
параметр функции.
Изменить это на function mailresetlink($to,$token,$rows)
и сделать то же самое для одного внутри if(isset($_POST['login'])){...}
if(isset($_POST['login'])) {
mailresetlink($email,$token,$rows);
exit();
}
Плюс, если это не опечатка или плохая паста; в этой строке также отсутствует точка с запятой:
echo "A password reset link has been sent to your email address."^ right there
Сделав все вышеперечисленное, успешно отправил всю информацию на электронную почту во время моего теста.
Sidenote: Ваш текущий код открыт для SQL-инъекция. использование mysqli
с подготовленными заявлениями, или же PDO с подготовленными заявлениями, они намного безопаснее.
Вы не можете определить функции, если или во время или в любой области. Определите их до или после того, как вы собираетесь их использовать. Попробуйте с помощью следующего кода:
<?php
if ( isset($_POST['submit']) ) {
$login = $_POST['login'];
$email = $_POST['email'];
$query = "select * from personal_data where login='$login'";
$result = mysqli_query($conn, $query);
$count = mysqli_num_rows($result);
$rows = mysqli_fetch_array($result);
if ($count == 0) {
echo "Sorry; that username does not exist in our database";
} else {
if (isset($_POST['login'])) {
mailresetlink($email, $token, $rows);
exit();
}
}
}
function getRandomString($length)
{
$validCharacters = "ABCDEFGHIJKLMNPQRSTUXYVWZ123456789!#+=%&/?*$";
$validCharNumber = strlen($validCharacters);
$result = "";
for ($i = 0; $i < $length; $i++) {
$index = mt_rand(0, $validCharNumber - 1);
$result .= $validCharacters[$index];
}
return $result;
}
$token = getRandomString(40);
$q = "insert into token (token,login) values ('" . $token . "','" . $login . "')";
mysqli_query($conn, $q);
function mailresetlink($to, $token, $rows)
{
$to = $rows['email'];
$subject = "Password Reset";
$uri = 'http://' . $_SERVER['HTTP_HOST'];
$message = '
<html>
<head>
<title>Password Reset Link</title>
</head>
<body>
<p>We received a Password-Reset request from your account.</p>
<p>Click on the following link to reset your password : <a
href="' . $uri . '/PHP/password_reset?token=' . $token . '">Reset Password</a></p>
</body>
</html>
';
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
$headers .= 'From: Support <[email protected]>' . "\r\n";
$headers .= 'Bcc: Info <[email protected]>' . "\r\n";
if (mail($to, $subject, $message, $headers)) {
echo "A password reset link has been sent to your email address.";
}
}
?>
Также обратите внимание на советы Квентина о предотвращении внедрения SQL-кода.
То, что я сделал, было:
getRandomString
а также mailresetlink
после if
блок$rows
в mailresetlink
функция, так что он может найти применение $rows
переменная (которая была вне области видимости)Вы также должны определить $email
потому что он нигде не установлен, поэтому я сделал это для вас (я думаю, у вас также есть поле ввода с именем email
где-то.
Проверьте это, это должно работать.