Coldfusion - 添加列表参数未正确插入值
Coldfusion - add list param not correctly inserting value
我正在尝试执行以下操作:
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
This does work but using the array works in <cfqueryparam ..>
so I'm wondering why [addParam()
] doesn't exhibit the same
behavior
只有似乎有效。由于 cfqueryparam 需要一个字符串,因此 CF 会默默地将数组转换为字符串(即文字字符串 [Ljava.lang.String;@3a4b8277
)。因此,尽管查询成功执行,但该字符串显然不会匹配 "word" 列中的任何值。
IMO 使用 QueryExecute() 比 Query.cfc
简单。使用占位符 ?
应该可以解决问题。
注意,添加 "separator" 属性将列表分隔符更改为 space。
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 );
由于您使用的是 ColdFusion 10,因此您可以做的事情会受到限制。但是 split()
是一个 JAVA 函数,而不是 CF,因此它并没有真正创建拆分字符串的 CF 数组。它创建了一个 JAVA 数组,略有不同。您要做的是使用 CF 函数更改字符串的分隔符(“”)。我不认为 cfqueryparam
会将空字符串解释为字符串中的分隔符,除非您这样告诉它。
其次,当您 运行宁 Query()
时,它会变得有点奇怪。这将 运行 在它自己的上下文中而不是页面的上下文中。因此,如果您的 FROM word_list
指向页面前面的查询对象,您必须将该查询对象注入 Query()
[new Query ( word_list = word_list )
]。对于未来使用 CF11+ 的读者,您可以使用 QueryExecute()
.
更改 delims 后,您可以将该变量用作 addParam()
的 value
。或者更好的是,不用担心更改 delims,只需在 addParam()
中指定一个 separator=" "
参数即可。关于 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>
我无法保存我的 TryCF.com 代码,但您应该可以 copy/paste 和 运行 它。它的前半部分只是为 运行 最终查询创建一个假查询对象。如果 word_list
是数据源中的实际 table 并且这不是查询的查询,则可以忽略适用于 QoQ 的部分。我将我的 word_list
查询对象注入到 Query()
中,其他一切都非常标准。对于您的 cfqueryparam
或 addParam()
,我添加了 separator=" "
参数以使用 space
分隔符而不是逗号来处理您的原始字符串。我不知道您如何使用结果,但应该以 qryWordsResult.word
.
的格式提供给您
我正在尝试执行以下操作:
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
This does work but using the array works in
<cfqueryparam ..>
so I'm wondering why [addParam()
] doesn't exhibit the same behavior
只有似乎有效。由于 cfqueryparam 需要一个字符串,因此 CF 会默默地将数组转换为字符串(即文字字符串 [Ljava.lang.String;@3a4b8277
)。因此,尽管查询成功执行,但该字符串显然不会匹配 "word" 列中的任何值。
IMO 使用 QueryExecute() 比 Query.cfc
简单。使用占位符 ?
应该可以解决问题。
注意,添加 "separator" 属性将列表分隔符更改为 space。
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 );
由于您使用的是 ColdFusion 10,因此您可以做的事情会受到限制。但是 split()
是一个 JAVA 函数,而不是 CF,因此它并没有真正创建拆分字符串的 CF 数组。它创建了一个 JAVA 数组,略有不同。您要做的是使用 CF 函数更改字符串的分隔符(“”)。我不认为 cfqueryparam
会将空字符串解释为字符串中的分隔符,除非您这样告诉它。
其次,当您 运行宁 Query()
时,它会变得有点奇怪。这将 运行 在它自己的上下文中而不是页面的上下文中。因此,如果您的 FROM word_list
指向页面前面的查询对象,您必须将该查询对象注入 Query()
[new Query ( word_list = word_list )
]。对于未来使用 CF11+ 的读者,您可以使用 QueryExecute()
.
更改 delims 后,您可以将该变量用作 addParam()
的 value
。或者更好的是,不用担心更改 delims,只需在 addParam()
中指定一个 separator=" "
参数即可。关于 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>
我无法保存我的 TryCF.com 代码,但您应该可以 copy/paste 和 运行 它。它的前半部分只是为 运行 最终查询创建一个假查询对象。如果 word_list
是数据源中的实际 table 并且这不是查询的查询,则可以忽略适用于 QoQ 的部分。我将我的 word_list
查询对象注入到 Query()
中,其他一切都非常标准。对于您的 cfqueryparam
或 addParam()
,我添加了 separator=" "
参数以使用 space
分隔符而不是逗号来处理您的原始字符串。我不知道您如何使用结果,但应该以 qryWordsResult.word
.