Вставка данных из формы с динамически именованными полями

OK. Я проделал ужасную работу по объяснению того, что я пытаюсь сделать. Я попробую еще раз, чтобы быть более ясным.

У меня есть список переменных, который отправляется на страницу со вставкой cfquery. Переменные берутся из полей формы с динамическими именами и захватываются с помощью cfloop:

<cfloop list="#form.fieldnames#" index="item">

</cfloop> 

У меня есть поля формы с динамическими именами и добавленная стоимость как таковая:

<input type="hidden" name="ticketid_#some_number#" value="#some_quantity#">

Для краткости предположим, что имя поля формы — ticketid_6, а значение — 4. Это может быть другое имя и значение (например, ticketid_3 со значением 1), или может быть несколько полей формы с похожей конструкцией и разными значениями. имена и/или значения.

Итак, на странице вставки мне нужно вставить ticketid_6 4 раза (создав 4 отдельные строки) в мою таблицу. Таким образом, строка в базе данных для каждого поля формы с динамическим именем умножается на значение каждого.

Я надеюсь, что это объясняет это лучше.

Ли,

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


person Joe Nobody    schedule 17.12.2013    source источник
comment
Это может не применяться, но... имейте в виду, что любая логика цикла сломается, если пользователь введет запятую в одно из полей. Поэтому обязательно обработайте этот сценарий в коде (или переключитесь на поля с индивидуальными именами).   -  person Leigh    schedule 18.12.2013
comment
@Leigh Этот вопрос связан с последним вопросом, который я разместил, и с которым вы помогли. Спасибо за это, кстати. Я отметил ваш ответ как решение. Все это скрытые поля, в которых нет ничего, кроме цифр.   -  person Joe Nobody    schedule 18.12.2013
comment
Хорошо. Похоже, эта структура немного отличается от той, что была в другом потоке. Вы сказали, что все поля имеют одинаковое имя. Действительно ли все названы одинаково, т.е. ticketid_6, или они могут различаться, т.е. ticketid_6, ticketid_8, ticketid_12 и так далее? Если да, можете ли вы опубликовать дамп области FORM, чтобы мы могли видеть, с чем вы работаете, например, <cfdump var="#FORM#">?   -  person Leigh    schedule 18.12.2013
comment
Хорошо, ты поймал меня. Я позаимствовал части вашего предложения, чтобы сделать эту работу, и впоследствии решил сделать это с одним полем формы и зафиксировать имя поля динамической формы, а затем значение этого поля формы, чтобы упростить поток, так сказать . На самом деле они будут различаться в зависимости от того, что пользователь выбирает за две страницы до страницы вставки. Тебе еще нужна эта помойка?   -  person Joe Nobody    schedule 18.12.2013
comment
Не волнуйтесь. Я думаю, что другая структура может быть проще, но... давайте пока остановимся на вашей текущей структуре. Правильная обработка (или код обработки) действительно зависит от соглашений об именах. Итак, да, нам нужно сначала увидеть имена полей формы (при необходимости запутать значения)   -  person Leigh    schedule 18.12.2013
comment
@Leigh Если вы предпочитаете, чтобы я сделал это, как вы предложили в предыдущей теме, я внесу коррективы и буду двигаться вперед, как было предложено. Я ценю ваше мнение.   -  person Joe Nobody    schedule 18.12.2013
comment
Что ж, выбор за вами, но я думаю, что другой метод будет легче разобрать. Сохраните все идентификаторы билетов в одном поле с именем ticket. Хранить количество в отдельном поле: quantity_#ticketid#. Затем просто прокрутите идентификаторы билетов: <cfloop list="#form.ticketID#" index="currTicketID"> ... grab quantity and insert </cfloop>   -  person Leigh    schedule 18.12.2013
comment
Ok. Я отредактировал вопрос еще раз, чтобы попытаться объяснить его лучше.   -  person Joe Nobody    schedule 18.12.2013
comment
Почему вы хотите сохранить ticketid_6 4 раза, предполагая, что form.ticketid_6 имеет значение 4? Это не очень эффективный дизайн базы данных. Как заявил @Leigh, хранение идентификатора с количеством в одной строке кажется гораздо лучшей идеей, однако трудно сказать об этом с ограниченной информацией, которая у нас есть.   -  person Scott Stroz    schedule 18.12.2013
comment
Это сайт билетов на мероприятия. При этом покупатель может купить более одного билета ticketid_6. Для каждого купленного билета создается уникальный номер, который используется в качестве штрих-кода для сканирования в кассе. Я уже разработал уникальный номер штрих-кода для каждого отдельного билета. Я просто не могу понять, как делать то, что я прошу в своем вопросе.   -  person Joe Nobody    schedule 18.12.2013


