为了账号安全,请及时绑定邮箱和手机立即绑定

htmlspecialchars 不会接受“变量”作为参数

htmlspecialchars 不会接受“变量”作为参数

PHP
繁华开满天机 2023-11-03 15:59:44
我读完了一本书:Luke Welling 和 Laura Thomson 所著的《PHP 和 MySQL ® Web 开发第 4 版》。在第 49 页,作者提出了额外深奥的(至少对我来说)处理形式的方法。也就是说,如果 html 表单中的名称具有相同的值,并且仅通过数字加一来区分,我们可以在 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>这是我的 .php 文件:<!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      }         这是我的问题所在:  for ($i=1; $i <= 3; $i++){    $temp = "name$i";    echo htmlspecialchars($$temp).'<br />';   }脚本不会做出反应,也不接受其他类型的简单变量参数。即使是编辑器(np++)也不接受第二个“$”符号。
查看完整描述

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 />'; 

  }


查看完整回答
反对 回复 2023-11-03
?
千万里不及你

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>';

如果您想使用花哨的循环和与之相关的东西,我可以进一步讨论很多内容,但通常不希望将所有事情过度复杂化。您最终会产生更多错误,使每个人都更难以解释您的代码,并使调试代码的过程更加耗时。


查看完整回答
反对 回复 2023-11-03
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信