目前,表单中有复选框,并且在提交表单时,所选复选框的值存储在数据库中。
<td><input type="Checkbox" name="valueList" value="Some value, with comma" >Some value, with comma</td>
<td><input type="Checkbox" name="valueList" value="Another Value, with comma" >Another value, with comma</td>
<td><input type="Checkbox" name="valueList" value="Yet another value" >Yet another value</td>
然而,问题在于逗号,因为当前逻辑使用列表来存储这些值。因此Some value, with comma
插入为Some value
和with comma
。使用以下内容创建当前列表:
<cfif isDefined("valueList")>
<cfset a=listlen(valueList)>
代码继续循环遍历列表。这是我在代码中找到的valueList
的唯一引用。有没有办法将此转换为数组而不会出现逗号问题?
答案 0 :(得分:9)
实际上 是一种将数据检索为数组的方法。如果您的enctype是application / x-www-form-urlencoded(默认的enctype),那么您只需要一行:
<cfset myArray = getPageContext().getRequest().getParameterValues('my_form_or_url_field_name')>
如果您的enctype是multipart / form-data(这是您在上传文件时使用的类型),那么事情就会复杂一些。这是我写的一个函数,它将返回form&amp;具有给定名称的url值作为数组,用于enctype:
<cffunction name="FormFieldAsArray" returntype="array" output="false" hint="Returns a Form/URL variable as an array.">
<cfargument name="fieldName" required="true" type="string" hint="Name of the Form or URL field" />
<cfset var tmpPartsArray = Form.getPartsArray() />
<cfset var returnArray = arrayNew(1) />
<cfset var tmpPart = 0 />
<cfset var tmpValueArray = "" >
<!--- if the getPartsArray method did not return NULL, then this is a multipart/form-data request, which must be handled as such. --->
<cfif IsDefined("tmpPartsArray")>
<cfloop array="#tmpPartsArray#" index="tmpPart">
<cfif tmpPart.isParam() AND tmpPart.getName() EQ arguments.fieldName>
<cfset arrayAppend(returnArray, tmpPart.getStringValue()) />
</cfif>
</cfloop>
</cfif>
<!--- Add the values that maybe on the URL with the same name, also if this *wasn't* a multipart/form-data request then
the above code did not get any of the data, and the method below will return all of it. --->
<cfset tmpValueArray = getPageContext().getRequest().getParameterValues(arguments.fieldName) />
<!--- that may have returned null, so need to test for it. --->
<cfif IsDefined("tmpValueArray")>
<cfloop array="#tmpValueArray#" index="tmpPart">
<cfset arrayAppend(returnArray, tmpPart) />
</cfloop>
</cfif>
<cfreturn returnArray />
</cffunction>
答案 1 :(得分:1)
我使用的模式是用逗号(〜)替换逗号(,),因为它根本没有在我们的域中使用,你可以使用你想要的任何字符。
<td><input type="Checkbox" name="valueList" value="Some value~ with comma" >Some value, with comma</td>
<td><input type="Checkbox" name="valueList" value="Another Value~ with comma" >Another value, with comma</td>
<td><input type="Checkbox" name="valueList" value="Yet another value" >Yet another value</td>
所以当表格结束时,它将如下:
form.valueList = "Some value~ with comma, Another Value~ with comma, Yet another value";
这是获取所需数组的代码:
<cfscript>
variables.myArrayList = ListToArray(form.valueList);
for(i=1; i LTE ArrayLen(variables.myArrayList); i=i+1)
{
variables.myArrayList[i] = ReplaceNoCase(variables.myArrayList[i],"~",",","all");
}
</cfscript>
答案 2 :(得分:1)
分隔符(在本例中为逗号)应该不存在于数据中,因为这几乎不可能识别一个元素的开始位置和另一个元素的结束位置。最好的解决方案是使用复选框value
使用其他内容。例如,如果描述来自数据库表,请使用数字记录ID而不是长文本描述。那么这将是一个非问题。