將長表單拆分為多個步驟(向導式),每步提交部分數據,最終彙總入庫。本文演示最基礎的隱藏域透傳方案。
步驟 1 (1.php) → 基本信息 → POST → 步驟 2 (2.php) 步驟 2 (2.php) → 產品信息 + 隱藏域(基本信息) → POST → 步驟 3 (3.php) 步驟 3 (3.php) → 其他信息 + 隱藏域(基本+產品) → POST → 步驟 4 (4.php) 步驟 4 (4.php) → 接收所有隱藏域 + 當前步驟數據 → 入庫
<form name="form1" id="form1" method="post" action="2.php">
基本信息1:<input type="text" name="base1" /><br>
基本信息2:<input type="text" name="base2" /><br>
<input type="submit" value="下一步">
</form>
<form name="form2" id="form2" method="post" action="3.php">
產品名稱:<input type="text" name="prcname" /><br>
產品價格:<input type="text" name="price" /><br>
產品型號:<input type="text" name="prcXH" /><br>
<input type="hidden" name="base1" value="<?php echo htmlspecialchars($_POST['base1'] ?? ''); ?>" />
<input type="hidden" name="base2" value="<?php echo htmlspecialchars($_POST['base2'] ?? ''); ?>" />
<input type="submit" value="下一步">
</form>
<form name="form3" id="form3" method="post" action="4.php">
其他信息1:<input type="text" name="other1" /><br>
其他信息2:<input type="text" name="other2" /><br>
<input type="hidden" name="base1" value="<?php echo htmlspecialchars($_POST['base1'] ?? ''); ?>" />
<input type="hidden" name="base2" value="<?php echo htmlspecialchars($_POST['base2'] ?? ''); ?>" />
<input type="hidden" name="prcname" value="<?php echo htmlspecialchars($_POST['prcname'] ?? ''); ?>" />
<input type="hidden" name="price" value="<?php echo htmlspecialchars($_POST['price'] ?? ''); ?>" />
<input type="hidden" name="prcXH" value="<?php echo htmlspecialchars($_POST['prcXH'] ?? ''); ?>" />
<input type="submit" value="確定">
</form>
<?php
$base1 = $_POST['base1'] ?? '';
$base2 = $_POST['base2'] ?? '';
$prcname = $_POST['prcname'] ?? '';
$price = $_POST['price'] ?? '';
$prcXH = $_POST['prcXH'] ?? '';
$other1 = $_POST['other1'] ?? '';
$other2 = $_POST['other2'] ?? '';
// 建議使用 PDO 預處理防注入
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$pdo->beginTransaction();
try {
$pdo->prepare("INSERT INTO base_table (base1, base2) VALUES (?, ?)")->execute([$base1, $base2]);
$pdo->prepare("INSERT INTO prc_table (prcname, price, prcXH) VALUES (?, ?, ?)")->execute([$prcname, $price, $prcXH]);
$pdo->prepare("INSERT INTO other_table (other1, other2) VALUES (?, ?)")->execute([$other1, $other2]);
$pdo->commit();
echo "寫入完成";
} catch (Exception $e) {
$pdo->rollBack();
echo "寫入失敗:" . $e->getMessage();
}
?>
htmlspecialchars();最終入庫前再做業務層驗證。<input type="hidden" name="csrf_token" value="...">,服務端驗證。| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 隱藏域透傳 | 無狀態、簡單、無需 Session | URL/Body 膨脹、不支持回退修改、敏感數據暴露 | 步驟少(≤3)、字段少、無敏感信息 |
| Session 存儲 | 支持任意回退、數據不暴露前端、體積無限制 | 依賴 Session、集群需共享存儲、佔用伺服器記憶體 | 步驟多、含敏感字段、需良好用戶體驗 |
| 臨時表 + UUID Token | 持久化、可跨設備恢復、支持分析流失率 | 需維護臨時表、定時清理過期數據 | 複雜長流程、需斷點續填、數據分析需求 |