$ _POST和关联数组中的变量变量

时间:2010-08-27 14:40:10

标签: php arrays associative-array superglobals register-globals

我可能有点厚,但我似乎找不到这个问题的答案。我正从一个带有寄存器全局变量的服务器移动到一个关闭它的服务器。这是一件好事,但不幸的是,我已经习惯了几年和几年使用寄存器全局变量ON,导致我编写了草率的代码。我现在正试图解决这个问题。

我正在尝试重写一些在$ _POST中包含变量变量的旧代码。

我知道这是一个愚蠢的例子,但它说明了我试图解决的问题。以下内容适用于寄存器全局变量ON:

<?php $variable = "fullname";?>
<form action="/test/" method="post">
<label for="fullname">Full Name:</label> <input name="fullname" type="text" value="<?php echo $$variable;?>" size="20" maxlength="150" />
<input name="submit" type="submit" value="Go!" />
</form>

如何关闭寄存器全局变量?以下显然不起作用:

<?php $variable = "fullname";?>
<form action="/test/" method="post">
<label for="fullname">Full Name:</label> <input name="fullname" type="text" value="<?php echo $_POST[$$variable];?>" size="20" maxlength="150" />
<input name="submit" type="submit" value="Go!" />
</form>

请放轻松我 - 我知道我可能是愚蠢的,但我似乎无法理解这一点。

6 个答案:

答案 0 :(得分:7)

简单,只是$_POST[$variable]。 (或$_GET$_REQUEST,视情况而定。)

但是请注意,当您将文本输出到HTML时,您必须对其进行编码,否则您将容易受到跨站点脚本攻击:

<input type="text"
    name="<?php echo htmlspecialchars($variable);?>"
    value="<?php echo htmlspecialchars($_POST[$variable]);?>" 
    size="20" maxlength="150"
/>

(我通常会定义一个名为h的函数echo htmlspecialchars,以减少这种过多的输入量。)

答案 1 :(得分:2)

我有一些类似于你的表单交互,但我可以理解为什么你在表单中使用$ _POST。你应该拥有的是:

<?php $variable = $_POST["fullname"];?>
<form action="/test/" method="post">
<label for="fullname">Full Name:</label> <input name="fullname" type="text" value="<?php echo $variable; ?>" size="20" maxlength="150" /> 
<input name="submit" type="submit" value="Go!" />
</form>

答案 2 :(得分:1)

$ _ POST是一个数组,不会只是。

$_POST[$variable]

答案 3 :(得分:1)

您确定您的意思是$_POST[$$variable],而不是$_POST[$variable]

答案 4 :(得分:1)

你可以摆脱整个$$疯狂,只需做$_POST[$variable]

答案 5 :(得分:0)

直接从$ _SUPER全局变量中使用变量变量是一个不好的想法和安全风险,特别是如果您的任何代码是开源的。可以修改输入以查找并找出您通过的任何变量的值。例如,他们可以传递'$ _ENV',这将使他们转储您的环境变量。实际上,注册全局变量无论如何都是个坏主意。

@ bobince的答案中提到了这一点。

并且,关于你的问题,这就是为什么你的例子不能用PHP的注册全局变量关闭。 PHP更严格(有充分的理由),注册全局关闭,afaik,变量变量技巧更难。