PHP MySQL вставляет значения из нескольких флажков в один столбец в таблице - PullRequest
0 голосов
/ 02 июня 2011

У меня есть форма, которую пользователь должен заполнить при создании заявки на ошибку, обнаруженную на нашем сайте. В форме в настоящее время есть поле ввода, в которое пользователь вводил бы дизайны, на которые влияет ошибка (например, «Design1, Design2, Design3, Design4» ... и т. Д.). Когда форма отправляется, значение сохраняется в столбце таблицы с именем affectedDesigns.

То, что я хочу сделать, - это создать несколько флажков (один флажок для каждого имеющегося дизайна), который пользователь выберет вместо использования поля ввода. Они смогут выбрать все подходящие варианты. Если возможно, я бы хотел сохранить все значения в столбце affectedDesigns в одной записи. Я думаю, что могу собрать выбранные значения флажков и создать массив или некоторое значение с разделителями-запятыми, которое содержит все выбранные элементы, и передать его в базу данных в одной записи в столбце affectedDesigns. Как мне этого добиться?

Кроме того, как мне тогда получить эти данные и заново заполнить флажки, если они захотят вернуться позже и отредактировать тикет? Спасибо за любую помощь!

Ответы [ 7 ]

2 голосов
/ 02 июня 2011

Я бы не стал хранить все значения в одном поле.У вас будет много проблем, когда вам придется выполнить какой-либо запрос, потому что вы нарушаете правила нормализации.

1 голос
/ 02 июня 2011

создайте массив из ваших значений $ _POST, указанных в имени каждого флажка, затем просто сериализуйте этот массив перед вставкой .... тогда вы можете отменить его сериализацию при повторной загрузке

0 голосов
/ 01 августа 2011

Если не важно, чтобы человек читал в базе данных, это не важно, вы можете использовать функцию сериализации PHP, чтобы объединить все строки в один сохраняемый строковый объект.

Если вы хотите, чтобы данные в базе данных были читаемыми, вы можете использовать implode / explode, чтобы преобразовать ваш массив в одну строку и сохранить как в типе данных char.

Или, если вы хотите, чтобы данные были более управляемыми и могли выполнять запросы к ним, я бы сохранял флажки, используя тип данных mysql SET вместо строки.

0 голосов
/ 11 июля 2011

Ответ был правильным в двоичном варианте.

Бывает, что десятичное число, преобразованное в двоичное, дает вам ТОЧНО комбинацию необходимых вам опций. Единицы для «выбранной» опции и Ceroes для не выбранных (читайте справа налево)

Таким образом, уловка, чтобы спасти их, легка. Присвойте каждому флажку значение 2 ^ index, где index - это идентификатор вашего флажка / порядок

… and you'll get 
2^index0 = 1 
2^index1 = 2
2^index2 = 4
2^index3 = 8
…and so on.

Затем вы суммируете значения своих флажков, скажем,

$options_dec = sum($_POST['options']); //outputs 5 if options 0 and 2 are selected

Эта десятичная сумма, преобразованная в двоичную, показывает, какие именно флажки были выбраны:

$options_bin = base_convert ( $options_dec, 10, 2 ); //outputs 0101 (reads right to left)

Теперь вы можете преобразовать его в массив, инвертировать его и вызвать каждый из них, соответствующий его индексу, с вашими флажками.

$options_arr = array_reverse( str_split( $options_bin, 1 ) ); //returns array containing "0,1,0,1"

Теперь заполните ваши флажки циклом. Предполагая, что флажки располагаются в том же порядке, что и сохраненные значения, и каждый из них имеет 2 ^ $ i.

for($i = 0; $i < sizeof($options_arr); ++$i) {
   $checkbox_value = pow ( 2 , $i );
   $checked_val = ( $options_arr[$i] ? 'checked' : '');
   echo "<input type='checkbox' value='$checkbox_value' $checked_val />\n";
}

Не тестировался, так как я сделал свою версию на JavaScript.

Другим решением является получение опции прямо из двоичной строки

$checked_val = (boolean) substr( $options_bin , -($i+1), 1 );// +1 because neg substr counts from 1, not 0
0 голосов
/ 08 июля 2011

Ленивое решение: предполагая, что ничто иное не зависит от идентификаторов записей в затронутом дизайне, просто удалите все записи для этого тикета, а затем повторно введите отправленные значения $_POST.

0 голосов
/ 02 июля 2011

Тебе нужен тот же ответ, который я ищу.

Спрайты на базовом языке использовали эту систему, чтобы вы выбирали биты, которые вы хотели включить или выключить для каждого столбца (3 столбца на каждый спрайт: 24 бита), а сумма всех 8 значений дает именно уникальное значение, которое только это комбинация элементов вкл / выкл может дать.

Ключ в том, что каждый элемент добавляет значение, которое всегда больше, чем ВСЕ другие предыдущие значения, сложенные вместе.

I.g. Значения флажков: 1, 2, 4, 8, 16, 32, 64, 128.

например. Если выбран 3-й и 5-й элементы (значения 4 + 16), то результат 20 будет получен только этими элементами, поскольку следующее значение 32 больше, чем сама сумма, и даже если вы суммируете все значения до 5-го числа элемент (значение 16), результат никогда не достигнет 32 (он всегда будет на 1 меньше следующего возможного значения, в данном случае - 31)

Основной язык, используемый для этого автоматически, и это было легко, так как максимальное значение было зафиксировано. Каждая сумма была только 8 значений. Вам необходимо ввести максимальное значение для вашей функции, чтобы ограничить количество попыток, которые скрипт попытается "попробовать".

Итак, это то, что вам нужно, я просто не знаю названия.

Как только я найду название этой техники / математической операции, я опубликую здесь рабочую функцию.

Вы также можете получить двоичное число с опциями, например, 01001001011, а затем просто используйте положение символа, чтобы выяснить, включен этот флажок или нет.

PS. Какой ответ будет "вы в конечном итоге использовать взорваться или взорваться" ?? Это ответ ленивого читателя состояния. «ты будешь есть и пить, пока не умрешь»: S

0 голосов
/ 02 июня 2011

В итоге вы будете использовать explode() и implode() для преобразования между строкой и массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...