2014-03-30 3 views
0

У меня есть страница 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="&gt;" onclick="moveOptions('Tags','Tags2')"> 
<input type="button" id="moveLeft" 
     value="&lt;" 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> 
+0

Если пользователь может выбрать несколько вариантов, где-то вдоль линий вам придется проходить через них. –

+0

Разве я когда-либо говорил, что он не собирается зацикливаться? –

+0

Вы можете обойти это, переместив тег cfquery в цикл. Очевидно, что он запустит отдельный запрос на каждый цикл, но вы не получите ошибку. В зависимости от количества итераций это теоретически может добавить латентность, так как вы делаете больше поездок в db. –

ответ

2

Это cfquery (вставка) заявление будет только вставить одну запись , один с идентификатором сообщения блога и ВСЕ идентификаторами тегов как один большой список с разделителями-запятыми.

Итак, вы хотите поместить этот оператор cfquery (insert) внутри блока cfloop, который проходит через список Form.Tags, чтобы вы создавали запись с идентификатором сообщения блога и идентификатором тега текущей итерации цикла ,

+0

Говорит, что мне не хватает точки с запятой. Мне никогда не приходилось его использовать. Я, должно быть, неправильно сделал Cfloop. –

0

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

просто добавьте точку с запятой после инструкции вставки, но ПЕРЕД тем, как вы закроете цикл. Таким образом, каждый запрос будет закрыт точкой с запятой.

Смежные вопросы