如何在listQualify函数中转义逗号?

时间:2015-03-12 14:50:00

标签: sql coldfusion

我是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'这样我以后可以将这些值插入到新表中。

插入代码:

<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 multiple name="cCompanyList2" id="cCompanyList2" class="selectCCompany" data-attribute="selCCompany" size="10">
  <cfloop query="childCompanyList"> 
    <option value="#childCompanyList.ChildCompany#">#childCompanyList.Company#</option> 
  </cfloop> 
</select>

无论如何都要解决这个问题。

2 个答案:

答案 0 :(得分:5)

您应该使用cfqueryparam标记的“list”属性,而不是手动构建SQL“in”子句。

http://www.bennadel.com/blog/425-coldfusion-cfqueryparam-list-attribute-is-sweeet.htm

<cfqueryparam value="#myList#" list="yes"> 

现在,这并不能解决您的核心问题,即您有一个以逗号分隔的列表,其中值本身可能包含逗号。

不幸的是,ColdFusion不允许在列表值中转义列表分隔符,这是在CFML中使用列表的主要缺点。通常答案是简单地使用您确定不会出现在数据中的不同分隔符,但由于您正在处理多选表单字段的方式,因此默认分隔符是逗号。

所以现在,我们唯一的选择是确保值永远不会有真正的逗号。第一个建议是不使用公司名称,而是使用数据库ID(如int或GUID)作为下拉值。 (在数据库中使用生成而不是自然键还有其他原因)。

如果数据库中没有该选项,则需要对选择值进行编码。这可能是任何东西 - 一个简单的替换语句,甚至类似base 64编码的东西都会清除逗号的公司名称,但是将它保留在服务器端可以反转为原始字符串的状态。

请记住,这种“编码”方法将禁止在cfqueryparam中使用“list”参数,因为每个列表项都需要解析并单独还原为其原始形式。您基本上需要在列表上手动迭代,解码每个值,并构建“in”子句或在解码之前更改列表分隔符。

我真的,真的会建议在数据库中使用整数ID作为主键,因为它确实让你的生活更轻松(并提高了索引扫描的性能)。请为孩子们做。

最后注意:如果您使用的是ColdFusion 10或更高版本,则可以在Application.cfc中设置 this.sameformfieldsasarray = true; ,它会对整个List分隔符问题进行一步。如果使用不同的分隔符将数组转换为列表,您仍然可以使用cfqueryparam的“list”属性

<cfqueryparam value="#arrayToList( myArray, '~' )#" list="yes" separator="~"> 

http://www.raymondcamden.com/2012/06/19/ColdFusion-10-Missing-Feature-Form-Fields-and-Arrays

答案 1 :(得分:0)

我使用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属性将识别列表未以分号分隔并在数据库中添加元素。