Ответы (3)


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

<cfloop list="#form.fieldnames#" index="item"><!--- loop through all the form fields --->
  <cfif find('ticketid_',item)><!--- if the form name contains 'ticketid_'. Use findNoCase if you want to ignore case sensitivity --->
    <cfloop from="1" to="#form[item]#" index="counter"><!--- loop through the number in form.ticketid_ --->
      <cfquery datasource="#dsn#">
      INSERT INTO table (fieldname, fieldValue, TicketNum)
      VALUES (
        <cfqueryparam value="#item#" cfsqltype="cf_sql_varchar">,--fieldName from the form
        <cfqueryparam value="#form[item]#" cfsqltype="cf_sql_varchar">--value of the fieldName in the form
        <cfqueryparam value="#counter#" cfsqltype="cf_sql_integer">--ticket number being inserted
       )
      </cfquery>
    </cfloop>
  </cfif>
</cfloop>

Вам нужно будет выполнить проверку на стороне сервера, чтобы убедиться, что они не ввели нечисловое число в поле ввода, но если вы сделали это, это должно достичь того, что вы ищете.

person Matt Busche    schedule 18.12.2013
comment
Я немного отредактировал свой вопрос, чтобы лучше объяснить себя. - person Joe Nobody; 18.12.2013
comment
Ok. Я отредактировал вопрос еще раз, чтобы попытаться объяснить его лучше. - person Joe Nobody; 18.12.2013
comment
Я не уверен, что такое #counter# и почему он вставляется в базу данных. Кроме того, могу ли я вставить другие значения, используя ту же вставку, не нарушая то, что у вас есть? - person Joe Nobody; 18.12.2013
comment
counter — текущий номер вставляемого билета. Вы можете вставить все, что хотите, с помощью оператора вставки, почему он сломается? - person Matt Busche; 18.12.2013

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

<input type="hidden" name="ticketid_#some_number#" value="#some_quantity#">

<cfloop list="#form.fieldnames#" index="item">
   <cfoutpuy>Evaluate("ticketid_#item#")</cfoutpuy>
</cfloop> 
person Azam Alvi    schedule 20.12.2013
comment
Вы можете использовать form[ticketid_1] для доступа к значению, а не к оценке, но в любом случае ваш цикл совершенно неверен. - person Matt Busche; 20.12.2013

Сначала вам нужно объединить ваши данные в XML-структуру.

<cfsavecontent variable="myFormData">
<cfoutput>
  <ul class="xoxo">
  <cfloop list="#form.fieldnames#" index="item">
    <cfloop list="#form[item]#" index="eachItem">
  <li><b>#xmlformat(item)#</b> <var>#xmlformat(eachItem)#</var>      
    </cfloop>
  </cfloop>
 </ul>
<cfoutput>
</cfsavecontent>

Затем сделайте одну вставку

<cfquery>
   INSERT INTO table (formData)
   VALUES (<cfqueryparam value="#myFormData#" cfsqltype="cf_sql_varchar">)
</cfquery>

Когда вы извлекаете данные, вы можете

  • Показать как есть, маркированный список,
  • Повышение до группы строк в таблице

Обратите внимание, что данные вставляются как в формате HTML, так и в формате XML.

person Community    schedule 18.12.2013
comment
Я немного отредактировал свой вопрос, чтобы лучше объяснить себя. - person Joe Nobody; 18.12.2013
comment
xml-структура? Я так не думаю. - person Dan Bracuk; 18.12.2013
comment
Я создал запись в разделе codereview.stackexchange.com/questions/37653/, если есть опасения по поводу этого подхода - person James A Mohler; 18.12.2013
comment
Ok. Я отредактировал вопрос еще раз, чтобы попытаться объяснить его лучше. - person Joe Nobody; 18.12.2013
comment
Почему вы хотите преобразовать данные формы в XML (или HTML)? Похоже, что для обработки этого потребуется много обработки, не говоря уже о том, что это затрудняет правильный поиск по столбцам базы данных, если это необходимо. - person Scott Stroz; 18.12.2013
comment
В моем маркированном списке есть несколько причин, почему. Но что касается поиска, я могу выполнить полнотекстовый поиск напрямую в table, и он будет искать всю форму за один раз. - person James A Mohler; 18.12.2013