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