1

我正在尝试保护此代码,但每次添加 cfqueryparam 标记时,我都会收到有关参数绑定的错误。我确定我将cfsqltype属性设置为正确的值。最后一个 select 语句是所有地狱都崩溃的地方。

<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: line 215 Called from 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 调用:

编辑:我仍然无法理解循环在做什么。SELECT语句不是丢失了FROM吗?

4

3 回答 3

4

<cfqueryparam> 不能以您使用它的方式在 SELECT 子句中使用。

它只能用于 WHERE 子句或“正常”INSERT 或 UPDATE 的一部分

于 2012-07-12T00:38:46.537 回答
2

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

要记住的事情 [...] 是 SQL 语句有两个部分:SQL“命令”和 SQL 命令使用的数据。只有数据可以参数化。如果您考虑一下,那是有道理的:SQL 命令本身不是“参数”。

可以在此处的 CF 上下文中进行类比。考虑这个陈述:

<cfset variables.foo = "bar">

可以使用传入的值“参数化”它:

<cfset variables.foo = URL.foo>

(其中 URL.foo 在此示例中是一个参数)

但人们不能指望这样做:

<#URL.tag# variables.foo = "bar">

(这是一个非常人为的例子,但它证明了这一点)。

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

于 2012-07-12T06:15:43.877 回答
0

我不确定您为什么要使用该语法进行 SQL 查询。您可以使用以下方法插入多行数据:

INSERT INTO myTable(column1, column2, column3)
VALUES('a','b','c'), ('d','e','f');

因为您绝对可以在 VALUES 子句中使用 cfqueryparams。T认为这应该可以解决您的问题。只需在循环中构建 VALUES 子句,而不是所有那些 SELECT/UNIONS。这对你的情况有用吗?

于 2012-07-12T01:15:11.287 回答