我正在尝试建立电子邮件验证。发送包含指向该用户的链接的电子邮件正在运行。现在我想在用户点击他收到的链接时设置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";
}
}
?>
答案 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 statements或PDO与prepared 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";
}
}