#php #mysql #checkbox
#php #mysql #флажок
Вопрос:
У меня есть форма, которую пользователь заполнял бы при создании заявки на ошибку, которую они обнаружили на нашем веб-сайте. В форме в настоящее время есть поле ввода, в котором пользователь будет вводить проекты, на которые влияет ошибка (например, «Дизайн1, Дизайн2, Дизайн3, Дизайн4» … и т.д.). При отправке формы значение сохраняется в столбце таблицы с именем affectedDesigns
.
Что я хочу сделать, так это создать несколько флажков (по одному для каждого имеющегося у нас дизайна), которые пользователь будет выбирать вместо использования поля ввода. Они могли бы выбрать все, что применимо. Если возможно, я все равно хотел бы сохранить все значения в affectedDesigns
столбце в одной записи. Я думаю, что я могу собрать выбранные значения флажков и создать массив или некоторое значение, разделенное запятыми, которое содержит все выбранные элементы и отправить это в базу данных в одной записи в affectedDesigns
столбце. Как я могу этого добиться?
Кроме того, как бы мне затем извлечь эти данные и повторно заполнить флажки, если они захотят вернуться позже и отредактировать тикет? Спасибо за любую помощь!
Комментарии:
1. Если вам позже понадобится выполнить поиск ошибок по дизайну, это поле «все в одном» усложнит задачу. Поле базы данных должно содержать только одно значение. Несколько значений должны храниться в отдельной таблице.
2. Хм, чем больше я думаю об этом, тем больше я думаю, что это было бы лучше. Спасибо за ввод.
3. Я бы не рекомендовал использовать флажки, если вы планируете добавить возможность редактирования. Флажки не отправляют никакого значения, когда они сняты, и это может вызвать проблемы с переопределением. Если пользователь будет вводить форму только один раз, все в порядке, в противном случае я бы использовал вместо этого select elements.
4. @AR в этот момент вы просто предположили бы, что любое не переданное значение не было проверено, и действовали бы оттуда. При последующем обновлении вы просто удаляете старые данные флажка и вставляете новые данные. Это устраняет любые «висячие» флажки.
5. Да, я согласен с @Marc. Использование выбора может работать не лучшим образом для пользовательского интерфейса … я боюсь, что нажатие CTRL на каждый элемент может привести к неправильному вводу информации.
Ответ №1:
Я бы не стал хранить все значения в одном поле. У вас возникнет много проблем, как только вам придется выполнить какой-либо запрос, потому что вы нарушаете правила нормализации.
Комментарии:
1. Спасибо, @nick. Я думаю, что сначала я собираюсь попробовать создать отдельную таблицу.
Ответ №2:
создайте массив из ваших значений $ _POST, введенных в название каждого флажка, затем просто сериализуйте этот массив перед вставкой …. затем вы можете отменить сериализацию при повторной загрузке
Комментарии:
1. Спасибо за помощь, @trey! Я могу сначала попытаться создать отдельную таблицу. После некоторых сообщений я понял, что позже могу пожалеть об использовании только одного столбца для хранения данных.
Ответ №3:
В конечном итоге вы будете использовать explode()
и implode()
для преобразования между строкой и массивом.
Ответ №4:
Вам нужен тот же ответ, который я ищу.
Спрайты на языке Basic использовали эту систему для выбора битов, которые вы хотели включить или выключить для каждого столбца (3 столбца для каждого спрайта: 24 бит), и сумма всех 8 значений дает именно то уникальное значение, которое может дать только эта комбинация элементов вкл / выкл.
КЛЮЧ в том, что каждый элемент добавляет значение, которое всегда больше, чем все остальные предыдущие значения, сложенные вместе.
Например. Значения флажков являются 1, 2, 4, 8, 16, 32, 64, 128.
Например. Если выбраны 3-й и 5-й элементы (значения 4 16), результат 20 будет получен только этими элементами, поскольку следующее значение 32 больше, чем сама сумма, и даже если вы суммируете все значения до 5-го элемента (значение 16), результат никогда не достигнет 32 (это всегда будет на 1 меньше следующего возможного значения, в данном случае в сумме получается 31)
Раньше базовый язык делал это автоматически, и это было легко, поскольку максимальное значение было фиксированным. Каждая сумма имела длину всего 8 значений. Вам нужно максимальное значение для ввода в вашу функцию, чтобы ограничить попытки, которые скрипт будет предпринимать для «try».
Итак, ЭТО то, что вам нужно, я просто не знаю названия.
Как только я найду название этой техники / математической операции, я опубликую здесь рабочую функцию.
Вы также можете получить двоичное число с параметрами, например 01001001011, а затем просто использовать позицию символа, чтобы выяснить, включен этот флажок или выключен.
PS. Что за ответ «в конечном итоге вы будете использовать explode или implode»?? Это ответ ленивого гадателя. «ты будешь есть и пищать, пока не умрешь» :S
Ответ №5:
Ленивое решение: предполагая, что от идентификаторов записей в affectedDesigns больше ничего не зависит, просто удалите все записи для этого тикета, затем повторно введите отправленные $_POST
значения.
Ответ №6:
Ответ был правильным в двоичном варианте.
Оказывается, что десятичное число, преобразованное в двоичное, дает вам ИМЕННО ту комбинацию параметров, которая вам нужна. Единицы для «выбранного» параметра и значения для не выбранных параметров (читать справа налево)
Таким образом, сохранить их несложно. Присвоите каждому флажку значение 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
Ответ №7:
Если не важно, что данные в базе данных читаемы человеком, вы можете использовать функцию PHP serialize для объединения всех строк в один сохраняемый строковый объект.
Если вы хотите, чтобы данные в базе данных были удобочитаемыми, вы могли бы использовать implode / explode для преобразования вашего массива в одну строку и сохранения как есть в типе данных char.
Или, если вы хотите, чтобы данные были более управляемыми и могли выполнять запросы к ним, я бы сохранил флажки, используя тип данных mysql SET, а не строку.