这是mysql_ *代码:
Activation mail and hash check
PDO:
有人看到了解决方案吗?
if (isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['hash']) && !empty($_GET['hash'])){
// Verify data
$search = $db->prepare("SELECT email, hash, active FROM users WHERE email=:email AND hash=:hash AND active=0");
$search->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
$search->bindParam(':hash', $_POST['hash'], PDO::PARAM_STR);
$search->execute();
//$match = $search->fetch(PDO::FETCH_ASSOC);
$match = $search->rowCount();
这部分条件存在问题
if($match > 0){
// We have a match, activate the account
$db->prepare("UPDATE users SET active= 1 WHERE email=:email AND hash=:hash AND active=0");
$db->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
$db->bindParam(':hash', $_POST['hash'], PDO::PARAM_STR);
$db->execute();
echo '<div class="statusmsg">Your account has been activated, you can now login</div>';
}else{
// No match -> invalid url or account has already been activated.
echo '<div class="statusmsg">The url is either invalid or you already have activated your account.</div>';
}
}else{
// Invalid approach
echo '<div class="statusmsg">Invalid approach, please use the link that has been send to your email.</div>';
}
条件在这里完成代码:
网址无效或您已激活帐户。
但它应该在这里完成代码:
您的帐户已被激活,您现在可以登录。
答案 0 :(得分:1)
你检查$ _GET但稍后使用$ _POST。
答案 1 :(得分:0)
流程中的问题与这行代码绑定:
$match = $search->rowCount();
您正在执行SELECT
查询,而rowCount
仅适用于INSERT
,DELETE
或UPDATE
次查询。
相反,要找出是否存在leas匹配,您可以使用fetch()
来获得&#34;首先&#34;行,如果存在,则匹配:
...
$match = $search->fetch();
if ($match) {
...
作为防止这行代码的另一种替代方法,您理论上也可以完全删除第一个SELECT
查询并首先执行第二个UPDATE
查询,然后使用{{1}进行检查无论用户是否更新过。
您的代码还有更多可供评论的内容,例如您验证哈希值的逻辑,因为它们没有时间限制,哈希的生成甚至是未知但通常很关键。
参考:
答案 2 :(得分:0)
您的代码中几乎没有错误,
首先,您在此处使用的$_POST
不存在。
$search->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
$search->bindParam(':hash', $_POST['hash'], PDO::PARAM_STR);
你应该使用$_GET
rowCount返回由相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。
在rowcount之前,在select上不可靠,
下面是您可以用来实现您所寻找的工作代码。
if (isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['hash']) && !empty($_GET['hash'])){
$email = $_GET['email'];
$hash = $_GET['hash'];
$search = $db->prepare("SELECT email, hash, active FROM users WHERE email=:email AND hash=:hash AND active=0");
$search->bindParam(':email', $email, PDO::PARAM_STR);
$search->bindParam(':hash', $hash, PDO::PARAM_STR);
$search->execute();
$match = $search->fetchall(PDO::FETCH_ASSOC);
if(count($match) > 0){
//then match exists activate the profile
$stmt = $db->prepare("UPDATE users SET active= 1 WHERE email= ? AND hash= ? AND active=0")->execute(array($email,$hash));
if(!$stmt){
print_r($db->errorInfo());
}else{
//account activated
echo '<div class="statusmsg">Your account has been activated, you can now login</div>';
}
}else{
// No match -> invalid url or account has already been activated.
echo '<div class="statusmsg">The url is either invalid or you already have activated your account.</div>';
}
}else{
// Invalid approach
echo '<div class="statusmsg">Invalid approach, please use the link that has been send to your email.</div>';
}