Проверка отсутствия ввода в динамических полях

По сути, у меня есть форма, которая генерирует определенное количество «типов публикаций» в зависимости от ввода «отделов», прежде чем кто-то заполнит эту форму. (Распознаваемые типы публикаций для конкретных отделов.) Есть пара полей, которые идут с каждым типом публикации... (это одни и те же поля, поэтому каждый тип будет иметь... скажем, 3 поля..) У меня есть цикл, который считывает эти данные и помещает их в базу данных. Однако, если одно из полей не заполнено, значение для этого конкретного поля полностью пропускается, что отбрасывает ввод данных.

Пример: у пользователя есть три поля, и эти три поля повторяются три раза. Пользователь заполняет три в первой строке, два во второй строке и еще раз три в третьей строке. Так:

  • Первый массив полей: 1, 1, 1
  • Массив второго поля: 1, 1
  • Массив третьего поля: 1, 1, 1

Мне нужно найти способ пометить это пустое поле во втором массиве полей, чтобы оно появилось в списке. Я мог бы установить значения по умолчанию для полей, но кто-то может легко удалить эти данные, а в полях имени/названия было бы безвкусно иметь «Нет» или что-то в этом роде...

Любые идеи?

Редактировать: Фрагмент кода (Примечание: я вырезал все неважные элементы стиля...)

<cfoutput query = "getType_PUB">
Publications: #rName# <br />
<input type = "hidden" name = "scholarActivities" value = "#rName#" />
<input type="text" name="inpress09"  size = "8"/><br />
<input type="text" name="published09" size = "8"/><br /> 
<input type="text" name="published08" size = "8"/><br />
<input type="text" name="published07" size = "8"/><br />
</cfoutput>

<cfoutput><input type = "hidden" name = "recordcountPub" value = "#getType_PUB.recordcount#" /></cfoutput>


//////////////DB/////////////

<cfif #form.recordcountPUB# EQ 1>
<cfquery name = "insertSActivities" datasource="cas_evaluation">
  INSERT INTO scholar_publications (faculty, scholarActivities, submit09, inpress09, published09, published08, published07)
  VALUES ( '#form.name#', '#form.scholarActivities#', '#form.submit09#', '#form.inpress09#', '#form.published09#', '#form.published08#', '#form.published07#')
  </cfquery>
<cfelse>
<cfloop from="1" to="#form.recordcountPUB#" index="i">
  <cfquery name = "insertSActivities" datasource="cas_evaluation">
  INSERT INTO scholar_publications (faculty, scholarActivities, submit09, inpress09, published09, published08, published07)
  VALUES ( '#form.name#', '#ListGetAt(form.scholarActivities, i, ',')#', '#ListGetAt(form.submit09, i, ',')#', '#ListGetAt(form.inpress09, i, ',')#', '#ListGetAt(form.published09, i, ',')#', '#ListGetAt(form.published08, i, ',')#', '#ListGetAt(form.published07, i, ',')#')
  </cfquery>
</cfloop>
</cfif>

person Bri    schedule 21.10.2010    source источник
comment
Фрагмент кода полей формы и вставки в базу данных поможет прояснить ситуацию.   -  person Leigh    schedule 21.10.2010
comment
Ох.. это очень рискованно. Ваш код базы данных сломается, если пользователь введет запятую в одно из полей формы, например form.scholarActivities. Если бы вы использовали уникальные имена полей формы, у вас не было бы этой проблемы.   -  person Leigh    schedule 21.10.2010
comment
Хм... как мне сделать уникальные имена полей формы, если поля формы генерируются в зависимости от того, сколько существует типов публикаций... :\   -  person Bri    schedule 21.10.2010
comment
Добавьте номер счетчика к имени поля. В циклах запросов вы можете использовать переменную #currentRow#, то есть fieldName#currentRow#. В цикле страницы действий извлеките значения с помощью нотации массива: например, FORM[fieldName& yourLoopIndex]   -  person Leigh    schedule 22.10.2010
comment
Ваш код уязвим для внедрения SQL. ИСПОЛЬЗУЙТЕ CFQUERYPARAM!   -  person Peter Boughton    schedule 22.10.2010
comment
Я забыл упомянуть об использовании cfqueryparam. Спасибо @Питер.   -  person Leigh    schedule 23.10.2010


