好的,由于某些奇怪的原因,我创建的 request.dsn 和另一个名为 request.cfcDIR 的变量一旦在 Application.cfm 文件中设置就不会被保留。(Coldfusion 10)
这是上述两个变量的值的来源。
<cfset chkURL = "#CGI.HTTP_HOST#">
<cfif ((chkURL) EQ "url.subdomain.here" OR (chkURL) EQ "url.subdomain.here.a" OR (chkURL) EQ "url.subdomain.here.b" OR (chkURL) EQ "url.subdomain.here.c")>
<cfset whichDB = "1,2,3,4,5,6">
<cfelse>
<cfset whichDB = "0">
</cfif>
<!--- Start Check for Which DB the user resides and overwrite the request.dsn variable in Application.cfm --->
<cfif ((whichDB) NEQ 0 OR (whichDB) NEQ "")>
<cfset whichDB = "#whichDB#">
<cfif (whichDB) EQ 0>
<cfset request.dsn = "xxxxx_1">
<cfelse>
<!--- Loop through the whichDB list --->
<cfloop list="#whichDB#" delimiters="," index="i">
<cfquery name="CheckDB" datasource="xxxxx_#i#">
Select username,db,compid
FROM users
WHERE username = <cfqueryparam value="#FORM.username#" cfsqltype="cf_sql_varchar" maxlength="20">
</cfquery>
<!--- Here we check for which database has the results which originates from the Query(CheckDB) above
***IMPORTANT*** in order for this to work properly your Coldfusion DSN must named xxxxx_1, xxxxx_2 and so on...--->
<cfif (CheckDB.RecordCount) NEQ 0 AND (CheckDB.db) EQ 1>
<cfset client.dsn = "xxxxx_1">
<cfset client.cfcDIR = "cfcV5">
<cfset request.dsn = "xxxxx_1">
<cfset request.cfcDIR = "cfcV5">
<cfbreak/>
<cfelseif (CheckDB.RecordCount) NEQ 0 AND (CheckDB.db) EQ 2>
<cfset client.dsn = "xxxxx_2">
<cfset client.cfcDIR = "cfc">
<cfset request.dsn = "xxxxx_2">
<cfset request.cfcDIR = "cfc">
<cfbreak/>
<cfelseif (CheckDB.RecordCount) NEQ 0 AND (CheckDB.db) EQ 3>
<cfset client.dsn = "xxxxx_3">
<cfset client.cfcDIR = "cfcV5">
<cfset request.dsn = "xxxxx_3">
<cfset request.cfcDIR = "cfcV5">
<cfbreak/>
<cfelseif (CheckDB.RecordCount) NEQ 0 AND (CheckDB.db) EQ 4>
<cfset client.dsn = "xxxxx_4">
<cfset client.cfcDIR = "cfc">
<cfset request.dsn = "xxxxx_4">
<cfset request.cfcDIR = "cfc">
<cfbreak/>
<cfelseif (CheckDB.RecordCount) NEQ 0 AND (CheckDB.db) EQ 5>
<cfset client.dsn = "xxxxx_5">
<cfset client.cfcDIR = "cfcV5">
<cfset request.dsn = "xxxxx_5">
<cfset request.cfcDIR = "cfcV5">
<cfbreak/>
<cfelseif (CheckDB.RecordCount) NEQ 0 AND (CheckDB.db) EQ 6>
<cfset client.dsn = "xxxxx_6">
<cfset client.cfcDIR = "cfcV5">
<cfset request.dsn = "xxxxx_6">
<cfset request.cfcDIR = "cfcV5">
<cfbreak/>
<cfelse>
<cfset request.dsn = "xxxxx_1">
</cfif>
</cfloop>
</cfif>
</cfif>
因此,当 Application.cfm 获取设置的变量时,上面的代码可以正常工作。然而 request.dsn 并没有坚持下去,就好像我从来没有定义过它一样。为了安全起见,我在上面的代码中定义了两次变量。
这是 Application.cfm 文件的样子。
<cfapplication name="Appname-here"
sessionmanagement="yes"
clientstorage="cookie"
clientmanagement="Yes"
loginstorage="session"
scriptprotect="all"
sessionTimeout = #CreateTimeSpan(0, 0, 10, 0)#>
<cfswitch expression="#CGI.HTTP_HOST#">
<cfcase value="url.subdomain.here">
<cfif IsDefined("request.dsn")>
<cfset request.dsn = '#client.dsn#'>
</cfif>
<cfset request.cfcDIR = #client.cfcDIR#>
</cfcase>
<cfdefaultcase>
<cfset request.dsn = 'xxxxx_1'>
<cfset request.cfcDIR = cfcV5>
<cfdefaultcase>
</cfswitch>
因此,当用户转到定义用户页面登陆时,我收到一条错误消息,指出“请求中未定义元素 DSN”,这是胡说八道,因为正在定义。(Coldfusion 10)