繁体   English   中英

如何在 mysql 中使用 foreach 插入查询批量插入数据库

[英]How to bulk insert to database using foreach insert query in mysql

我有一个 HTML 表格,我可以复制它以帮助一次添加多行。 这段代码有效,但我遇到了一个我无法完全解决的问题。 该代码应该为插入数据库的每个数据添加一行。 问题是聊天它重复同一行。 这不是重复的问题。 说,我需要三个位置,我可以添加它们, Location A, Location B, Location C

问题 - 查询不是添加三个位置,而是三次添加位置 C。之所以添加三次是因为我添加了一个选项来复制表单以进行批量插入数据。 问题是它添加了相同的条目,这意味着它正确循环(3次),但它没有输入其他两个。

if (isset($_POST['save-multiple-data'])) {
if (empty($action)) {
    $action = isset($_GET['action']) ? trim($_GET['action']) : "";
    $id = isset($_GET['id']) ? intval($_GET['id']) : "";

    $shiftdata = array('location' => $_POST['location_id'], 'service' => $_POST['service_id']);

    foreach ($shiftdata as $index => $shifts) {
        $wpdb->insert("wp_appointments", array(
            "location_id" => $_POST['location'],
            "service_id" => $_POST['service']
        ));

        echo $shifts[$index];

        if ($wpdb->insert_id > 0) {
            $msg = "Shifts Added Successfully";
        } else {
            $msg = "Failed to Add Shifts";
        }

        }
    }
}

<div class="col-md-4">
    <div class="form-group mb-2">
        <p>
            <label>Location</label>
                <select name="location" value="<?php echo isset($row_details['location_id']) ? $row_details['location_id'] : ""; ?>">
                        <?php
                        $loc_results = $wpdb->get_results ( "SELECT id, name FROM wp_locations");
                        foreach($loc_results as $locat) {
                        $locat_id=$locat->id;
                        $locat_name=$locat->name;
                        echo '<option value="' . esc_attr( $locat_id ) . '">' . esc_html( $locat_name) . '</option>';
                        }
                        ?>
                </select>
        </p>
    </div>
</div>                                

<div class="col-md-4">
    <div class="form-group mb-2">
        <p>
            <label>Service</label>
                <select name="service" value="<?php echo isset($row_details['service_id']) ? $row_details['service_id'] : ""; ?>">
                        <?php
                        $shift_results = $wpdb->get_results ( "SELECT id, name FROM wp_services");
                            foreach($shift_results as $shift) {
                            $shift_id=$shift->id;
                            $shift_name=$shift->name;
                            echo '<option value="' . esc_attr( $shift_id ) . '">' . esc_html( $shift_name) . '</option>';
                        }
                        ?>
            </select>
        </p>
    </div>
</div>
<script src="https://code.jquery.com/jquery-1.9.1.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8" crossorigin="anonymous"></script>

Js代码只帮助我们复制表单,所以我没有在这里包含它。

几个问题:

  1. 您的name属性未设置为能够将多个值提交到同一参数中。 您需要在所有要复制的名称中使用数组语法。

例如

<select name="location[]"

<select name="service[]"
  1. foreach ($shiftdata没有意义,因为这将遍历该关联数组的“位置”和“服务”条目,而不是通过每个条目中的列表。 $shiftdata数组确实是多余的,您可以简单地将其从代码中删除.

假设总是有与服务条目相同数量的位置条目,那么这将更有意义:

for ($i = 0; $i < count($_POST["location"]; $i++) {
  $wpdb->insert("wp_appointments", array(
      "location_id" => $_POST["location"][$i],
      "service_id" => $_POST["service"][$i]
  ));

  if ($wpdb->insert_id > 0) {
        $msg = "Shift added successfully";
    } else {
        $msg = "Failed to add shift for location ".$_POST["location"][$i]." and service ".$_POST["service"][$i];
    }
}

注意另一个不相关的潜在问题 - 您在页面中包含两次 jQuery(版本 1.9.0 和版本 3.6.0)。 这是不必要的、低效的,并且可能导致冲突、崩溃或其他意外行为。 您应该只需要一个版本 - 通常,保留最新版本是明智的,除非您有特定原因需要旧版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM