如何解决htmlspecialchars将不接受“变量变量”作为参数
我正在看一本书:Luke Welling和Laura Thomson撰写的“ PHP和MysqL®Web开发第四版”。在第49页上。作者建议使用其他深奥的方式(至少对我而言)处理表单。也就是说,如果html形式的名称具有相同的值,只是它们之间的区别仅在于数字加1,我们可以在echo语句中使用“变量变量”类型的变量从表单中动态提取值...:
这是我的html:
<form action="processorder.PHP" method="post">
<table style="border: 0px;">
<tr style="background: #cccccc;">
<td style="width: 150px; text-align: center;">Item</td>
<td style="width: 15px; text-align: center;">Quantity</td>
</tr>
<tr>
<td>Tires</td>
<td><input type="text" name="name1" size="3" maxlength="3" /></td>
</tr>
<tr>
<td>Oil</td>
<td><input type="text" name="name2" size="3" maxlength="3" /></td>
</tr>
<tr>
<td>Spark Plugs</td>
<td><input type="text" name="name3" size="3" maxlength="3" /></td>
</tr>
<tr>
<td colspan="2" style="text-align: center;"><input type="submit" value="Submit Order" /></td>
</tr>
</table>
<tr>
<td>How did you find Bob's?</td>
<td>
<select name="find">
<option value = "a">I'm a regular customer</option>
<option value = "b">TV adversting</option>
<option value = "c">Phone directory</option>
<option value = "d">Word of mouth</option>
</select>
</td>
</tr>
</form>
<!DOCTYPE html>
<html>
<head>
<title>Bob's Auto Parts - Order Results</title>
</head>
<body>
<h1>Bob's Auto Parts</h1>
<h2>Order Results</h2>
<?PHP
//create short variable names
$tireqty = $_POST['name1'];
$oilqty = $_POST['name2'];
$sparkqty = $_POST['name3'];
for ($i=1; $i <= 3; $i++){
$temp = "name$i";
echo htmlspecialchars($$temp).'<br />'; // or whatever processing we want to do
}
echo "<p>Order processed at ";
echo date('H:i,jS F Y');// (string as an argument)
echo "</p>";
// or:
// echo "<p>Order processed at " . date('H:i,jS F Y') . "</p>";
// (avoiding multiple echo commands)
echo "<p>Your order is as follows: </p>";
echo htmlspecialchars($tireqty)." tires<br />";
echo htmlspecialchars($oilqty)." bottles of oil<br />";
echo htmlspecialchars($sparkqty)." spark plugs<br />";
$totalqty = 0;
$totalqty = $tireqty + $oilqty + $sparkqty;
echo "<p>Items ordered " . $totalqty . "<br />";
$totalamount = 0.00;
define('TIREPRICE',100);
define('OILPRICE',10);
define('SPARKPRICE',4);
$totalamount = $tireqty * TIREPRICE + $oilqty * OILPRICE + $sparkqty * SPARKPRICE;
echo "Subtotal: $:" . number_format($totalamount,2) . "<br />";
$taxrate = 0.10;
$totalamount = $totalamount * (1 + $taxrate);
echo "Total including taxes is: $" . number_format($totalamount,2) . "</p>";
// echo 'isset($tireqty): '.isset($tireqty).'<br />';
// echo 'isset($nothere): '.isset($nothere).'<br />';
// echo 'empty($tireqty): '.empty($tireqty).'<br />';
// echo 'empty($nothere): '.empty($nothere).'<br />';
?>
</body>
</html>
这是我的问题所在:
for ($i=1; $i <= 3; $i++){
$temp = "name$i";
echo htmlspecialchars($$temp).'<br />';
}
脚本不响应也不接受参数为其他简单变量。甚至编辑器(np ++)也不接受第二个“ $”符号。
解决方法
这实际上与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>';
如果您随后想使用精美的循环以及类似的东西,我可以做很多进一步的工作,但是通常不宜使所有内容过于复杂。您最终会产生更多的错误,使每个人都难以理解您的代码,并使调试代码的过程更加耗时。
,该示例中的问题是htmlspecialchars()
函数。因为参数$$temp
是undefined
,变量$temp
只是一个名为name
的字符串,它与1,2,3之类的整数值连接。但是实际值在全局$_POST[$temp]
变量中。要获取$_POST[$temp]
中的值,您需要使用正确的post参数名称,并且在您的示例中将其命名为name1
,name2
和name3
。
// 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 />';
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。