首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加cfqueryparam标记时出错

添加cfqueryparam标记时出错
EN

Stack Overflow用户
提问于 2012-07-12 00:23:47
回答 3查看 646关注 0票数 1

我试图保护这段代码的安全,但是每次添加cfqueryparam标记时,我都会收到有关参数绑定的错误。我确信我正在将cfsqltype属性设置为正确的值。最后一条select语句是所有地狱爆发的地方。

代码语言:javascript
复制
<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">

执行数据库查询时出错。MacromediaSQLServerThe插入语句与外键约束"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.owktri.com调用的D:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm:行174调用。183 :从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:/调用的第174行Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm:第1113行:#sanitize(SESSION.WHSurveyStruct.SupplierID)#NULL,214:#sanitize(SESSION.WHSurveyStruct.CruiselineID)#NULL,215:#sanitize(SESSION.WHSurveyStruct.UserID)# 216:) 217:

编辑:我很难理解循环在做什么。SELECT语句不是缺少FROM吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-12 00:38:46

不能以使用它的方式在SELECT子句中使用。

它只能用于WHERE子句或“普通”插入或更新的一部分。

票数 4
EN

Stack Overflow用户

发布于 2012-07-12 06:15:43

我对如何/何时/为什么/etc使用我制作的<cfqueryparam>的解释可能会有所帮助。为了便于参考,我会在这里复制它。

要记住的是..。SQL语句有两个部分: SQL“命令”和SQL命令使用的数据。只有数据可以参数化。如果您仔细考虑,这是有意义的: SQL命令本身不是“参数”。 我们可以在这里的CF上下文中思考,作为一个类比。请考虑这一声明:

代码语言:javascript
复制
<cfset variables.foo = "bar">

可以用传入值“参数化”这个值:

代码语言:javascript
复制
<cfset variables.foo = URL.foo>

(在本例中,URL.foo是一个参数) 但人们不能指望这样做:

代码语言:javascript
复制
<#URL.tag# variables.foo = "bar">

(这是一个非常人为的例子,但它证明了这一点)。 我认为,就<cfquery>中的SQL而言,水有点混乱,因为整个事情只是CF中的一个字符串,字符串的任何部分都可以用变量(列名、布尔运算符、整条子句等)交换。因此,通过扩展,人们可能会认为任何变量都可以被<cfqueryparam>替换。正如我们现在所知道的,情况并非如此,因为就CF而言,它只是一个字符串,但它被认为是DB的代码,因此需要符合DB的编码语法。

票数 2
EN

Stack Overflow用户

发布于 2012-07-12 01:15:11

我不知道为什么在SQL查询中使用这种语法。可以使用以下方法插入多行数据:

代码语言:javascript
复制
INSERT INTO myTable(column1, column2, column3)
VALUES('a','b','c'), ('d','e','f');

因为您肯定可以在VALUES子句中使用cfqueryparams。我不认为那会解决你的问题。只需在循环中构建VALUES子句,而不是构建所有SELECT/UNIONS。这在你的情况下可行吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11443463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档