| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Неотмеченные checkbox'ы в форме |
| Автор: batigoal 31.5.2005, 15:05 |
| Ситуация: есть таблица с двумя десятками записей. В ней два столбца: строка и число (0 или 1). На ее основе формируется страница с двумя десятками флажков. Пользователь вносит изменения, нажимает submit. Но ведь отправляться будут только отмеченные элементы. Вопрос: как лучше вносить изменения в базу? Вижу два варианта обработки запроса: 1. Записать 0 во все строки, потом перезаписать отмеченные на 1. 2. С помощью JS или hidden-полей передавать имена неотмеченных флажков в запросе. |
| Автор: maximb 31.5.2005, 15:12 | ||
и наверное неотмеченные чекбоксы не приезжают в посте ? а если сперва записать все отмеченные с 1 а потом все оставшиеся с 0 |
| Автор: batigoal 31.5.2005, 15:19 |
| Это у меня комп колбасит, в три захода писал. Но ты и так ситуацию понял верно Вопрос, собсно, в том, как лучше? |
| Автор: Dancer 31.5.2005, 15:31 |
| А что если в сессию положить число, если твоя табличка состоит только лишь из 20 строк, то 32 бита должно хватить вполне. Битовая маска этого числа будет являтся отображением твоих 0/1 в базе. |
| Автор: batigoal 31.5.2005, 15:40 | ||
Но ведь положить-то его можно только при серверной обработке. Юзер из своей странички сделать этого не сможет. |
| Автор: polosatij 31.5.2005, 16:02 | ||
я бы так сделал + смотрел на "<" и ">" с приходящих значений // секьюрити. зачем ещё ява скрипт городить |
| Автор: batigoal 31.5.2005, 16:05 | ||
Не понял. Что ты имеешь в виду? |
| Автор: maximb 31.5.2005, 16:06 |
| 1. перед тем как сформировать страничку кладешь в сессию все данные по которым формируются чекбоксы 2. генеришь пользователю страничку с чекбоксами 3. пользователь отмечает интересующие его чекбоксы 4. пользователь жмет сабмит 5. все отмеченные чек боксы приезжают на сервер 6. пишешь в базу все данны которые соответствуют отмеченным чекбоксам с "1" 7. те данные для которых не было найдено соответствующего чекбокса в реквесте пишешь в ДБ с "0" |
| Автор: batigoal 31.5.2005, 16:16 | ||
Похоже, равноценные варианты получаются (с точки зрения количества обращений к базе). Наверное, все же возьму
Вроде как покороче будет. |
| Автор: maximb 31.5.2005, 16:20 |
| Ну если "0" во все строки будет вставляться в одном запросе к ДБ тогда это лучше, но если все выполняется отдельными, небольшими запросами тогда надо еще подумать какой вариант более подходит |
| Автор: batigoal 31.5.2005, 16:23 |
| Буду делать одним запросом с кучей "OR". |
| Автор: maximb 31.5.2005, 16:30 | ||
тогда да |
| Автор: 3,14 31.5.2005, 18:16 |
| Наверняка можно подменить OutputStream к-ым пользуется драйвер для обращение к БД на BufferedOutputStream, посмотрел бы сам да времени сейчас в обрез, в этом случае думаю что все INSERT запросы отослались бы за одно образение к БД. |
| Автор: batigoal 31.5.2005, 18:24 |
| Да я и так все делаю в один UPDATE, так что не стоит заморачиваться. |
| Автор: Stampede 31.5.2005, 18:38 | ||
Пара замечанией: если будешь делать одним запросом, можно вместо OR воспользоваться констркуцией where <column-name> in (value1, value2, ... , valueN). Никакой особой разницы, просто код чуть проще. Но не будет особой беды и вызвать 20 апдейтов, если сделать через PreparedStatement - вопрос миллисекунд. Зато код будет чище. Просто динамическая генерация SQL - это такое средство, к которому лучше прибегать в самом последнем случае. ЗЫ. А у тебя где обработка сабмита происходит? В сервлете? |
| Автор: batigoal 31.5.2005, 18:40 | ||||||
Угу, воспользуюсь.
Думаю, нет смысла - не часто будет использоваться.
В кастом теге. |
| Автор: Stampede 31.5.2005, 19:01 | ||||
Если не часто будет использоваться, тогда разница в миллисекунды вообще никакого рояля не играет. А что касается PreparedStatement, то его смысл в данном случае не в том, чтобы сохранять откомпиленный запрос между вызовами страницы (поскольку он в кэше ДБ сервера до следующего вызова, вероятно, просто не доживет), а в том, чтобы: а) сохранять его между отдельными апдейтами в процессе обработки одной страницы, и б) избежать генерации SQL кода. То есть если ты напишешь примерно такую функцию, то она будет мослать очень быстро:
Впрочем, дело вкуса. Вернее, не столько вкуса, сколько предпочтений кодирования, которые только отчасти обусловлены вкусом, а от другой части - опытом наступания на грабли и набитыми шишками |
| Автор: Stampede 31.5.2005, 20:26 | ||||
Вот тебе сразу по горячим следам пример возможного сценария: ты написал код для генерации UPDATE, но забыл исключить ситуацию, когда ни один чек-бокс не отмечен. В результате в результате выполнения твоей логики получится неправильная SQL конструкция, и обработка запроса вылетит по ошибке. Самое неприятное, что такой случай может наступить когда угодно: сегодня, завтра, через месяц, через год... короче, никогда не знаешь, где рванет Я не говорю, что SQL совсем не надо генерировать - иногда, действительно, это бывает более простым, а подчас и единственно возможным решением. Но каждый раз, когда это делаешь, нужно относиться к этому как к мине замедленного действия и _очень_ внимательно анализировать (и тестировать) на предмет специальных ситуаций (null значений, спецсиволов в значениях строк, пустых списков и прочей белиберды). А еще лучше - по возможности вообще не связываться, целее будешь |