Coldfusion-添加列表参数未正确插入值

时间:2019-03-07 15:04:10

标签: coldfusion coldfusion-10 cfml

我正在尝试执行以下操作:

sentence = "some set of words";
words = sentence .split(" "); 
qryWords = new Query();
qryWords .setSQL("
    SELECT    
        [word]

    FROM 
        [word_list]

    WHERE
        [word] IN ( :wordsToCheck )
");

qryWords.addParam( name="wordsToCheck", value = words, CFSQLTYPE="CF_SQL_VARCHAR", list="true" );
qryWordsResult = qryWords.execute();

我得到0个结果,但没有错误,我希望有结果(并且我已经通过用静态字符串替换sql参数来检查了结果)。奇怪的是,当我转储qryWordsResult时,它显示

SQLPARAMETERS   
array
1   [Ljava.lang.String;@3a4b8277

但是,如果我使用标签和<cfqueryparam ...来做同样的事情,则结果转储为

SQLPARAMETERS   
array
1   words

2 个答案:

答案 0 :(得分:3)

  

这确实有效,但是使用数组在<cfqueryparam ..>中有效,所以我想知道为什么[addParam()]不能显示相同的内容   行为

只有出现才能正常工作。由于cfqueryparam需要一个字符串,因此CF会静默将数组转换为字符串(即文字字符串[Ljava.lang.String;@3a4b8277)。因此,尽管查询成功执行,但该字符串显然与“ word”列中的任何值都不匹配。

使用QueryExecute()

IMO比Query.cfc更简单。使用占位符?应该可以解决问题。

请注意,添加了“ separator”属性以将列表定界符更改为空格。

result = queryExecute(
 " SELECT [word] FROM   [word_list] WHERE  [word] IN ( ? )"
 , [ { value="some set of words"
      , cfsqltype="cf_sql_varchar"
      , list=true
      , separator=" " } 
   ]
 , {datasource="YourDataSource"}
);
writeDump( result );    

答案 1 :(得分:3)

由于您使用的是ColdFusion 10,因此您的工作将受到限制。但是split()是JAVA函数,而不是CF,因此它实际上并不会为您的分割字符串创建CF数组。它创建一个JAVA数组,该数组略有不同。您要做的是使用CF函数来更改字符串的定界符(即“”)。我不认为cfqueryparam会将空字符串解释为字符串中的定界符,除非您这样说。

第二,当您运行Query()时,它有点奇怪。那将在它自己的上下文中运行,而不是在页面上下文中运行。因此,如果您的FROM word_list指向页面前面的查询对象,则必须将该查询对象注入Query() [new Query ( word_list = word_list )]中。对于将来使用CF11 +的读者,您可以使用QueryExecute()

更改delims之后,您可以仅将该变量用作value的{​​{1}}。甚至更好的是,不必担心更改delims,只需在addParam()中指定一个separator=" "参数即可。关于addParam()参数和使用cfqueryparam的另一个注意事项是,它将根据您的数据类型做一些魔术,例如如果是varchar类型则引用您的值。很酷的东西。

无论如何:

list="true"

我无法保存我的TryCF.com代码,但是您应该能够复制/粘贴并运行它。它的前半部分只是创建一个假查询对象以对其执行最终查询。如果<cfscript> /**********SIMULATED TABLE**********/ word_list = queryNew( "id, word", "integer, varchar", [ { "id": 1, "word": "notit" } , { "id": 2, "word": "set" } , { "id": 3, "word": "notit" } , { "id": 4, "word": "of" } , { "id": 5, "word": "notit" } , { "id": 6, "word": "notitsome" } , { "id": 7, "word": "notit" } , { "id": 8, "word": "some" } , { "id": 9, "word": "words" } ] ) ; /**********SIMULATED TABLE**********/ //writeDump(word_list) ; sentence = "some set of words"; words = sentence; //listChangeDelims(sentence, ",", " ") ; /// If using CF11+, use QueryExecute() instead of new Query() qryWords = new Query( word_list = word_list ) ; /// The QoQ object is injected into Query.cfc qryWords .setSQL("SELECT word FROM word_list WHERE word IN ( :wordsToCheck )") .setDBType("query") /// Just for Query Of Query. //.setDatasource("myDSN") .addParam( name="wordsToCheck", value=words, CFSQLTYPE="CF_SQL_VARCHAR", list="true", separator=" ") ; qryWordsResult = qryWords.execute().getResult() ; writeDump(qryWordsResult) ; </cfscript> 是数据源中的实际表,并且它不是查询查询,则可以忽略适用于QoQ的部分。我将word_list查询对象注入到word_list中,其他所有内容都很标准。对于您的Query()cfqueryparam,我添加了addParam()参数以使用separator=" "定界符而不是逗号来处理原始字符串。我不知道您如何使用结果,但这应该以{{1​​}}的格式给您。