【发布时间】:2015-05-10 19:25:07
【问题描述】:
我在 PHP 中创建了密码重置功能。
它工作得很好............除了,由于某种原因,我无法设置收件人的电子邮件地址:“TO”
代码是这样工作的:
(a) 要求用户提供他的登录名/用户名 (b) php 向数据库发送一个 sql 查询; (c) 如果找到用户名,php 获取电子邮件地址,并通过电子邮件发送重置链接 (d) 此重置链接附有一个独特的“令牌” (e) 用户点击其电子邮件中的链接,并被重定向到他重置密码的新页面
一切正常............除了电子邮件结构本身。电子邮件包括: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();
}
}
}
【问题讨论】:
-
危险:你很容易受到SQL injection attacks的影响,你需要defend你自己。
-
在打开 PHP 标记后立即将错误报告添加到文件顶部,例如
<?php error_reporting(E_ALL); ini_set('display_errors', 1);,然后是其余代码,以查看它是否产生任何结果,以及 @987654325 @到mysqli_query()。 -
你只是完全覆盖了你的问题。这应该作为一个新问题提出。请回滚到您的原始帖子,否则我会因此而被否决。
-
如何回滚?顺便说一句,我找到了错误的原因:每当生成新令牌时,令牌和用户名(登录名)都会输入到数据库表“令牌”中。好吧,在我更改代码后,登录不再被发送到数据库表。只是令牌。
-
没关系,我把你的问题回滚到原帖了。这不是在 Stack 上做事的方式。你的新问题应该是一个新问题,而我的回答解决了原来的问题。另外,请在我的回答中查看我的评论,了解可能出了什么问题。