我正在尝试保护此代码,但每次添加cfqueryparam标记时都会出现有关参数绑定的错误。我确定我将cfsqltype
属性设置为正确的值。最后一个选择语句是所有地狱都松散的地方。
<CFQUERY name="getLatestSurveyID" datasource="#REQUEST.dsn#">
SELECT TOP 1
SurveyID
FROM
TUser_WelcomeHome
ORDER BY
SurveyID DESC
</CFQUERY>
<!--- Throw the Reasons/Subreasons into the DB --->
<!---adding cfqueryparam tags breaks following CFIF block--->
<CFIF ListLen(SESSION.WHSurveyStruct.reasonString, ";") gt 0>
<CFQUERY name="insertReasons" datasource="#REQUEST.dsn#">
INSERT INTO TWelcomeHome_Reason
(ReasonID, SubReasonID, SurveyID)
SELECT #sanitize(ListFirst(SESSION.WHSurveyStruct.reasonString, ";"))#, #sanitize(getLatestSurveyID.SurveyID)# <!---error occures if adding cfqueryparam tags on this line--->
<CFLOOP list="#sanitize(ListRest(SESSION.WHSurveyStruct.reasonString, ';'))#" index="thisReason" delimiters=";">
UNION ALL
SELECT #sanitize(thisReason)#, #sanitize(getLatestSurveyID.SurveyID)#
</CFLOOP>
</CFQUERY>
上述代码有效,但如果我做了以下更改,则无法使用:
<cfqueryparam value=#sanitize(getLatestSurveyID.SurveyID)# cfsqltype="cf_sql_integer">
这是由参数化造成的错误
<cfqueryparam value=#sanitize(getLatestSurveyID.SurveyID)# cfsqltype="cf_sql_integer">
执行数据库查询时出错。 [Macromedia] [SQLServer JDBC 驱动程序] [SQLServer] INSERT语句与FOREIGN KEY冲突 约束“FK_WelcomeHome_TSupplier”。冲突发生在 数据库“d21wca1”,表“dbo.TSupplier”,列'SupplierID'。该 发生错误 d:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第215行来自 d:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第183行来自 d:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第174行来自 d:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第1行来自 d:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第215行来自 d:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第183行来自 d:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第174行来自 d:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第1 213行:#sanitize(SESSION.WHSurveyStruct.SupplierID)#NULL, 214:#sanitize(SESSION.WHSurveyStruct.CruiselineID)#NULL, 215:#sanitize(SESSION.WHSurveyStruct.UserID)#216:)217:
编辑:我仍然无法理解循环正在做什么。 SELECT
语句是否缺少FROM
?
答案 0 :(得分:4)
&LT; cfqueryparam&GT;不能像你使用它一样在SELECT子句中使用它。
它只能用于WHERE子句或“普通”INSERT或UPDATE
的一部分答案 1 :(得分:2)
我对here使用<cfqueryparam>
的方式/时间/原因/等的解释可能有所帮助。为了便于参考,我会在这里重现它。
要记住的事情是,SQL语句有两部分:SQL“命令”,以及SQL命令使用的数据。只能对参数化数据进行参数化。如果你考虑一下,这是有道理的:SQL命令本身不是“参数”。
人们可以在CF环境中思考这个类比。请考虑以下声明:
<cfset variables.foo = "bar">
可以用传入的值“参数化”:
<cfset variables.foo = URL.foo>
(其中URL.foo是此示例中的参数)
但人们不能指望这样做:
<#URL.tag# variables.foo = "bar">
(这是一个非常人为的例子,但它证明了这一点)。
我认为,就
<cfquery>
中的SQL而言,水域有点混乱,因为整个事物只是CF中的一个字符串,并且字符串的任何部分都可以与变量交换掉(列名,布尔运算符,整个子句等)。因此,通过扩展,人们可能会认为任何变量都可以用<cfqueryparam>
替换。正如我们现在所知,情况并非如此,因为就CF而言,它只是一个字符串,它被认为是数据库的代码,因此需要符合DB的编码语法。 / p>
答案 2 :(得分:0)
我不确定你为什么要在SQL查询中使用该语法。您可以使用以下方法插入多行数据:
INSERT INTO myTable(column1, column2, column3)
VALUES('a','b','c'), ('d','e','f');
因为你绝对可以在VALUES子句中使用cfqueryparams。 T认为应该解决你的问题。只需在循环中构建VALUES子句,而不是所有那些SELECT / UNIONS。这会对你的情况有用吗?