我有一个数据库表,其中包含错误ID和表单验证错误的错误详细信息。 在我的ColdFusion表单页面中,我有一个错误号2,4,7列表。但我想显示“请输入姓名”等错误。
我想将我的错误列表与数据库表中的错误ID进行比较,并在表单中显示相应的错误。如果有更好的方法,请告诉我。在此先感谢!!
<form name = "empform" action="empform.cfm" method="post">
<cfoutput>
<table border="0">
<tr><td colspan="4" align="center" style="padding-bottom:20px;"><h2>Add Employee</h2></td></tr>
<cfif (structKeyExists(rc,"addemp"))>
<cfif rc.result.hasErrors()>
<tr>
<td colspan="4" style="border:2px solid red;">
Please review the following:
<ul>
<cfloop array="#rc.result.getFailureMessages()#" index="message">
<li>#message#</li>
</cfloop>
</ul>
</td>
</tr>
</cfif>
</cfif>
<cfset myArray = rc.result.getFailureMessages()>
<cfset myList = ArrayToList(myArray, ",")>
<cfquery name="qErrorMessages" datasource="#dsn#" >
Select * from ErrorMessages
</cfquery>
<tr>
<td><label><b>Emp Last Name</b></label></td>
<td><input name="lastname" type="text" value="" /></td>
<td><label><b>First Name</b></label></td>
<td><input name="FirstName" type="text" value="" /></td>
</tr>
<tr>
<td><label><b> Emp Birth Date</b></label></td>
<td><input name="birthdate" type="text" value="" /></td>
<td><label><b>Salary</b></label></td>
<td><input name="salary" type="text" value="" /></td>
</tr>
<tr><td style="padding-top:10px;">
<input type="submit" name = "addemp" value ="AddEmp /></td>
</tr>
</table>
</cfoutput>
</form>
我可以显示如上所示的错误
现在我想显示实际的消息。我被困在这里。
我的问题没有解决。我只能循环遍历错误表。可能我需要遍历我的错误ID列表然后我需要另一个循环来查找表errorId匹配然后显示错误。
我用以下代码修复了它。
<cfloop index="ind" list=#mylist#>
<cfquery datasource= "#dsn#" name="emperrors">
Select errorid,errmessage from errorcodes where errorid = #ind#
</cfquery>
#emperrors.errmessage#<br>
</cfloop>
答案 0 :(得分:0)
你的问题很简短,但是我可能会查询表中的错误消息,将其转换为结构,然后将该结构放入一个持久的作用域,然后我可以参考。
类似的东西:
<cfset errorStruct={}>
<cfloop query="qFormErrorMsgs">
<cfset errorStruct[error_id]=error_msg>
</cfloop>
<cfset application.errorStruct=errorStruct>
然后,当您想要显示错误时:
<p>Please fix the following error: #application.errorStruct[variables.error_id]#</p>
但这只是你可能做到的一种方式。如果您的问题没有更多信息,那么您将会猜到(如果您很幸运的话)。
答案 1 :(得分:0)
好的,您的答案详细说明代码应该通过编辑附加到您的问题中,但仍然没有足够的代码。你是如何确定错误的?
听起来你的错误是这样的:
请查看以下内容:
当你想要的是错误信息时。
更新此方法的一种简单方法是将所有邮件加载到索引与错误代码对应的数组中。
<cfset ErrDetails=ArrayNew()>
<cfset ErrDetails[1]="You didn't enter your first name.">
<cfset ErrDetails[2]="You didn't enter your last name.">
<cfset ErrDetails[3]="You didn't enter a properly formatted birth date.">
<cfset ErrDetails[4]="It appears, from your birthdate, that your age is below 18">
然后,在你的cfloop中,你可以
<cfloop array="#rc.result.getFailureMessages()#" index="message">
<li>#ErrDetails[message]#</li>
</cfloop>
最后,听起来您的错误代码/消息来自数据库。我不确定这是否必要,但如果你真的想保持这种状态,那很好。您可以将其初始化为应用程序范围,以便以后可以在不重新运行查询的情况下调用它,或者只是将其放在平面文本中的某个位置。但是,如果您想要应用程序范围答案,这是一个方法。
<cflock scope="application" timeout="5">
<cfif not isDefined("application.ErrDetails")>
<cfquery name="getec">
select ErrID,ErrMessage from ErrorCodes
</cfquery>
<cfset Application.ErrDetails = []>
<cfloop query="getec">
<cfset Application.ErrDetails[ErrID]=ErrMessage>
</cfloop>
</cfif>
<cfset request.ErrDetails = Application.ErrDetails>
</cflock>
启动后,如上所示,显示错误的cfloop可以使用#request.errDetails[message]#
如果它只是在一个页面中运行,我不担心创建一个应用程序变量。我只是对其进行硬编码,或者使用cfloop进行查询,类似于上面写入变量范围变量,而不是应用程序变量,因此不需要cflock。
除非您还有基于Web的管理员创建这些规则,否则我可能会完全放弃该表并将其直接放入代码,cfinclude,udf或自定义标记中。
答案 2 :(得分:0)
因为提问者已经用答案更新了他们的问题。
你的答案不必要地重复每次迭代的查询。
尝试这样的事情......
<cfquery datasource="#dsn#" name="GetECs">
select ErrorID,ErrMessage from ErrorCodes
where ErrorID in (<cfqueryparam cfsqltype="cf_sql_integer" list="yes" value="#mylist#">)
</cfquery>
<cfoutput query="GetECs">
#currentrow#. #ErrMessage#<br>
</cfoutput>
注意:
where ErrorID in (<cfqueryparam cfsqltype="cf_sql_integer" list="yes" value="#mylist#">)
与说where ErrorID in (#mylist#)
相同。但是,标记会保护您的查询不受SQL注入(修改变量以在查询中产生不良/恶意结果的策略。请阅读http://help.adobe.com/livedocs/coldfusion/8/htmldocs/help.html?content=Tags_p-q_18.html上的cfqueryparam