在结构中找不到qryname14411键

Jam*_*ler 1 coldfusion cfml

我有一个似乎与<cfscript>db操作相关的错误

// traffic tracking
myQry = new Query();
myQry.setSQL("INSERT INTO   dbo.Traffic (Circuit, Fuseaction, IP_hash) VALUES   (:circuit, :fuseaction, :ip_hash)");
myQry.addParam(name="circuit",      value="#listfirst(rc.fuseaction, '.')#",    cfsqltype="CF_SQL_VARCHAR");
myQry.addParam(name="fuseaction",   value="#listlast(rc.fuseaction, '.')#",     cfsqltype="CF_SQL_VARCHAR");
myQry.addParam(name="ip_hash",      value="#cgi.remote_addr#",                  cfsqltype="CF_SQL_VARCHAR");    
myQry.execute();
Run Code Online (Sandbox Code Playgroud)

真奇怪的是,看起来操作已经完成.这是一个什么样的错误?

在此输入图像描述

Pet*_*ton 8

简短回答:这可能是一个范围问题.尝试:

var myQry = new Query();
Run Code Online (Sandbox Code Playgroud)


啰嗦waffley回答:

我称之为Adobe开发人员无用的错误.

如果查看该文件的第460行,您将看到错误是由于StructFind无法在变量范围中查找查询名称,并且它出现在调试输入中的原因是因为有类型的try/catch周围的任何一个.通过替换基本CFML知识的try/catch,可以实现相同的功能,而不会导致/捕获错误<cfif StructKeyExists(variables,tagAttributes['name']) >,当然CF产品的开发人员应该知道!

CF10版本的base.cfc中仍然存在相同的代码,因此您可能或不想将其作为Adobe CF错误库中的错误提交- 尽管它们不太可能为CF9修复它(并且不确定它们是否会感觉到CF10是值得的努力).

然而,这只会是对不存在的变量问题的侧面解决,而不是解决为什么它实际上不存在的真正问题.鉴于调试信息显示查询成功执行,并且查询代码基本上在该行之上(从第442行开始),它不应该是重复/常见错误,但可能是由于您的myQry变量不是scoped,因此它可能会与另一个名为myQry的变量(甚至是对函数的单独调用中的相同var)发生冲突,这个变量在执行new Query().execute()行之间发生,从而导致原始查询不存在时StructFind寻找它.

解决方案是在第一次使用之前放置关键字varmyQry将它放在该函数的本地范围内 - 应该对所有仅在函数实例中使用的变量进行操作(否则它们放在函数存在于其中的组件/请求的变量范围.