обработка чекбоксов с записью в бд - PHP БД

209
21 сентября 2017, 17:07

На странице есть форма для пользователя со списком видов работ (чекбоксы). Пользователь может выбрать одно или несколько значений.

Вопрос:

  1. как обработать форму с записью в БД?
  2. как правильно хранить в БД информацию, учитывая связь многим ко многим, а также с дальнейшей целью фильтрации по видам работ?

Есть три таблицы:

  1. id пользователя и другая информация по нему
  2. id видов работ и наименование видов работ
  3. id пользователя и id видов работ

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

Answer 1

При отправке формы поля input[type=checkbox] отправляются в виде name=value в том случае, если они установлены. То есть если у нас есть

<form ...>
<input type="checkbox" name="service1" value="1">
<input type="checkbox" name="service2" value="1" checked>
<input type="checkbox" name="service3" value="1" checked>
</form>

то при отправке такой формы (услуга 2 и услуга 3 включены) мы увидим на сервере что-то вроде

?...&service2=1&service3=1

Читать такие вещи можно конструкциями вида (это просто пример, не думайте, что он хороший)

$service1 = isset($_GET['service1']) && $_GET['service1'] ? 1 : 0;
$service2 = isset($_GET['service2']) && $_GET['service2'] ? 1 : 0;
$service3 = isset($_GET['service3']) && $_GET['service3'] ? 1 : 0;

Громоздко и довольно ужасно

Есть второй, более удобный на мой взгляд вариант представления нескольких опций:

<form ...>
<input type="checkbox" name="service[]" value="service1">
<input type="checkbox" name="service[]" value="service2" checked>
<input type="checkbox" name="service[]" value="service3" checked>
</form>

Вместо service1 в значении поля флажка можно указать значение опции (например английское название, русское название, числовой код опции или номер артикула в каталоге)

На сервере такие вещи будут преобразованы сразу в массив значений:

$services = isset($_GET['service']) ? $_GET['service'] : array();

И вы можете работать с ним, как с массивом, через foreach и так далее

Второй вопрос касательно связи. Проще всего поступить через создание таблицы связей.

Если у вас есть сущность "пользователь" и у него может быть неизвестное количество "видов работ", то нужно организовать таблицу с полями "пользователь", "вид работ", "есть связь" (последнее поле не обязательно), можно просто создавать запись в таблице если связь есть, и не создавать - если ее нет

Работать с этим очень просто:

SELECT `service` FROM `links` WHERE `user_id` = N; /* Узнать виды работ для пользователя N */
SELECT `user_id` FROM `links` WHERE `service` = M; /* Узнать всех пользователей, для которых нужно выполнить работы M */

Однако будьте внимательны. Если "пользователь" заказывает работы регулярно, и может сделать заказ несколько раз с разным набором работ, то возможно нужна еще одна сущность - "заказ"

В этом случае "заказ" будет в отдельной таблице, он связан с пользователем по user_id к примеру, а внутри "заказа" перечислены виды работ

Присмотритесь внимательнее к своей задаче, поймите ее, нарисуйте на листочке - что происходит и что может происходить, представьте себя на месте людей, который этим пользуются.. Словом - будьте программистом ) И все обязательно получится

READ ALSO
Как правильно закрыть ссылку на рубрику от индексации в wordpress?

Как правильно закрыть ссылку на рубрику от индексации в wordpress?

Создал рубрику 'original' (чтобы помечать индивидуальные статьи) в wordpress, которую хочу сделать скрытой для поиска и визуального отображения (для...

179
Не работает форма

Не работает форма

Доброго времени сутокПрошу помощи у гуру

170
Что может настырно резать Iframe?

Что может настырно резать Iframe?

Добрый день при публикации поста , нагло обрезается тег iframe , публикуется пост через обычную textarea Как можно избавиться от обрезки тега

253