ColdFusion-使用CFLOOP动态创建列名

ColdFusion-使用CFLOOP动态创建列名,coldfusion,coldfusion-8,Coldfusion,Coldfusion 8,我有一个记录上传文档名称的表,每条记录最多14个。列的名称如下: TABLE tblDocuments COLUMNS documentID (int, not null, pk) document1 (varchar(250), null) document2 (varchar(250), null) /* and this continues through */ document14 (varchar(250), null)

我有一个记录上传文档名称的表,每条记录最多14个。列的名称如下:

TABLE tblDocuments
COLUMNS documentID (int, not null, pk)
        document1 (varchar(250), null)
        document2 (varchar(250), null)
        /* and this continues through */
        document14 (varchar(250), null)
因此,我查询特定记录的任何文档:

<cfquery name="qryGetDocs" datasource="#dsn#">
     SELECT document1, ...document14
     FROM   tblDocuments
     WHERE  documentID = <cfqueryparam name="SESSION.documentID" cfsqltype="cf_sql_integer">
</cfquery>
该表单如下所示:

<form name="frmUploadDocs" method="post" action="documentsPage.cfm">

<input type="file" name="document1" size="50" >
<cfif qryGetDocs.document1 IS NOT ''>
   (current file name: <a href="#vars.file_path#/#qryGetDocs.document1#">#qryGetDocs.document1#</a>)</cfif>

<input type="file" name="document2" size="50" >
<cfif qryGetDocs.document2 IS NOT ''>
   (current file name: <a href="#vars.file_path#/#qryGetDocs.document2#">#qryGetDocs.document2#</a>)</cfif>

<!--- list all documents --->

<input type="file" name="document14" size="50" >
<cfif qryGetDocs.document14 IS NOT ''>
   (current file name: <a href="#vars.file_path#/#qryGetDocs.document14#">#qryGetDocs.document14#</a>)</cfif>

<input type="submit" name="submit" value="Upload Documents">
</form>
我想从1循环到14,这样我只有一个and语句,如下所示:

<cfloop from="1" to="14" index="i">
   <input type="fiile" name="document#i#" size="30">
   <cfif qryGetDocs.document#i# IS NOT ''>
     (current file name: <a href="#vars.file_path#/#qryGetDocs.document[#i#]#">#qryGetDocs.document[#i#]#</a>)
   </cfif>
</cfloop>

但是,无论我做了什么尝试,我都无法获得正确的语法。有人能帮我吗?谢谢大家!

查询可以像带字符串索引和方括号的结构一样访问,但前提是还包括所需的行号!。这就像一个二维数组

<cfloop from="1" to="14" index="i">
   <input type="file" name="document#i#" size="30">
   <cfif qryGetDocs["document#i#"][qryGetDocs.CurrentRow] IS NOT ''>
     (current file name: <a href="HTMLEditFormat("#vars.file_path#/#qryGetDocs["document#i#"][qryGetDocs.CurrentRow]#")#">#HTMLEditFormat(qryGetDocs["document#i#"][qryGetDocs.CurrentRow])#</a>)
   </cfif>
</cfloop>

原来的问题已经回答了。但为了说明

更灵活的结构是将文档存储为行。所以基本表可能是:

TABLE:    tblDocuments
COLUMNS:  DocumentID  (unique record id)
          UserID
          DocumentName
使用此结构,您可以通过简单的查询为单个用户检索所有现有文档

<cfquery name="qryGetDocs" datasource="#dsn#">
     SELECT documentID, documentName
     FROM   tblDocuments
     WHERE  userID = <cfqueryparam name="#SomeUserIDVariable#" cfsqltype="cf_sql_integer">
</cfquery>
。。并用一个简单的输出循环显示它们。注意,我添加了documentID作为隐藏字段来标识现有文档

<cfoutput query="qryGetDocs">
   ...
   <input type="file" name="document#CurrentRow#" size="50" >
   <input type="hidden" name="documentID#CurrentRow#" value="#documentID#" >
   (current file name: <a href="#vars.file_path#/#documentName#">#documentName#</a>)
</cfoutput>
如果查询包含的文件少于14个,或者无论最大值是多少,您可以使用query.recordCount来确定有多少个文件 要显示的其他文件输入

<cfset nextInputNumber = qryGetDocs.recordCount + 1>
<cfoutput>
<cfloop from="#nextInputNumber#" to="#MaximumNumberOfDocs#" index="counter">
   <input type="file" name="document#counter#" size="50" >
   <input type="hidden" name="documentID#counter#" value="0" >
</cfloop>
</cfoutput>

只是别忘了添加行号ie queryName[colName][rowNumber]非常感谢您的回答@金发女郎:不客气。如果对你有效,不要忘记接受!:我不知道HTMLEditFormat保护,所以这是一个额外的好处。而且,我正在考虑根据您的评论更改表的结构。所以,我应该有像tblDocuments这样的东西,有documentID、documentName、documentNumber列?@blondmoment-这14个文档与..相关的是什么。。?例如,它们是与特定用户相关的14个文档,还是另一个表中的记录ID…?这是一个笨拙的结构。最好将单个文档存储为行,而不是列。然后,可以根据需要设置多个或少个。将它们存储为14个不同的列将很难搜索和操作。我只能支持Leigh的评论。你的桌子结构全错了。
<cfset nextInputNumber = qryGetDocs.recordCount + 1>
<cfoutput>
<cfloop from="#nextInputNumber#" to="#MaximumNumberOfDocs#" index="counter">
   <input type="file" name="document#counter#" size="50" >
   <input type="hidden" name="documentID#counter#" value="0" >
</cfloop>
</cfoutput>