RumusBin
@RumusBin
Живу, учусь, не стесняюсь

Как передать множественный список в форме для записи в БД Sql?

Доброго времени всем, кто набрел на это сообщение.
Вкратце пред история. Получил недавно тестовое задание, которое (в силу своей ограниченности в знаниях, пока) выполнить в срок не смог. Но затею не бросил и чисто для себя решил "доковырять" его.
Суть вопроса, которая на данный момент ставит меня в тупик!
Есть страница с формой, с данными контакта, на которую мы попадаем при щелчке на кнопку "изменить" возле соответствующего контакта в списке.
код страницы:
<body>
        <div class="app-head">
            <h2>Изменить данные контакта <i><?=$contact['name']?></i></h2> <!--добавляем в название имя контакта-->
        </div>
        <div class="contacts-table">
            <div class="table-content">
                <form action="/contact/change/<?=$contact['id']?>" method="post"><!-- отправляем данные с id контакта -->
         
            <input type="text" name="name" class="form-control" placeholder="<?=$contact['name']?>"><br><!--вводим в поле "Имя" уже имеющиеся данные-->
            <input type="text" name="surname" class="form-control" placeholder="<?php if(isset($contact['surname'])&&!empty($contact['surname']))
            {echo $contact['surname'];}  else { echo "Фамилия"; }?>"><br>  <!-- если есть заполненная фамилия контакта записываем, если это поле не заполненно пишем "Фамилия" -->
            <input type="text" name="patronymic" class="form-control" placeholder="<?php if(isset($contact['patronymic'])&&!empty($contact['patronymic']))
            {echo $contact['patronymic'];}  else { echo "Отчество"; }?>"><br>
            <p>Номер телефона:</p>
                            <?php foreach ($numbers as $number):?>               
            
            <input type="text" name="<?=$number['id']?>" class="form-control" placeholder="<?=$number['phone_number']?>" id="phone-number">              
           
                <?php endforeach;?>
            <br><br>
            <div class="btn btn-block">
            <input type="submit" name="submit" value="Изменить">
            </div>
        </form>
            </div>
        </div>
    </body>


Получаем данные о контакте из БД в соответствующей модели и подставляем в поля. Так же получаем данные из тругой таблицы с номерами телефонов контакта, которые можем сортировать по полю 'contact_id', которое соответствует полю 'id' в таблице с контактами. Соответственно, отправляем в нужный экшн модели "Контакы" через "КонтактКонтроллер" (он непосредственно принимает данные из формы, немного их валидирует, записывает в массив и передает модели) которая будет помещать данные в БД. Вот код этого экшена из модели:
public static function changeContact($options)
    {
        
        $db = Db::getConnection();
        
        $sql = 'UPDATE contacts SET name=:name, surname=:surname, patronymic= '
                . ':patronymic WHERE id = ' . $options['id'];
        
        $result = $db->prepare($sql);
        $result->bindParam(':name', $options['name'], PDO::PARAM_STR);
        $result->bindParam(':surname', $options['surname'], PDO::PARAM_STR);
        $result->bindParam(':patronymic', $options['patronymic'], PDO::PARAM_STR);
        
        return $result->execute();
   }

Но эта модель обрабатывает данные только о пользователи и помещает их в таблицу с пользователями , а таблица с номерами телефонов для них сформирована отдельно, т. к. пользователь может иметь и два и более номеров.
Так вот вопрос, наконец то, как мне принимать и обрабатывать данные из этой формы если одному id контакта соответствует несколько номеров телефонов?
Спасибо
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
felessar
@felessar
Вы должны передавать номера телефонов как коллекцию. Например:
$contact['numbers'] = [
  [
    ['id'] => 1,
    ['number'] => '1234567890'
  ],
  [
    ['id'] => 2,
    ['number'] => '1234567891'
  ]
]

POST был бы наподобие (взято из Chrome web inspector):
contact[id]:
contact[lastName]:
contact[firstName]:
contact[post]:
contact[birthdate]:
contact[phones][0][id]:
contact[phones][0][phone]:+38 (067) 111-11-11
contact[phones][1][id]:
contact[phones][1][phone]:+38 (067) 222-22-22
contact[emails][0][id]:
contact[emails][0][email]:
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы