微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决htmlspecialchars将不接受“变量变量”作为参数

我正在看一本书:Luke Welling和Laura Thomson撰写的“ PHPMysqL®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>

这是我的.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
      }
      
      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()函数。因为参数$$tempundefined,变量$temp只是一个名为name的字符串,它与1,2,3之类的整数值连接。但是实际值在全局$_POST[$temp]变量中。要获取$_POST[$temp]中的值,您需要使用正确的post参数名称,并且在您的示例中将其命名为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 />'; 
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。