亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 180 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號