将查询的参数多次传递给ColdFusion文件?

时间:2014-10-13 14:30:17

标签: coldfusion cfmail

我在特定文件email_output.cfm中设置了cfmail函数,该文件需要传递给它的ID才能正常工作,例如email_output.cfm?ID = 1。我想设置一个运行查询的cron作业,返回要传递的各种所需ID。在测试中,我可以执行以下操作:

  <cflocation url="email_output.cfm?ID=10" >

但是,由于cflocation停止所有其他执行并打开另一个页面,我无法遍历它。如何将参数从查询多次传递到单个CF页面?

谢谢 - 乔

2 个答案:

答案 0 :(得分:2)

此自定义标记示例实现...

如果这是您第一次使用自定义标记,最简单的方法是将其放在与调用它的页面相同的文件夹中。将它放在不同的目录中有几个选项,但让我们开始简单。

EmailMembers.cfm

<cfquery name="GetUIDs">
  select userid from users
</cfquery>

<cfoutput query="GetUIDs">
  <cf_maileach uid="#userID#">
</cfoutput>

请注意我如何调用我的标签cf_maileach?

在同一目录中,放置maileach.cfm,看看名称是如何匹配的?

maileach.cfm

<cfif StructKeyExists(attributes,"uid") and val(attributes.uid) gt 0>
  <cfquery name="getinfo">
    select fname,lname,email
      from users
     where userID = <cfqueryparam cfsqltype="cf_sql_integer" value="#attributes.uid#">
  </cfquery>

  <cfmail to="#getinfo.email#" subject="Hi #getinfo.fname#">...</cfmail>
</cfif>

注释

  • 根据您的cf版本以及您是否使用application.cfc,有几种方法可以将自定义标记放在外部目录中。还有<cfmodule>
  • 这只是一个样本,这个基本是多余的,我只是试图模仿提问者概述的内容。在此示例中,我调用了一个可以获取所有数据的查询,只是用它来逐行查询。
  • 如果您不熟悉<cfqueryparam>,请查阅,使用它,喜欢它。

编辑:虽然CFHTTP方法可以用于此目的,但它会遇到一些问题

  • 会话不会自动传递(即使请求服务器和目标服务器相同。)。
  • 访问该页面就像浏览器请求一样。处理Application / OnRequestEnd(并且由于会话信息也被传递,这可能会导致尝试访问安全区域中的文件时出现问题。
  • 由于上述原因,页面需要位于具有自己的应用程序文件的文件夹中,以否定目录层次结构中位于其上的任何应用程序文件。
  • 要打击1,2和3,您需要在安全层中进行编码,类似于应用程序自身的安全性,以便在找到网址时文件不容易受到攻击。
  • 通过cfhttp对文件的每次调用都需要调用一些额外的安全检查。
  • 明显变慢了。在使用零内容application.cfc的非常简单的测试中,自定义标记方法在字面上<= 1/100时执行。随着实际功能被添加到方法中,结果的差异将会改变。

以下是一些自行测试的示例代码。

文件夹的内容&#34; safe&#34;:

的Application.cfc

[ blank file, to negate my testing site's actual application.cfc ]

Testrun.cfm

<cfoutput><cfset starttick = GetTickCount()>
<cfloop from="1" to="20" index="i">
  <cfhttp url="http://mysamesite.com/safe/http.cfm?u=#i#" method="get" result="test">
  #test.filecontent#<br>
</cfloop>
CFHTTP Execution Time: #(GetTickCount() - starttick)#<br><br>

<cfset starttick = GetTickCount()>
<cfloop from="1" to="20" index="i">
  <cf_testtag u="#i#"><br>
</cfloop>
CustomTag Execution Time: #(GetTickCount() - starttick)#<br><br>
</cfoutput>

testtag.cfm

<cfoutput>The ID entered was #attributes.u#</cfoutput>

http.cfm

<cfoutput>The ID entered was #url.u#</cfoutput>

结果(以毫秒为单位) 每个测试在HTTP上传递20次,在自定义标签上传递20次。

CFHTTP  Tag
661ms   6ms
1624    5
616     5
460     4
522     6
816     4

答案 1 :(得分:2)

您也可以使用cfhttp

来完成此操作
 <cfquery name="GetUIDs">
    select userid from users
 </cfquery>

 <cfloop query="GetUIDs">
   <cfhttp url="http://localhost:8500/cf10/test.cfm?id=#userid#" method="get" result="test">
</cfloop>