首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 多步驟表單數據傳遞實戰:隱藏域方案完整示例

     編輯:PHP 綜合知識

場景

將長表單拆分為多個步驟(向導式),每步提交部分數據,最終彙總入庫。本文演示最基礎的隱藏域透傳方案。

流程圖解

步驟 1 (1.php) → 基本信息 → POST → 步驟 2 (2.php)
步驟 2 (2.php) → 產品信息 + 隱藏域(基本信息) → POST → 步驟 3 (3.php)
步驟 3 (3.php) → 其他信息 + 隱藏域(基本+產品) → POST → 步驟 4 (4.php)
步驟 4 (4.php) → 接收所有隱藏域 + 當前步驟數據 → 入庫

代碼實現

1.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>

2.php - 產品信息 + 透傳基本信息

<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>

3.php - 其他信息 + 透傳前兩步數據

<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>

4.php - 彙總入庫

<?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();
}
?>

安全與體驗優化建議

  1. XSS 防護:隱藏域輸出時必須 htmlspecialchars();最終入庫前再做業務層驗證。
  2. CSRF 保護:每步表單加入 <input type="hidden" name="csrf_token" value="...">,服務端驗證。
  3. 數據持久化備選:隱藏域方案在步驟多、字段長時會導致 HTML 體積膨脹,可改用 Session 存儲 或 臨時表 + Token 方案。
  4. 瀏覽器回退/刷新:Session 方案天然支持;隱藏域方案需配合 PRG 模式或前端攔截處理。
  5. 驗證前置:每步提交時即時驗證當前步驟數據,失敗不進入下一步,減少無效提交。

進階方案對比

方案優點缺點適用場景
隱藏域透傳無狀態、簡單、無需 SessionURL/Body 膨脹、不支持回退修改、敏感數據暴露步驟少(≤3)、字段少、無敏感信息
Session 存儲支持任意回退、數據不暴露前端、體積無限制依賴 Session、集群需共享存儲、佔用伺服器記憶體步驟多、含敏感字段、需良好用戶體驗
臨時表 + UUID Token持久化、可跨設備恢復、支持分析流失率需維護臨時表、定時清理過期數據複雜長流程、需斷點續填、數據分析需求
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved