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

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>';
如果您想使用花哨的循環和與之相關的東西,我可以進一步討論很多內容,但通常不希望將所有事情過度復雜化。您最終會產生更多錯誤,使每個人都更難以解釋您的代碼,并使調試代碼的過程更加耗時。
- 2 回答
- 0 關注
- 180 瀏覽
添加回答
舉報