У меня есть страница EditBlogPost. На этой странице пользователь может редактировать «Название», «Тело» и другие объекты. Единственная часть, с которой я борюсь, позволяет пользователю редактировать BlogTags, связанные с «BlogPost».Вставить несколько записей динамически в Coldfusion
Мой метод для этого использует функцию bind, чтобы заполнить поле списка тегами, которые в настоящее время связаны с определенным BlogPost. Я также заполнил еще один список, используя функцию привязки, с тегами, которые в настоящее время не связаны с определенным BlogPost.
Tags: <cfSelect Name="Tags" id ="Tags"
bind="cfc:EditBlogTag.getData({[email protected]})"
multiple="yes"
style="Width:150px" size="6"
value="TagID" display="Tag">
</cfselect>
<cfSelect Name="Tags2" id ="Tags2" style="Width:150px"
bind="cfc:EditBlogTag.getData2({[email protected]})"
value="TagID"
display="Tag"
multiple="yes"
size="6" readonly="yes" >
</cfselect>
Когда BlogPost выбран, и заполнить список ящиков, пользователь может перемещать теги из одного списка в другой, используя кнопки со стрелками.
<input type="button" id="moveRight"
value=">" onclick="moveOptions('Tags','Tags2')">
<input type="button" id="moveLeft"
value="<" onclick="moveOptions('Tags2','Tags')">
Все, что я перечислял до настоящего времени, работает. На выходной странице возникают проблемы.
На выходной странице я сначала удаляю все теги, связанные с BlogPost, используя в BlogID. Это работает, как ожидалось:
<CFQUERY name="DeleteTagData" datasource="TheBlog">
DELETE FROM BlogTagJunction
WHERE BlogID = <cfqueryparam value="#Form.BlogID#"
list="true"
cfsqltype="cf_sql_numeric"/>
</CFQUERY>
Следующая часть должна вставить каждую метку в поле списка, состоящего из тегов быть связано с формой.
<CFQUERY name="AddTagData" datasource="prpblog">
INSERT INTO BlogJunction (BlogID, TagID)
VALUES (
<cfqueryparam value="#Form.BlogID#" cfsqltype="cf_sql_numeric"/>
, <cfqueryparam value="#Form.Tags#" list="true" cfsqltype="cf_sql_numeric"/>
)
</cfquery>
Это приводит к сообщению об ошибке:
[Macromedia] [SequeLink JDBC Driver] [ODBC Торцевые] [Microsoft] [ODBC Microsoft Access Driver] Количество значений запроса и назначения полей не то же самое.
Это из-за выбора более одного тега. Как я могу хотя бы разрешить этой функции принимать несколько выбранных индексов? Предпочтительно, я хотел бы, чтобы все внутри поля списка было вставлено вместо выбора каждого тега.
Каждый индекс должен быть отдельный запись:
For example:
PostID | TagID
1 2
1 3
1 4
2 2
2 3
Edit: Моя попытка cfloop для этого случая:
<CFQUERY name="AddTagData" datasource="TheBlog">
<cfloop list="#Form.Tags#" index="Tags">
INSERT INTO Junction (BlogID, TagID)
Values (<cfqueryparam value="#Form.BlogID#" list="true" cfsqltype="cf_sql_numeric"/>,
<cfqueryparam value="<cfoutput>Tags</cfoutput>" list="true" cfsqltype="cf_sql_numeric"/>)
</cfloop>
</cfquery>
Если пользователь может выбрать несколько вариантов, где-то вдоль линий вам придется проходить через них. –
Разве я когда-либо говорил, что он не собирается зацикливаться? –
Вы можете обойти это, переместив тег cfquery в цикл. Очевидно, что он запустит отдельный запрос на каждый цикл, но вы не получите ошибку. В зависимости от количества итераций это теоретически может добавить латентность, так как вы делаете больше поездок в db. –