Как правильно обновить базу данных, используя форму, созданную в цикле?

Я, возможно, не совсем корректно сформулировал вопрос, поэтому сейчас опишу суть своей проблемы. 

У меня есть веб-страница с формой, которая позволяет собирать данные участников. Каждый пользователь может создать до трёх форм для трёх участников команды. Изначально отображается только одна форма для заполнения. После заполнения и нажатия кнопки "Сохранить" данные отправляются в базу данных, страница обновляется, и форма заполняется автоматически с использованием значений из базы данных через `$row = $results->fetchAll(\PDO::FETCH_ASSOC);`. 

Я организовал форму данных в функцию `data()` и вызываю её в цикле `for ($i = 0; $i <= $number_user; $i++)`. Для идентификации каждой формы и её полей я использую `id="<?php if (isset($i)) {echo $i;} ?>"`. Процесс добавления новых форм и записи данных в БД протекает без проблем. 

Однако, когда я пытаюсь обновить данные второй формы, происходит неправильное обновление: при изменении данных в одной форме и нажатии кнопки "Обновить" информация обновляется не в той форме, которая была отредактирована, а в другой. Например, при обновлении первой формы данные обновляются и во второй, а в последней форме происходит обновление данных, которые были введены в первой. В общем, происходит какое-то странное поведение. 

Сохранение и обновление данных реализованы на одной странице, с использованием условия `if (isset($_POST['save'])&& ...)` для сохранения и `if (isset($_POST['update'])&& isset($_POST['id'])&& ...)` для обновления. 

Я предполагаю, что для решения этой проблемы может помочь использование AJAX для вынесения логики обновления в отдельный файл и для сбора значений из конкретной формы. Но у меня возникают сложности с написанием JavaScript-кода для того, чтобы при нажатии на кнопку забрать именно те поля, где `id="<?php if (isset($i)) {echo $i;} ?>"`. 

Как лучше всего организовать решение этой проблемы?
  • 4 сентября 2024 г. 5:32
Ответы на вопрос 2
Для решения вашей проблемы с обновлением записей в базе данных с использованием форм, созданных в цикле, можно рассмотреть несколько подходов. Одна из главных задач — убедиться, что данные отправляются из корректной формы и обновляются в нужные записи в базе данных.

### 1. Убедитесь, что каждая форма имеет уникальные идентификаторы

Если вы уже используете `id="<?php if (isset($i)) {echo $i;} ?>"`, то важно также сделать ваши поля уникальными в пределах формы. Это можно сделать, например, путем добавления префикса к полям формы:

```php
<input type="text" name="participant_name[<?php echo $i; ?>]" id="name_<?php echo $i; ?>">
```

### 2. Измените способ обработки отправляемых данных

Когда кнопка "Обновить" или "Сохранить" нажата, используйте массивы для передачи данных. Например, используя `participant_name[]`, вы можете отправить все имена участников в одном массиве. В обработчике формы:

```php
if (isset($_POST['save'])) {
    foreach ($_POST['participant_name'] as $key => $name) {
        // Используйте $key для идентификации, какой именно участник обновляется
        // Выполняйте соответствующие операции с базой данных
    }
}
```

### 3. Определение действий на стороне клиента

Если вы решите использовать AJAX, можно использовать JavaScript/jQuery для получения данных из конкретной формы. Пример:

```html
<form id="form_<?php echo $i; ?>" method="post">
    <input type="text" name="participant_name" id="name_<?php echo $i; ?>">
    <button type="button" class="update-btn" data-id="<?php echo $i; ?>">Обновить</button>
</form>

<script>
$(document).ready(function() {
    $('.update-btn').on('click', function() {
        let id = $(this).data('id');
        let name = $('#name_' + id).val();
        
        $.ajax({
            type: 'POST',
            url: 'update.php', // файл, который будет обрабатывать обновление
            data: {
                id: id, // передаем id для обновления
                participant_name: name,
            },
            success: function(response) {
                // Обработка успешного ответа
                console.log(response);
            },
            error: function() {
                // Обработка ошибки
                console.error('Ошибка обновления данных');
            }
        });
    });
});
</script>
```

### 4. Обработка на стороне сервера

В `update.php` вы можете выполнить обновление в зависимости от переданного ID:

```php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $id = $_POST['id'];
    $name = $_POST['participant_name'];

    // Подготовить и выполнить SQL-запрос для обновления данных в БД
    $stmt = $pdo->prepare("UPDATE participants SET name = :name WHERE id = :id");
    $stmt->execute(['name' => $name, 'id' => $id]);

    echo json_encode(['status' => 'success']);
}
```

### 5. Проверка и отладка

- Убедитесь, что идентификаторы и данные передаются корректно.
- Проверьте, что в базе данных записываются корректные значения и идентификаторы участников.

Этот подход поможет вам более четко выделить логику сохранения и обновления данных для каждого участника и избежать путаницы с формами.
В комментариях советовали посылать одной формой, нужно только копировать шаблон ввода одного персонажа. Примерно так Основной смысл - шаблоном будут поля ввода первого участника, после копировании шаблона нужно подменить все атрибуты name новых элементов, добавив +1 в индекс имен. 
На стороне php просто пробежаться по массивам name, lastname и age и раскидать кого куда надо.
Похожие вопросы