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

Coldfusion-添加列表参数未正确插入值,coldfusion,coldfusion-10,cfml,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(

我正在努力做到以下几点:

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
但是如果我使用标签和

这是可行的,但是在
中使用数组是可行的,所以我想知道为什么[
addParam()
]没有表现出相同的效果 行为

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

IMO使用比
查询更简单。cfc
。使用占位符
,应该可以做到这一点

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


由于您使用的是ColdFusion 10,因此您的操作将受到限制。但是
split()
是一个JAVA函数,而不是CF,因此它不会真正为您的拆分字符串创建CF数组。它创建一个JAVA数组,这与此略有不同。您要做的是使用CF函数更改字符串的分隔符(即“”)我不认为
cfqueryparam
会将空字符串解释为字符串中的分隔符,除非您告诉它

其次,当您运行
Query()
时,它会变得有点奇怪。它将在自己的上下文中运行,而不是在页面的上下文中运行。因此,如果word\u列表中的
指向页面前面的查询对象,您必须将该查询对象注入
Query()
[
新查询(word\u列表=word\u列表)
]。对于将来使用CF11+的读者,您可以使用
QueryExecute()

更改delims后,您可以将该变量用作
addParam()
值。或者更好的是,不用担心更改delims,只需在
addParam()
中指定一个
分隔符=“
参数。关于
cfqueryparam
参数和使用
list=“true”的另一个注意事项
根据您的数据类型,它会发挥一些神奇的作用,比如如果它是varchar类型,就引用您的值。非常酷的东西

无论如何:

<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>

/**********模拟表**********/
word\u list=queryNew(
“id,word”,
“整数,varchar”,
[
{“id”:1,“word”:“notit”},
{“id”:2,“word”:“set”},
{“id”:3,“word”:“notit”},
{“id”:4,“单词”:“of”},
{“id”:5,“word”:“notit”},
{“id”:6,“单词”:“notitsome”},
{“id”:7,“word”:“notit”},
{“id”:8,“word”:“some”},
{“id”:9,“word”:“words”}
]
) ;
/**********模拟表**********/
//writeDump(单词列表);
句子=“一些单词”;
words=句子;//列表更改delims(句子,,,);
///如果使用CF11+,请使用QueryExecute()而不是new Query()
qryWords=newquery(word\u list=word\u list);///QoQ对象被注入Query.cfc
克里沃兹
.setSQL(“从单词所在的单词列表中选择单词(:wordsToCheck)”)
.setDBType(“query”)///仅用于查询的查询。
//.setDatasource(“myDSN”)
.addParam(name=“wordsToCheck”,value=words,CFSQLTYPE=“CF_SQL\u VARCHAR”,list=“true”,separator=”“);
qryWordsResult=qryWords.execute().getResult();
书面记录(qryWordsResult);

我无法保存我的TryCF.com代码,但你应该可以复制/粘贴并运行它。前半部分只是创建一个伪查询对象来运行最终查询。如果
word\u list
是数据源中的一个实际表,而这不是查询,你可以忽略应用于QoQ的部分。我插入了
word_list
将对象查询到
query()
,其他一切都非常标准。对于您的
cfqueryparam
addParam()
,我添加了
分隔符=“”
参数,用
空格
分隔符而不是逗号处理原始字符串。我不知道如何使用结果,但这应该以
qryWordsResult的格式提供给您。word
word\u列表
查询的表或查询对象吗?我想
QueryExecute()
是在CF11中引入的。这会更好,但我认为它不能在CF10中使用。(更新)True。我忽略了CF10标记;-)在这种情况下,我会对Query()尝试相同的位置占位符方法看看它是否有效。如果无效,我将转而构建动态字符串。
占位符与命名参数有何不同?占位符不是简单地指示使用传递参数的顺序吗?还是它也做了其他事情?(更新)离开我的脑袋!:-P我只是在想同样的事情…实际上这里没有任何区别。我只是重新测试(以你的新例子为基础)在我之前的测试中,这一定是一个错误,因为它的工作原理是一样的。啊,很好的捕获。出于某种原因,我认为命名参数在这里不起作用,但我只是重新测试了,它们起作用了。命名参数更清楚!这是一个有趣的案例,在CF2018中添加了正式命名的参数,但技术上有一些功能ns已经接受了命名参数。:-)哎呀,谢谢你的拼写检查。我想知道为什么拼写错误会出现在TryCF上,但是当我看到我运行的内容时,我就在那里拼写出来了。:-SHeh..我知道这种感觉。我注意到它只是因为我运行代码试图找出命名参数为什么对你有效,而不是在我以前的代码中。我一定是我自己的打字错误;-)不知道你在说什么
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 );    
<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>