我创建了一个简单的在线用户注册系统。用户输入他们的信息并将其发布到数据库,并向用户发送电子邮件以验证其帐户。该电子邮件包含指向authenticated.php页面的链接。
http://example.com/verified.php?id=22&h=6b530ee42cb25fdf7823ef393a58b68e
“ id”是数据库中的新记录号。 “ h”是已写入数据库中某个字段的随机散列。
verify.php中的代码如下:
require("cDB.php");
$pass = 0;
//Read the Users table and retrieve the verification field for the given user
$db = new db();
$results = $db->query("SELECT Verification from Users WHERE UIdx=?",$_GET['id'])->fetchArray();
echo "pass1: " . $pass;
if($results['Verification'] == $_GET['h']) {
echo "pass2: " . $pass;
$db->query("UPDATE Users SET Verification='', Activated=1 WHERE UIdx=?",$_GET['id']);
echo "pass3: " . $pass;
$pass = 1;
}
echo "pass4: " . $pass;
if ($pass == 1) {
echo "Success";
} else {
echo "Failed";
}
?>
(我在代码中放置了一堆“ echo”语句以进行故障排除。)
访问时,页面的输出为: pass1:0 pass4:0 失败
乍一看,人们可能会认为“ if”块内的代码未得到执行,但是数据库正在得到更新。当我查看数据库中的记录时,“验证”字段确实为空,“已激活”字段已从0更改为1。
因此,更新查询正在执行,但是“ if”块中的其余代码未执行。
有想法吗?
已解决! 我不确定这是解决方案还是解决方案...我从查询中删除了Verification =''。本质上,现在每次都将与“验证”字段和哈希进行比较。当用户首次登录时,我将清除“验证”字段。
我想了解为什么多次调用此代码。在故障排除过程中的一个实例中,我注意到id和h与原始调用不同。
感谢您的所有建议。
答案 0 :(得分:0)
尝试一下,我们可以进行更多调试。首先要知道var_dump发生了什么,是您的朋友。一旦您变得更高级,我强烈建议您使用XDebug。此外,请确保在检查变量值之前先检查它们的设置。在某些情况下可能无法设置。
清理输入内容也是个好主意。
<?php
require("cDB.php");
$debug = true;
$my_id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_STRING);
$my_h = filter_input(INPUT_GET, 'h', FILTER_SANITIZE_STRING);
try {
//Read the Users table and retrieve the verification field for the given user
$db = new db();
$results = $db->query("SELECT Verification from Users WHERE UIdx=?", $my_id)->fetchArray();
if ($debug) {
var_dump($results);
}
if (isset($results['Verification']) && $results['Verification'] == $my_h) {
$updateStatus = $db->query("UPDATE Users SET Verification='', Activated=1 WHERE UIdx=?", $my_id);
if ($debug) {
var_dump("My Update Status : " . $updateStatus);
}
}
} catch (Exception $e) {
var_dump($e);
}
答案 1 :(得分:-1)
该请求似乎已被处理两次。我不确定是什么原因造成的。可能有很多事情。不过,最重要的是,您使用的是http GET
请求方法。此方法用于请求(“获取”)信息,并且不应更改服务器的状态。 GET
方法本质上是对客户端(阅读器:浏览器)的承诺,可以多次调用路由。 (Read more at Wikipedia或W3)
因为在您的情况下,对同一路由的多次请求两次都不会产生相同的结果(也称为“非幂等”),您最好不要向浏览器保证它们可以多次请求
实际上,最简单的方法是在两者之间插入一个表格。如果您不想在确认屏幕上打扰用户,可以考虑自动提交。