一些PHP代码得到执行-一些没有

时间:2019-12-11 19:14:12

标签: php

我创建了一个简单的在线用户注册系统。用户输入他们的信息并将其发布到数据库,并向用户发送电子邮件以验证其帐户。该电子邮件包含指向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与原始调用不同。

感谢您的所有建议。

2 个答案:

答案 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 WikipediaW3

因为在您的情况下,对同一路由的多次请求两次都不会产生相同的结果(也称为“非幂等”),您最好不要向浏览器保证它们可以多次请求

实际上,最简单的方法是在两者之间插入一个表格。如果您不想在确认屏幕上打扰用户,可以考虑自动提交。