密码重置 Link:"TO" 电子邮件地址无效
Password Reset Link : "TO" email address not working
我在 PHP 中创建了密码重置功能。
一切正常......除了出于某种原因,我无法设置收件人的电子邮件地址:“TO “
代码是这样工作的:
(a) 要求用户提供他的 login/username
(b) php 向数据库发送 sql 查询;
(c) 如果找到用户名,php 获取电子邮件地址,并通过电子邮件发送重置 Link
(d) 这个 reset-link 有一个独特的 "token" 附加到它
(e) 用户点击他的电子邮件中的 link,然后被重定向到一个新页面,在那里他重设了他的密码
一切正常......除了电子邮件结构本身。电子邮件包括:TO、CC、SUBJECT、BODY 和 HEADERS.
正在显示所有内容.........除了实际的“TO”。
事实上,我知道代码有效的唯一原因是因为我通过“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<support@xxxxx.com>' . "\r\n";
$headers .= 'Bcc: Info<info@xxxxx.com>' . "\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();
}
}
}
您不能在 if 或 while 或任何范围内定义函数。在您打算使用它们之前或之后定义它们。尝试使用以下代码:
<?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 <support@xxxxx.com>' . "\r\n";
$headers .= 'Bcc: Info <info@xxxxx.com>' . "\r\n";
if (mail($to, $subject, $message, $headers)) {
echo "A password reset link has been sent to your email address.";
}
}
?>
此外,请注意 Quentin 关于防止 SQL 注入的建议。
我所做的是:
- 在
if
块 之后移动了 getRandomString
和 mailresetlink
- 向
mailresetlink
函数添加了参数 $rows
,因此它可以找到对 $rows
变量(超出范围)的使用
您还需要定义 $email
,因为它没有在任何地方设置,所以我为您做了(我猜您在某处也有一个名称为 email
的输入字段。
测试一下,应该可以。
您的代码无法正常工作的原因有以下几点。
其中之一是 $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
完成上述所有操作后,在我的测试期间成功将所有信息发送到电子邮件。
旁注:您当前的代码对 SQL injection. Use mysqli
with prepared statements, or PDO with prepared statements 开放,它们更安全。
我在 PHP 中创建了密码重置功能。
一切正常......除了出于某种原因,我无法设置收件人的电子邮件地址:“TO “
代码是这样工作的:
(a) 要求用户提供他的 login/username (b) php 向数据库发送 sql 查询; (c) 如果找到用户名,php 获取电子邮件地址,并通过电子邮件发送重置 Link (d) 这个 reset-link 有一个独特的 "token" 附加到它 (e) 用户点击他的电子邮件中的 link,然后被重定向到一个新页面,在那里他重设了他的密码
一切正常......除了电子邮件结构本身。电子邮件包括:TO、CC、SUBJECT、BODY 和 HEADERS.
正在显示所有内容.........除了实际的“TO”。
事实上,我知道代码有效的唯一原因是因为我通过“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<support@xxxxx.com>' . "\r\n";
$headers .= 'Bcc: Info<info@xxxxx.com>' . "\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();
}
}
}
您不能在 if 或 while 或任何范围内定义函数。在您打算使用它们之前或之后定义它们。尝试使用以下代码:
<?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 <support@xxxxx.com>' . "\r\n";
$headers .= 'Bcc: Info <info@xxxxx.com>' . "\r\n";
if (mail($to, $subject, $message, $headers)) {
echo "A password reset link has been sent to your email address.";
}
}
?>
此外,请注意 Quentin 关于防止 SQL 注入的建议。
我所做的是:
- 在
if
块 之后移动了 - 向
mailresetlink
函数添加了参数$rows
,因此它可以找到对$rows
变量(超出范围)的使用
getRandomString
和 mailresetlink
您还需要定义 $email
,因为它没有在任何地方设置,所以我为您做了(我猜您在某处也有一个名称为 email
的输入字段。
测试一下,应该可以。
您的代码无法正常工作的原因有以下几点。
其中之一是 $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
完成上述所有操作后,在我的测试期间成功将所有信息发送到电子邮件。
旁注:您当前的代码对 SQL injection. Use mysqli
with prepared statements, or PDO with prepared statements 开放,它们更安全。