我正在构建一个微型网站,但我遇到了密码重置行为的问题。
有一个表单会要求用户输入两次密码。我不是密码纳粹,唯一的要求是密码大于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块中的执行失败?
答案 0 :(得分:4)
由于您在$first
函数中设置了$password
和setPass
,因此它们在身体外部不可用。
您应该使用global
关键字,或者如果您希望在外部使用它们,可以更好地返回函数中的值。
这个概念被称为变量的范围。这些变量在函数中具有 local 范围。有关PHP中作用域的全面描述,请参阅here。
答案 1 :(得分:2)
你说你在剧本的主体中回应?你在函数中定义了变量,所以除非你把它设置为全局(通常不是一个好主意,请参阅PHP global in functions),$ first确实不存在。
答案 2 :(得分:1)
它看起来像是范围问题。您可能希望尝试使用任一会话或更优选地使用全局变量。
查看此信息以获取更多信息:http://php.net/manual/en/language.variables.scope.php
[编辑]
或者甚至更好,从Borealid建议的函数返回$ first。