在cfc中使用通过AJAX接收的参数执行cfquery
executing cfquery in cfc with parameters received via AJAX
我正试图建立一个系统,让我从我的JavaScript代码从我的ColdFusion数据库获取数据。然而,我遇到了一个错误,我不确定是什么导致它。我是CF的新手,我运行的引擎是ColdFusion MX 7。
CFC文件,cfquery.cfc
:
<cfcomponent output="no">
<cffunction name="phonebookQuery" access="remote" returnType="struct">
<cfargument name="select" type="string" required="yes">
<cfargument name="from" type="string" required="yes">
<cfargument name="where" type="string" required="yes">
<cfargument name="orderBy" type="string" required="yes">
<cfquery name="query" datasource="phonebook">
SELECT #select#
FROM #from#
WHERE #where#
ORDER BY #orderBy#
</cfquery>
<cfreturn query>
</cffunction>
</cfcomponent>
我可能没有正确返回东西,但我的代码在执行中没有得到那么远,我无法发现。
这是执行AJAX调用的JS函数。我知道我不应该使用async: false
,但我只是需要一些暂时有效的东西。我计划实现承诺或回调,一旦我得到它的工作。
function cfQuery(p){
var result;
var queryStr= "cfquery.cfc?method=phonebookQuery&" +
"select="+p.select+"&"+
"from="+p.from+"&"+
"where="+p.where.replace("=","%3D")+"&"+
"orderBy="+p.orderBy;
$.get( queryStr, function(data){
result=data;
});
return result;
}
我试图开始工作的函数调用的具体示例是:
var query_result= cfQuery({
select: "*",
from: "shareloantypes",
where: "share_loan='S'",
orderBy: "share_loan_type"
});
当我尝试运行代码时,我得到一个内部服务器错误。它抱怨SQL中where子句附近的语法:
Error Executing Database Query.
[Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][ODBC SQL Server Driver][SQL Server]
Line 1: Incorrect syntax near 'S'.
The error occurred in C:'Inetpub'wwwroot'xxxxxx'report'cfquery.cfc: line 12
10 : FROM #from#
11 : WHERE #where#
12 : ORDER BY #orderBy#
13 : </cfquery>
14 : <cfreturn query>
SQL SELECT * FROM shareloantypes WHERE share_loan=''S'' ORDER BY share_loan_type
DATASOURCE phonebook
VENDORERRORCODE 170
SQLSTATE 42000
你可以看到我的"S"被"S"取代了。我该如何解决这个问题?,如果我在函数调用中用where: "share_loan=S"
替换where: "share_loan='S'"
,那么生成的SQL根本没有引号,而不是每侧2,我得到"无效列名"。
试一试:
<cfquery name="query" datasource="phonebook">
SELECT '#select#'
FROM '#from#'
WHERE '#where#'
ORDER BY '#orderBy#'
</cfquery>
根据我的研究,在变量周围加上引号告诉coldfusion它应该以类似sql的方式处理这些值。也就是说,它不会转义您提供给它的引号(或者更准确地说,它会智能地转义它们)。
此外,根据我的个人经验,它还可以阻止SQL注入(您的代码目前是开放的)。实际上有冷融合准备语句存在,但我认为这是构造它们的一种简写方法,仍然可以防止注入。如果有人确切地知道其他情况,并且可以提供一个使用这种技术的注入示例,请纠正我。
Edit:再次查看您的代码,这可能工作,也可能不工作。根据我的个人经验,我只是传递变量值,而不是构造查询本身。如果可以的话,试着写一些像
<cfquery name="query" datasource="phonebook">
SELECT *
FROM mytable
WHERE ID > '#minID#'
ORDER BY ID DESC
</cfquery>
在本例中,您只是传递了要比较的值,而不是实际构建整个WHERE
子句。
编辑:当我不完全相信它不容易受到SQL注入时,我不能凭良心把这段代码留在这里。执行我发布的第二个查询(只有where子句具有变量的查询)的正确方法如下:
<cfquery name="query" datasource="phonebook">
SELECT *
FROM mytable
WHERE ID > <cfqueryparam value="#minID#" CFSQLType="CF_SQL_INTEGER">
ORDER BY ID DESC
</cfquery>
您可以在这里阅读更多关于cfqueryparam
的信息:http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f6f.html
- 函数参数中的数据与指定变量之间的任何性能差异
- 使用Express捕获参数
- 参数变量出现ngTable指令问题
- AngularJS:我可以跳过函数参数回调吗
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 要求未定义JS回调参数
- 我的jQuery插件参数没有正确启动,遇到了问题
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- jquery设置为使用参数运行
- Javascript”;类“;带有参数的扩展
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 函数未将值作为参数传递
- 如何将参数传递到angularJs中的工厂
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- MVC 3页面导航和使用javascript传递参数
- 从查询字符串参数推断出正确的数据类型
- 传递包含'%的参数'在URL中
- 为什么不'我们在javascript中使用函数参数的数据类型
- 在cfc中使用通过AJAX接收的参数执行cfquery