2 回答
TA贡献1815条经验 获得超6个赞
该示例中的问题是htmlspecialchars()功能。因为参数$$temp和变量只是一个与整数值(例如 1,2,3)连接的undefined命名字符串。但真正的值在全局变量中。要获取其中的值,您需要使用正确的后参数名称,在您的示例中,它被命名为,和。$tempname$_POST[$temp]$_POST[$temp]name1name2name3
// There are many other ways but Let me do this way.
// Incoming Post Values that are named name1,name2 and name3
$tireqty = $_POST['name1'];
$oilqty = $_POST['name2'];
$sparkqty = $_POST['name3'];
for ($i=1; $i <= 3; $i++) {
$temp = "name$i";
$temp = !isset($_POST[$temp]) ? "" : $_POST[$temp];
echo htmlspecialchars($temp).'<br />';
}
// if you want to stick with variable variable technique.
$name1 = $_POST['name1'];
$name2 = $_POST['name2'];
$name3 = $_POST['name3'];
for ($i=1; $i <= 3; $i++) {
$temp = "name$i";
echo htmlspecialchars($$temp).'<br />';
}
TA贡献1784条经验 获得超9个赞
这实际上与功能无关htmlspecialchars()。当你在循环中写下这个时:
$temp = "name$i"
您正在创建一个值为 的字符串name1。当您尝试将它与“变量”一起使用时,如下所示:
$$temp
该代码正在查找名为 的变量$name1,但该变量不存在。
要修复原始代码,您真正需要做的就是从数组中生成您想要使用的键名称$_POST:
for ($i = 1; $i <= 3; $i++) {
echo htmlspecialchars($_POST["name$i"]) . '<br />';
}
然而,无论如何,这都是一个不太优雅的解决方案。
更好的解决方案
$_POST您可以从更改输入名称开始,以便它们全部作为自己的数字索引数组进入数组。
<tr>
<td>Tyres</td>
<td><input type="text" name="name[]" size="3" maxlength="3" /></td>
</tr>
<tr>
<td>Oil</td>
<td><input type="text" name="name[]" size="3" maxlength="3" /></td>
</tr>
<tr>
<td>Spark Plugs</td>
<td><input type="text" name="name[]" size="3" maxlength="3" /></td>
</tr>
然后,您可以轻松循环$_POST['name']并回显这些值:
foreach ($_POST['name'] as $val) {
echo htmlspecialchars($val) . '<br>';
}
这些都是理想的解决方案吗?不,不是真的。您知道您需要一个用于轮胎、机油和火花塞的表单字段,因此尝试调用调用所有输入的模式一name开始就没有意义。当表单字段都属于一个实体,或者您不知道提交表单时会有多少行时,您通常会执行此操作。
什么是$_POST['name2']或$_POST['name'][1]?谁知道。您必须通读代码并找到表单来仔细检查属于哪个字段。
代码应该是语义化的,并且任何阅读它的人都可以轻松理解(包括你自己,当你将来回顾自己的代码时)。
我会正确重命名表单输入:
<tr>
<td>Tyres</td>
<td><input type="text" name="tyres" size="3" maxlength="3" /></td>
</tr>
<tr>
<td>Oil</td>
<td><input type="text" name="oil" size="3" maxlength="3" /></td>
</tr>
<tr>
<td>Spark Plugs</td>
<td><input type="text" name="spark_plugs" size="3" maxlength="3" /></td>
</tr>
然后一切都变得更加简单和容易理解。在您的代码中,您有三个可用值。您知道它们是什么,以及名称的含义。
echo htmlspecialchars($_POST['tyres']) . '<br>';
echo htmlspecialchars($_POST['oil']) . '<br>';
echo htmlspecialchars($_POST['spark_plugs']) . '<br>';
如果您想使用花哨的循环和与之相关的东西,我可以进一步讨论很多内容,但通常不希望将所有事情过度复杂化。您最终会产生更多错误,使每个人都更难以解释您的代码,并使调试代码的过程更加耗时。
- 2 回答
- 0 关注
- 123 浏览
添加回答
举报