我正在使用会话在PHP中创建多页表单.该$stage变量跟踪用户填写表单的进度(UPDATE),通常在表单的每个阶段设置为$ _POST.
在第二页(第2阶段),表单的提交按钮获取其值如下:
echo '<input type="hidden" name="stage" value="';
echo $stage + 1;
echo '" />;
Run Code Online (Sandbox Code Playgroud)
这工作正常 - $stage + 1如果我在第2页,则评估为3.但由于我不止一次这样做,我决定将此代码拉出到我在代码顶部定义的函数中,之后$stage提到.
在我以前使用上面代码的同一个地方,我调用了该函数.我已经验证函数的代码是相同的,但现在$stage + 1评估为1.
PHP是在定义函数时评估我的变量,而不是在调用它时?如果是这样,我该如何防止这种情况?
为了测试这个理论,我$stage = 2在定义我的函数之前设置,但是当我调用函数时它仍然计算为1.这是怎么回事?
感谢所有建议变量范围成为罪魁祸首的人 - 我现在打了我的额头.$stage是一个全局变量,我没有$GLOBAL_stage像我通常那样称它来防止这种问题.
我添加global $stage;到函数定义,它工作正常.谢谢!
不,PHP会在调用函数时评估您的变量.但是你的函数有一个局部变量范围,即没有看到你的函数,我猜你是在运行一个局部变量.您可以将全局变量导入到您的函数中,但不建议这样做:
function myfunction() {
global $stage;
...
}
Run Code Online (Sandbox Code Playgroud)
如果不知道你的代码,真的很难说,但我会继续猜测你正在使用'register globals'将表单参数注入全局PHP变量(在这种情况下为$ state).您可能需要考虑关闭register_globals,因为它确实存在安全风险并使用所谓的超全局变量.
编辑
好的,所以你在$ _POST数组中看到了你的舞台.仍然疯狂地猜测你的功能,你可以尝试以下方法:
function my_insert_stage_param() {
global $stage;
echo '<input type="hidden" name="stage" value="';
echo $_POST['stage'] + 1;
echo '" />';
}
Run Code Online (Sandbox Code Playgroud)
像$ _POST数组这样的Suberglobals不需要声明global.