如何转义 listQualify 函数中的逗号?
How can I escape commas inside listQualify function?
我是 coldfusion 的新手。我需要一些帮助。
我的数据库中有这样的公司名称记录:abc, Inc.
现在我正在使用这个查询:
SELECT DISTINCT COMPANY FROM ComapanyTable WHERE (Company IN
(#ListQualify(form.cCompanyList2, "'", ",")#))
这个问题是它将 abc, Inc. 分开
SELECT DISTINCT Company FROM CompanyTableWHERE (Company IN ('abc','
Inc.','xyz','Inc.'))
我需要按原样获取列表,即:'abc, Inc.'、'xyz, Inc' 以便我稍后可以将这些值插入到新的 table.
插入代码:
<cfquery name="insertPair" datasource="#DSN#" dbtype="ODBC">
INSERT INTO tblChildCompanyToParent (ParentAccountID, ChildCompany)
SELECT DISTINCT
<cfqueryparam value = "#form.pCompanyList#" CFSQLType = "CF_SQL_VARCHAR">, Company
FROM CompanyTable
WHERE Company IN
(<cfqueryparam value="#ValueList(insertSelect.Company,';' )#" CFSQLType = "CF_SQL_VARCHAR" list="true" separator=";">)
</cfquery>
Select 列表代码
<select multiple name="cCompanyList2" id="cCompanyList2" class="selectCCompany" data-attribute="selCCompany" size="10">
<cfloop query="childCompanyList">
<option value="#childCompanyList.ChildCompany#">#childCompanyList.Company#</option>
</cfloop>
</select>
有没有办法解决这个问题。
与其手动构建 SQL "in" 子句,不如使用 cfqueryparam 标记的 "list" 属性。
http://www.bennadel.com/blog/425-coldfusion-cfqueryparam-list-attribute-is-sweeet.htm
<cfqueryparam value="#myList#" list="yes">
现在,这并不能解决您的核心问题,即您有一个 comma-delimited 列表,其中值本身可能包含逗号。
不幸的是,ColdFusion 不允许在列表值内转义列表定界符,这是在 CFML 中使用列表的主要缺点。通常,答案是简单地使用您确定不会出现在数据中的不同分隔符,但由于您正在处理如何 multi-select 表单字段,默认分隔符是逗号。
所以现在,我们唯一的选择是确保值中永远不会有真正的逗号。第一个建议是不要使用公司名称,而是使用数据库 ID(例如 int 或 GUID)作为下拉值。 (在数据库中使用生成键而不是自然键还有其他原因)。
如果您的数据库中没有该选项,则需要对 select 值进行编码。这可以是任何东西——一个简单的替换语句,甚至像 base 64 编码之类的东西都会清除公司名称中的逗号,但将其保留在可以在服务器端恢复为原始字符串的状态。
请记住,此 "encoding" 方法将不允许在 cfqueryparam 中使用 "list" 参数,因为每个列表项都需要解析并单独恢复为原始形式。您基本上需要手动遍历列表,解码每个值,并构建 "in" 子句或在解码之前更改列表分隔符。
我真的非常推荐在数据库中使用整数 ID 作为主键,因为它确实让您的生活更轻松(并提高了索引扫描的性能)。请为 children.
做这件事
最后说明:如果您使用的是 ColdFusion 10 或更高版本,则可以在 Application.cfc 中设置 this.sameformfieldsasarray=true; 其中 side-steps 整个列表分隔符问题。如果您使用不同的定界符将数组转换为列表,您仍然可以使用 cfqueryparam 的 "list" 属性
<cfqueryparam value="#arrayToList( myArray, '~' )#" list="yes" separator="~">
http://www.raymondcamden.com/2012/06/19/ColdFusion-10-Missing-Feature-Form-Fields-and-Arrays
我使用 javascript 和 jquery
修复了它
我将所选值添加到空数组
var companyArray= [];
$('#Company option').each(function() {
companyArray.push($(this).val());
});
var theJoin = companyArray.join(';');
//added it to an hidden input
document.getElementById('hiddenInput').value = theJoin;
//Delete the first semicolon that gets added before the first element
theJoin.slice(1);
然后对插入查询进行这些更改
<cfquery name="insertPair" datasource="#DSN#" dbtype="ODBC">
INSERT INTO tblChildCompanyToParent (Parent_Account_ID, Child_Account_ID)
SELECT DISTINCT
<cfqueryparam value = "#form.pCompanyList#" CFSQLType = "CF_SQL_VARCHAR">, Company
FROM tblUser
WHERE Company IN
(<cfqueryparam value="#form.hiddenInput#" CFSQLType = "CF_SQL_VARCHAR" list="true" separator=";">)
</cfquery>
它会在表单中找到隐藏输入中的值,然后将它们插入到数据库中。 cfqueryparam中的separator属性会识别列表不是以分号分隔,并添加数据库中的元素。
我是 coldfusion 的新手。我需要一些帮助。 我的数据库中有这样的公司名称记录:abc, Inc. 现在我正在使用这个查询:
SELECT DISTINCT COMPANY FROM ComapanyTable WHERE (Company IN
(#ListQualify(form.cCompanyList2, "'", ",")#))
这个问题是它将 abc, Inc. 分开
SELECT DISTINCT Company FROM CompanyTableWHERE (Company IN ('abc','
Inc.','xyz','Inc.'))
我需要按原样获取列表,即:'abc, Inc.'、'xyz, Inc' 以便我稍后可以将这些值插入到新的 table.
插入代码:
<cfquery name="insertPair" datasource="#DSN#" dbtype="ODBC">
INSERT INTO tblChildCompanyToParent (ParentAccountID, ChildCompany)
SELECT DISTINCT
<cfqueryparam value = "#form.pCompanyList#" CFSQLType = "CF_SQL_VARCHAR">, Company
FROM CompanyTable
WHERE Company IN
(<cfqueryparam value="#ValueList(insertSelect.Company,';' )#" CFSQLType = "CF_SQL_VARCHAR" list="true" separator=";">)
</cfquery>
Select 列表代码
<select multiple name="cCompanyList2" id="cCompanyList2" class="selectCCompany" data-attribute="selCCompany" size="10">
<cfloop query="childCompanyList">
<option value="#childCompanyList.ChildCompany#">#childCompanyList.Company#</option>
</cfloop>
</select>
有没有办法解决这个问题。
与其手动构建 SQL "in" 子句,不如使用 cfqueryparam 标记的 "list" 属性。
http://www.bennadel.com/blog/425-coldfusion-cfqueryparam-list-attribute-is-sweeet.htm
<cfqueryparam value="#myList#" list="yes">
现在,这并不能解决您的核心问题,即您有一个 comma-delimited 列表,其中值本身可能包含逗号。
不幸的是,ColdFusion 不允许在列表值内转义列表定界符,这是在 CFML 中使用列表的主要缺点。通常,答案是简单地使用您确定不会出现在数据中的不同分隔符,但由于您正在处理如何 multi-select 表单字段,默认分隔符是逗号。
所以现在,我们唯一的选择是确保值中永远不会有真正的逗号。第一个建议是不要使用公司名称,而是使用数据库 ID(例如 int 或 GUID)作为下拉值。 (在数据库中使用生成键而不是自然键还有其他原因)。
如果您的数据库中没有该选项,则需要对 select 值进行编码。这可以是任何东西——一个简单的替换语句,甚至像 base 64 编码之类的东西都会清除公司名称中的逗号,但将其保留在可以在服务器端恢复为原始字符串的状态。
请记住,此 "encoding" 方法将不允许在 cfqueryparam 中使用 "list" 参数,因为每个列表项都需要解析并单独恢复为原始形式。您基本上需要手动遍历列表,解码每个值,并构建 "in" 子句或在解码之前更改列表分隔符。
我真的非常推荐在数据库中使用整数 ID 作为主键,因为它确实让您的生活更轻松(并提高了索引扫描的性能)。请为 children.
做这件事最后说明:如果您使用的是 ColdFusion 10 或更高版本,则可以在 Application.cfc 中设置 this.sameformfieldsasarray=true; 其中 side-steps 整个列表分隔符问题。如果您使用不同的定界符将数组转换为列表,您仍然可以使用 cfqueryparam 的 "list" 属性
<cfqueryparam value="#arrayToList( myArray, '~' )#" list="yes" separator="~">
http://www.raymondcamden.com/2012/06/19/ColdFusion-10-Missing-Feature-Form-Fields-and-Arrays
我使用 javascript 和 jquery
修复了它我将所选值添加到空数组
var companyArray= [];
$('#Company option').each(function() {
companyArray.push($(this).val());
});
var theJoin = companyArray.join(';');
//added it to an hidden input
document.getElementById('hiddenInput').value = theJoin;
//Delete the first semicolon that gets added before the first element
theJoin.slice(1);
然后对插入查询进行这些更改
<cfquery name="insertPair" datasource="#DSN#" dbtype="ODBC">
INSERT INTO tblChildCompanyToParent (Parent_Account_ID, Child_Account_ID)
SELECT DISTINCT
<cfqueryparam value = "#form.pCompanyList#" CFSQLType = "CF_SQL_VARCHAR">, Company
FROM tblUser
WHERE Company IN
(<cfqueryparam value="#form.hiddenInput#" CFSQLType = "CF_SQL_VARCHAR" list="true" separator=";">)
</cfquery>
它会在表单中找到隐藏输入中的值,然后将它们插入到数据库中。 cfqueryparam中的separator属性会识别列表不是以分号分隔,并添加数据库中的元素。