Ответы (2)


(Чтобы уточнить мои комментарии..) Безопаснее создавать уникальные имена полей. В противном случае ваш код INSERT может сломаться, если пользователь введет запятую в одно из полей формы. Поскольку вы уже используете цикл запроса, вы можете добавить #currentRow# к каждому набору полей, чтобы сделать имена уникальными.

<cfoutput query = "getType_PUB">
    Publications: #rName# <br />
   <input name="scholarActivities#CurrentRow#" ... />
   <input name="inpress09#CurrentRow#" ... />
   <input name="published09#CurrentRow#" ... />
</cfoutput>

<cfoutput>
   <input name="recordcountPub" value="#getType_PUB.recordcount#" .. />
</cfoutput>

На странице действий просто выполните цикл и извлеките значения с помощью записи массива. Нет необходимости в дополнительном CFIF. Вы по-прежнему можете использовать CFPARAM или structKeyExists для обработки любых полей, которые могут не существовать (например, флажки или переключатели).

<cfloop from="1" to="#form.recordcountPUB#" index="i">
   <!--- extract the values ...--->
   <cfset scholarActivities = FORM["scholarActivities"& i]>
   <cfset submit09 = FORM["submit09"& i]>
   ... 
  <cfquery ....>
        Do the INSERT 
  </cfquery>
</cfloop>
person Leigh    schedule 21.10.2010
comment
Спасибо :) Это то, что я искал. Первоначально у меня были строки полей, которые пользователь мог динамически добавлять, и каждая строка имела добавленный номер 1,2 3... и т.д. Тем не менее, я просто смотрел на вещи и чувствовал, что наличие нескольких полей было бы неэффективным ... Это, вероятно, самый большой прогресс, который я получил с Coldfusion. Я действительно ОЧЕНЬ ценю вашу помощь! Ты понятия не имеешь! :) - person Bri; 22.10.2010

Какие это типы полей? Флажки? Если это так, вы можете установить значения по умолчанию на странице действий со значением 0 или другим значением, которое указывает на отсутствие ответа. Затем проверьте это значение без ответа и пропустите.

Или значение передается как пустое, и ваш код цикла просто не добавляет его в список/массив?

Быстрый пример кода от вас поможет людям дать вам лучшее направление.

person Joshua Cyr    schedule 21.10.2010
comment
значение, переданное как пустое, и ваш код цикла просто не добавляет его в список/массив? - person Bri; 21.10.2010
comment
Никаких комментариев по поводу отсутствия cfqueryparam... всегда добавляйте их последними перед выходом в эфир... Я просто чудак :\ - person Bri; 21.10.2010
comment
Я предполагаю, что вы хотите, чтобы 0 был передан, если они не отметили флажок. В этом случае создайте ‹cfparam› для каждого поля формы со значением по умолчанию 0. Оно будет переопределено формой для всего, что отмечено, и будет 0 для всего остального. ‹cfparam name=#form.whatever по умолчанию = 0› - person Joshua Cyr; 21.10.2010
comment
Спасибо ‹3 Я не знаю, почему я не подумал об этом... Я забыл, что они работают и для ввода без флажка... DOH - person Bri; 21.10.2010
comment
@Bri - они работают и для ввода без флажков - Вы говорите о CFPARAM? Потому что это не работает для текстовых полей и некоторых других типов полей, которые обычно всегда определены... - person Leigh; 21.10.2010
comment
Мех... я думал, что это сработает... но это не сработало... как сказал Ли... не работает для текстовых полей... хммм... вернемся к исходной точке... - person Bri; 21.10.2010
comment
Поскольку они являются полями ввода, вы можете затем перебрать их в действии, заменив значения на 0 или что-то в этом роде. На самом деле переберите все поля формы и сделайте это. Честно говоря, это полный взлом. Вы также можете сделать ввод текста в раскрывающемся списке (если такие значения разрешены) или использовать javascript, который при отправке определенных полей меняется с пустого на ноль, или добавлять маски в поля, чтобы люди должны были вводить 0, а не пустые. или используйте replace() для ',,' to ',0' или что-то в этом роде для ваших списков. - person Joshua Cyr; 22.10.2010
comment
Вероятно, лучше всего перестроить форму, чтобы лучше передавать данные. - person Joshua Cyr; 22.10.2010