我不确定我是否做错了什么,但如果你用CFScript写的话,似乎你不能在一个查询中多次使用cfqueryparam。
此行为与CFML不一致。我刚刚从CFML重写了一个类似的查询到CFScript,我收到以下错误:cfsqlparam 'id' is not defined
local.query = new Query();
local.query.setSql("
SELECT id
FROM myTable
WHERE myTable.id = :id OR myTable.parentId = :id
");
local.query.addParam(name="id", cfsqltype="CF_SQL_INTEGER", value=arguments.id, maxlength=10);
local.query.execute().getResult();
如果我取出OR myTable.parentId = :id
,它的效果非常好。我是否必须为我打算使用的每个位置创建一个参数?
答案 0 :(得分:7)
如果是CFQuery,那么每个值都有一个cfqueryparam:
where myTable.id = <cfqueryparam... value="#arguments.id#" />
or myTable.parentid = <cfqueryparam ... value="#arguments.id#" />
所以我猜你需要在脚本中做同样的事情:
local.query.setSql("
SELECT id
FROM myTable
WHERE myTable.id = :id OR myTable.parentId = :pid ");
local.query.addParam(name="id", cfsqltype="CF_SQL_INTEGER",value=arguments.id,maxlength=10);
local.query.addParam(name="pid",cfsqltype="CF_SQL_INTEGER",value=arguments.id,maxlength=10);
关于“为什么一个addParam不能解决占位符问题”的问题我猜测它归结为ColdFusion如何解析查询 - 因为你指定了两个param占位符,解析器可能希望找到两个params定义。