链接php的电子邮件验证

时间:2016-01-04 16:40:31

标签: php mysql validation

我正在尝试建立电子邮件验证。发送包含指向该用户的链接的电子邮件正在运行。现在我想在用户点击他收到的链接时设置active = 1。我检查了变量$ email和$ key,他们从网址获取了正确的信息。当active设置为1时,我想将一个ahref回显给login.php。我认为我的SQL查询有些问题可以帮助人吗?

<?php

if (isset($_GET['email'])) {
 $email = $_GET['email'];
}
if (isset($_GET['hash'])){
 $key = $_GET['hash'];
}

 $query = $mysqli->query("UPDATE `users` SET active=1 WHERE `email` = '". $email ."' AND `mailcheck` ='". $key ."' ");

 $result  = $query->fetch_row();

if($result == 1){

     echo "Your account is now active. You may now <a href="login.php">Log in</a>";

}
 else {
 echo "Your account could not be activated. Please recheck the link or contact the system administrator. test";
}


} 
?>

2 个答案:

答案 0 :(得分:4)

坚持到这里。 fetch_row() http://php.net/manual/en/mysqli-result.fetch-row.php用于SELECT而非UPDATE。

您希望使用的是mysqli_affected_rows()

在UPDATE上检查更新是否成功。

如果你想在这里做一个SELECT(这更有意义),那么你需要使用mysqli_num_rows(),如果两者都存在,那就进行更新。

您还应该检查查询错误:

如果存在行/用户

咨询我的https://stackoverflow.com/a/22253579/1415724的答案,检查用户是否存在,您可以在哪里找到它。

另外,一个建议。使用!empty()代替isset()。通常最好检查价值观。

更好的方法是检查是否为空,而不是2个条件语句。

如果其中一个为空,则代码将继续执行,反过来,您的查询将失败。

如果你想保留现有方法,那么你应该在每次GET后exit;,但我不推荐它。

更像是:

if ( !empty($_GET['email']) && !empty($_GET['hash']) ) {
  $email = $_GET['email'];
  $key = $_GET['hash'];
}

else{ exit; }

您目前的代码向SQL injection开放。使用mysqli_* with prepared statementsPDOprepared statements

答案 1 :(得分:2)

问题是由于以下行,

$result  = $query->fetch_row();

您正在尝试执行UPDATE操作,但实际上您正在使用->fetch_row()语句获取结果行,顺便说一句,因为UPDATE操作不存在返回任何结果集。

使用->affected_rows属性从UPDATE操作中获取受影响的行数,如下所示:

$mysqli->query("UPDATE `users` SET active=1 WHERE `email` = '". $email ."' AND `mailcheck` ='". $key ."'");

if($mysqli->affected_rows ==  1){
    echo "Your account is now active. You may now <a href=\"login.php\">Log in</a>";
}else{
    echo "Your account could not be activated. Please recheck the link or contact the system administrator.";
}

以下是参考资料:

<强>编辑:

验证页面上的代码应如下所示:

if(isset($_GET['email']) && isset($_GET['hash'])){
    $email = htmlentities($_GET['email']);
    $key = htmlentities($_GET['hash']);

    $mysqli->query("UPDATE `users` SET active=1 WHERE `email` = '". $email ."' AND `mailcheck` ='". $key ."'");

    if($mysqli->affected_rows){
        echo "Your account is now active. You may now <a href=\"login.php\">Log in</a>";
    }else{
        echo "Your account could not be activated. Please recheck the link or contact the system administrator.";
    }
}else{
    echo "wrong parameters.";
}

<强>重新编辑:

经过OP的大量调试后,问题现在得到解决,这是最终的工作代码,

if (isset($_GET['email']) && isset($_GET['hash'])) { 
    $email = $_GET['email']; 
    $key = $_GET['hash']; 

    $mysqli->query("UPDATE `users` SET active=1 WHERE `email` = '". $email ."' AND `mailcheck` ='". $key ."' "); 


    if($mysqli->affected_rows) { 

        echo "Your account is now active"; 

    }else { 
        echo "Failed"; 
    } 
}