我正在构建一个微型站点,密码重置行为出现问题。
有一个表单会两次询问用户的密码。我不是密码纳粹,唯一的要求是密码必须大于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建议的那样,从函数中首先返回$。