我可能有点厚,但我似乎找不到答案。我正在从带有寄存器的服务器上移动到一个服务器,将其关闭。这是一件好事,但不幸的是,我已经习惯了与Globals一起工作的数年,这导致我编写草率的代码。我现在正在尝试解决这个问题。

我正在尝试重写一些在$ _ post中具有可变变量的旧代码。

我知道这是一个愚蠢的例子,但它说明了我要解决的问题。以下将与注册全球合作:

<?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>

如何与Globals Off Registers一起工作?以下显然不起作用:

<?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>

请放轻松 - 我知道我可能很愚蠢,但我似乎无法将我的头转过。

有帮助吗?

解决方案

简单,只是 $_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, ,减少过多的打字。)

其他提示

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

<?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>

$ _ post是一个数组,不仅仅是。

$_POST[$variable]

你可以摆脱整体 $$ 疯狂,只是做 $_POST[$variable].

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

直接从$ _super Globals使用变量是一个坏主意,也是安全风险,尤其是如果您的任何代码是开源的,则是一个坏主意。一个人可以修改输入以戳戳并找出您通过的任何变量的值。例如,他们可以传递“ $ _ENV”,这将使他们成为您环境变量的转储。实际上,注册全球群体是一个坏主意。

这是 @鲍勃斯的回答中提到的。

而且,关于您的问题,这就是为什么您的示例不适用于PHP的Globals关闭的原因。 PHP与Register Global的Off AFAIK更加严格(有充分的理由),很难执行可变变量技巧。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top