调试PHP验证脚本

时间:2012-02-24 19:12:53

标签: php validation

我正在构建一个微型网站,但我遇到了密码重置行为的问题。

有一个表单会要求用户输入两次密码。我不是密码纳粹,唯一的要求是密码大于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时也会发生这种情况。

早期测试显示第一个条件为真,因为页面未重定向。

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

3 个答案:

答案 0 :(得分:4)

由于您在$first函数中设置了$passwordsetPass,因此它们在身体外部不可用。

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

这个概念被称为变量的范围。这些变量在函数中具有 local 范围。有关PHP中作用域的全面描述,请参阅here

答案 1 :(得分:2)

你说你在剧本的主体中回应?你在函数中定义了变量,所以除非你把它设置为全局(通常不是一个好主意,请参阅PHP global in functions),$ first确实不存在。

答案 2 :(得分:1)

它看起来像是范围问题。您可能希望尝试使用任一会话或更优选地使用全局变量。

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

[编辑]

或者甚至更好,从Borealid建议的函数返回$ first。