首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coldfusion -添加列表参数不能正确插入值

Coldfusion -添加列表参数不能正确插入值
EN

Stack Overflow用户
提问于 2019-03-07 15:04:09
回答 2查看 458关注 0票数 2

我想做以下几件事:

代码语言:javascript
复制
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时,它显示

代码语言:javascript
复制
SQLPARAMETERS   
array
1   [Ljava.lang.String;@3a4b8277

但是,如果我使用标记和<cfqueryparam ...做同样的事情,那么产生的转储是

代码语言:javascript
复制
SQLPARAMETERS   
array
1   words
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-07 17:05:28

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

似乎只起作用了。由于cfqueryparam需要字符串,CF将数组静默地转换为字符串(即文字字符串[Ljava.lang.String;@3a4b8277)。因此,尽管查询成功执行,但该字符串显然与"word“列中的任何值不匹配。

使用QueryExecute()Query.cfc更简单。使用占位符?应该可以做到这一点。

注意,添加“分隔符”属性可将列表分隔符更改为空格。

代码语言:javascript
复制
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 );    
票数 3
EN

Stack Overflow用户

发布于 2019-03-07 17:31:25

由于您使用的是ColdFusion 10,所以您所能做的将受到限制。但是split()是一个JAVA函数,而不是CF,所以它并不真正创建拆分字符串的CF数组。它创建了一个JAVA数组,这略有不同。您想要做的是使用CF函数来更改字符串(即“")的分隔符。除非告诉您,否则cfqueryparam不会将空字符串解释为字符串中的分隔符。

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

更改分隔符后,只需将该变量用作addParam()addParam()。或者更好的是,不要担心更改分隔符,只需在separator=" "中指定一个addParam()参数即可。关于cfqueryparam参数和使用list="true"的另一个注意事项是,它将根据您的数据类型产生一定的魔力,例如,如果它是varchar类型,则引用您的值。很酷的东西。

总之:

代码语言:javascript
复制
<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>

我无法保存我的TryCF.com代码,但是您应该能够复制/粘贴并运行它。它的前半部分只是创建一个假查询对象来运行最终的查询。如果word_list是数据源中的实际表,并且这不是查询的查询,则可以忽略应用于QoQ的部分。我将我的word_list查询对象注入到Query()中,其他一切都是非常标准的。对于cfqueryparamaddParam(),我添加了separator=" "参数来处理原始字符串,使用space分隔符而不是逗号。我不知道您如何使用结果,但这应该以qryWordsResult.word的格式提供给您。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55046909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档