Php htmlspecialchars赢得';不接受';变量';作为论据

Php htmlspecialchars赢得';不接受';变量';作为论据,php,htmlspecialchars,Php,Htmlspecialchars,我读完了卢克·韦林和劳拉·汤姆森的《PHP和MySQL®Web开发第四版》一书。第49页。作者建议额外的深奥(至少对我来说)的方式来处理形式。也就是说,如果html表单中的名称具有相同的值,而这些值仅通过递增1的数字来区分,那么我们可以在echo station中使用变量的“variable variables”类型来从表单中动态提取值…: 这是我的html: <form action="processorder.php" method="post"

我读完了卢克·韦林和劳拉·汤姆森的《PHP和MySQL®Web开发第四版》一书。第49页。作者建议额外的深奥(至少对我来说)的方式来处理形式。也就是说,如果html表单中的名称具有相同的值,而这些值仅通过递增1的数字来区分,那么我们可以在echo station中使用变量的“variable variables”类型来从表单中动态提取值…:

这是我的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>

Bob的汽车零部件-订单结果
鲍勃的汽车零件
订单结果
我的问题是:

  for ($i=1; $i <= 3; $i++){
    $temp = "name$i";
    echo htmlspecialchars($$temp).'<br />'; 
  }

对于($i=1;$i该示例中的问题是
htmlspecialchars()
函数。因为参数
$$temp
未定义的
$temp
变量只是一个名为
name
的字符串,与整数值(如1,2,3)串联在一起。但实际值是全局
$\u POST[$temp]
变量。要获取
$\u 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 />'; 
  }
//还有很多其他方法,但让我这样做吧。
//名为name1、name2和name3的传入Post值
$tireqty=$_POST['name1'];
$oilqty=$_POST['name2'];
$sparkqty=$_POST['name3'];

对于($i=1;$i这实际上与
htmlspecialchars()
函数无关。当您在循环中写入此函数时:

$temp = "name$i"
您正在创建一个值为
name1
的字符串。然后尝试将其与“变量”一起使用时,如下所示:

$$temp
代码正在查找名为
$name1
的变量,该变量不存在

修复原始代码真正需要做的就是从
$\u POST
数组中生成要使用的密钥名:

for ($i = 1; $i <= 3; $i++) {
    echo htmlspecialchars($_POST["name$i"]) . '<br />';
}
然后,您可以在
$\u POST['name']
中循环并轻松地回显这些值:

foreach ($_POST['name'] as $val) {
    echo htmlspecialchars($val) . '<br>';
}
然后一切都变得更加简单易懂。在你的代码中有三个可用值。你知道它们是什么,它们的名称意味着什么

echo htmlspecialchars($_POST['tyres']) . '<br>';
echo htmlspecialchars($_POST['oil']) . '<br>';
echo htmlspecialchars($_POST['spark_plugs']) . '<br>';
echo htmlspecialchars($_POST['tires'])。
; 回显htmlspecialchars($_POST['oil'])。
; 回显htmlspecialchars($\u POST['spark\u plugs'])。

如果你想使用花哨的循环之类的东西,我还有很多可以深入探讨的地方,但通常情况下,过分复杂化一切都是不可取的。你最终会产生更多的bug,让所有人都更难理解你的代码,使调试代码的过程更耗时。

为什么不使用数组呢而不是增加变量名?这在您的代码中有很多好处。告诉我们如何创建POST变量。您的代码中没有名为
$name1
$name2
等的变量。
$$temp
应该是
$\u POST[$temp]
(不过,正如我所说,数组会更好)一旦您认为变量是解决方案,那么您就错了。如果您将所有三个输入命名为
name=“name[]”
,那么
$\u POST['name']
将是一个包含输入值的数组,您只需对每个($\u POST['name']作为$name){echo htmlspecialchars($name);}
。这使它变得更简单、更干净、更可读。如果书中告诉你要这样写代码,你应该立即停止阅读这本书,把它扔掉。有趣但(至少)“可怕”乍一看…Gd d*如果它很复杂,那么它一定很聪明。至少通过一些评论,我的理解会有所加快…为什么我们要“这样做”?一个好的答案总会有一个解释,说明做了什么以及为什么这样做,不仅是为了OP,而且是为了SO的未来访问者。好的,让我解释一下该示例中的问题是htmlspecialchars()函数。因为参数$$temp未定义,$temp变量只是一个名为“name”的字符串与整数值(如1,2,3)串联。但实际值在全局$\u POST[$temp]变量中。要获取$\u POST[$temp]中的值,您需要使用正确的POST参数名称,在您的示例中,它被命名为name1、name2和name3。请将说明放在您的POST中,以便将来的访问者可以搜索到它。
<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>';