3

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

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

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

谢谢 - 乔

4

2 回答 2

2

这个的自定义标签示例实现......

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

电子邮件会员.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,您需要在安全层中编写代码,类似于您的应用程序自身的安全性,以便在找到 url 时文件不会受到攻击。
  • 通过 cfhttp 对文件的每次调用都需要调用一些额外的安全检查。
  • 它明显变慢。在一个使用零内容 application.cfc 的非常简单的测试中,自定义标记方法的执行时间实际上是 <= 1/100。随着实际功能添加到方法中,结果的差异会发生变化。

这是一些示例代码,您可以自己进行测试。

“安全”文件夹的内容:

应用程序.cfc

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

测试运行.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>

测试标签.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
于 2014-10-13T14:52:32.183 回答
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>
于 2014-10-13T16:09:10.090 回答