调试PHP验证脚本


Debugging PHP validation script

我正在构建一个微型站点,密码重置行为出现问题。

有一个表单会两次询问用户的密码。我不是密码纳粹,唯一的要求是密码必须大于5个字符。提交时,表单数据被添加到$_POST数组中,并被发送到我的站点范围php函数脚本中的setPass函数。

功能是

function setPass(){
    $link= connectDB();
    $query= "select * from People where Username='" . $_SESSION['name'] . "' Limit 1";
    $result= $link->query($query);
    if ($result->num_rows==0){
        $_SESSION['status']= 'invaliduser';
        header("location: ../index.php");
    } else {
        $first = $_POST['firstPass'];
        $second = $_POST['secondPass'];
        if (($first == $second) && (strlen($first) > 5)){
            $password = sha1($first);
        }
    }
}

在这个例子中,我省略了数据库插入代码。

我的问题是页面正文中包含的脚本echo $_SESSION['name'] . " and password: " . $first;打印出用户名,但返回unidentified variable: first警告。当我尝试访问变量$password时,也会发生这种情况。

早期的测试表明,第一个条件为true,因为页面没有重定向。

那么,是什么导致了else块中的执行失败呢?

由于在setPass函数内部设置了$first$password,因此它们在函数体之外不可用。

您应该使用global关键字,或者,如果您希望在外部使用函数的值,可以更好地从函数中返回这些值。

这个概念被称为变量的作用域。这些变量在函数中具有局部作用域。请参阅此处,以获得有关PHP中作用域的全面描述。

你说你在脚本正文中回显?您在函数中定义了变量,所以除非您将其设置为全局(通常不是一个好主意,请参阅函数中的PHP全局),否则$first实际上并不存在。

在我看来,这就像是作用域的问题。您可能想要尝试使用会话变量,或者更优选地使用全局变量。

查看此以了解更多信息:http://php.net/manual/en/language.variables.scope.php

[编辑]

或者更好的是,像Borealid建议的那样,从函数中首先返回$。