如何转义 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属性会识别列表不是以分号分隔,并添加数据库中的元素。