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

PHP 批量新增與批量更新資料實作教學

     編輯:PHP 相關知識

PHP 批量新增與批量更新資料實作教學

處理表單批量提交是後台管理常見需求。本文介紹兩種核心模式:批量新增(多筆 INSERT)與 批量更新(多筆 UPDATE),並說明陣列式表單命名與迴圈處理技巧。

核心概念:陣列式表單命名

在 HTML 表單中,將同類欄位命名為陣列格式(如 name="field[]"),PHP 接收時會自動轉為陣列:

<input name="sp_name[]" type="text">
<input name="sp_name[]" type="text">
<input name="sp_name[]" type="text">

範例一:批量新增商品資料

表單頁面

<form method="post" action="insert_batch.php">
    <table>
        <tr><th>商品名稱</th><th>編號</th><th>單價</th><th>數量</th><th>產地</th></tr>
        <tr>
            <td><input name="sp_name[]" type="text"></td>
            <td><input name="sp_number[]" type="text"></td>
            <td><input name="price[]" type="text"></td>
            <td><input name="counts[]" type="text"></td>
            <td><input name="address[]" type="text"></td>
        </tr>
        <tr>
            <td><input name="sp_name[]" type="text"></td>
            <td><input name="sp_number[]" type="text"></td>
            <td><input name="price[]" type="text"></td>
            <td><input name="counts[]" type="text"></td>
            <td><input name="address[]" type="text"></td>
        </tr>
        <!-- 可動態 JS 新增更多列 -->
    </table>
    <button type="submit">批量新增</button>
</form>

處理頁面(使用 PDO 預防 SQL 注入)

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $names    = $_POST['sp_name']    ?? [];
    $numbers  = $_POST['sp_number']  ?? [];
    $prices   = $_POST['price']      ?? [];
    $counts   = $_POST['counts']     ?? [];
    $addresses= $_POST['address']    ?? [];

    $count = count($names);
    $success = 0;

    $sql = "INSERT INTO tb_products (sp_name, sp_number, price, counts, address) VALUES (?, ?, ?, ?, ?)";
    $stmt = $pdo->prepare($sql);

    $pdo->beginTransaction();
    try {
        for ($i = 0; $i < $count; $i++) {
            // 簡單驗證:跳過空白列
            if (trim($names[$i]) === '') continue;

            $stmt->execute([
                $names[$i],
                $numbers[$i],
                $prices[$i],
                $counts[$i],
                $addresses[$i],
            ]);
            $success++;
        }
        $pdo->commit();
        echo "成功新增 $success 筆資料";
    } catch (Exception $e) {
        $pdo->rollBack();
        echo "新增失敗:" . $e->getMessage();
    }
}
?>

範例二:批量更新使用者狀態(啟用/停用)

列表頁面(含核取方塊)

<form method="post" action="update_batch.php">
    <table>
        <tr><th>選取</th><th>帳號</th><th>權限</th><th>狀態</th></tr>
        <?php foreach ($users as $user): ?>
        <tr>
            <td><input type="checkbox" name="ids[]" value="<?= $user['id'] ?>"></td>
            <td><?= htmlspecialchars($user['username']) ?></td>
            <td><?= htmlspecialchars($user['role']) ?></td>
            <td><?= $user['status'] ?></td>
        </tr>
        <?php endforeach; ?>
    </table>
    <button type="submit" name="action" value="activate">啟用</button>
    <button type="submit" name="action" value="deactivate">停用</button>
</form>

處理頁面

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $ids = $_POST['ids'] ?? [];
    $action = $_POST['action'] ?? '';

    if (empty($ids)) {
        echo "請至少選取一項";
        exit;
    }

    $statusMap = [
        'activate'   => '啟用',
        'deactivate' => '停用',
    ];
    $newStatus = $statusMap[$action] ?? null;
    if (!$newStatus) exit('無效操作');

    // 使用 IN 子句單次更新,效能優於迴圈
    $placeholders = implode(',', array_fill(0, count($ids), '?'));
    $sql = "UPDATE tb_users SET status = ? WHERE id IN ($placeholders)";
    $stmt = $pdo->prepare($sql);
    $params = array_merge([$newStatus], $ids);

    try {
        $stmt->execute($params);
        echo "成功更新 {$stmt->rowCount()} 筆資料";
    } catch (Exception $e) {
        echo "更新失敗:" . $e->getMessage();
    }
}
?>

關鍵技巧總結

場景表單命名PHP 處理SQL 策略
批量新增name="field[]"for 迴圈遍歷Prepared Statement + Transaction
批量更新name="ids[]" (checkbox)取得陣列直接 IN 查詢單條 UPDATE ... WHERE id IN (...)

安全性與最佳實務

  • 必須使用 Prepared Statement,杜絕 SQL 注入
  • 批量新增時使用 Transaction 確保原子性
  • 批量更新優先用 IN 子句單次執行,避免 N 次往返資料庫
  • 驗證陣列長度一致性,防止資料錯位
  • 大量資料(千筆以上)建議分批處理或改用 LOAD DATA INFILE / 多值 INSERT

希望本文對您的 PHP 批量資料處理開發有所幫助。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved