Web

Как выполнить многократную вставку в базу данных с помощью запроса foreach insert в mysql

У меня есть HTML-форма, которую я дублирую при добавлении нескольких строк за один раз. Этот код работает, но я столкнулся с проблемой, которую не могу решить. Код должен добавлять строки для данных, вставленных из базы данных. Проблема в том, что в чате несколько одинаковых строк. Это не проблема дублирования. Скажем, мне нужно три местоположения, я могу добавить их, например, как, местоположение A, местоположение B и местоположение 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 добавлена успешно";

        } else {

           $msg = "Ошибка при добавлении Shifts";

        }

    }

}

}

 

<div class="col-md-4">

<div class="form-group mb-2">

    <p><label>Местоположение</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>Обслуживание</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>

 

Ответ 1

Пара проблем:

  1. Ваши name атрибуты не настроены на отправку нескольких значений в один и тот же параметр. Вам нужен синтаксис массива для всех имен, которые вы собираетесь дублировать. Например, <select name="location[]" или<select name="service[]"
  2. 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 добавлена успешно";

    } else {

    $msg = "Ошибка при добавлении shift для местоположения".$_POST["location"][$i]." и обслуживания ".$_POST["service"][$i];

    }

}

 


 

Еще одна не связанная с этим потенциальная проблема - вы дважды включаете jQuery на свою страницу (версия 1.9.1 и версия 3.6.0). Это неэффективно и может вызвать конфликт версий, сбои или другое неожиданное поведение. Вам должна быть нужна только одна версия - в общем, было бы разумно сохранить самую последнюю версию, если у вас нет особой причины использовать более старую.

Схожие статьи

Web

Как проверить, содержит ли строка определенное слово?

Web

Как вывести данные из DataBase, скопировать все вводимые данные из формы, чтобы отправить их себе, включая произведение веса*шт в режиме реального времени

Web

Применение комбинации элементов в массивах PHP

Web

Чтение/запись файла MS Word на PHP

×