Вернуться




Как выполнить многократную вставку в базу данных с помощью запроса 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). Это неэффективно и может вызвать конфликт версий, сбои или другое неожиданное поведение. Вам должна быть нужна только одна версия - в общем, было бы разумно сохранить самую последнюю версию, если у вас нет особой причины использовать более старую.



Если вам понравилась эта статья поделитесь ею с друзьями, тем самым вы помогаете нам развиваться и добавлять всё больше интересного и полезного контента!




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





Какой хостинг выбрать для сайта

Какой хостинг выбрать для сайта

Для беспроблемного функционирования сайта на просторах интернета необходимо ...

15 Февраля 2021    Web

Как и на чём лучше писать сайты?

Как и на чём лучше писать сайты?

Каждый начинающий сайтостроитель мечтает создать свой уникальный сайт на ко ...

21 Февраля 2021    Web

Ищем качественный и недорогой хостинг? Тогда вам сюда

Ищем качественный и недорогой хостинг? Тогда вам сюда

Рано или поздно всем вебмастерам приходится искать хостинг для своего проек ...

21 Февраля 2021    Web