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 Driver][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 から呼び出されます:

編集:ループが何をしているのかを理解するのにまだ問題があります。SELECTステートメントが欠落していませFROMんか?

4

3 に答える 3

4

<cfqueryparam> は、現在のように SELECT 句で使用することはできません。

WHERE句または「通常の」INSERTまたはUPDATEの一部でのみ使用できます

于 2012-07-12T00:38:46.537 に答える
2

ここで<cfqueryparam>作成した、どのように/いつ/なぜ/などを使用するかについての私の説明が役立つかもしれません. 分かりやすいようにここに転載しておきます。

[...] 覚えておくべきことは、SQL ステートメントには 2 つの部分があるということです。SQL の「コマンド」と、SQL コマンドで使用されるデータです。パラメータ化できるのはデータのみです。考えてみれば、それは理にかなっています。SQL コマンド自体は「パラメーター」ではありません。

類推のために、ここで CF コンテキストで考えることができます。次のステートメントを検討してください。

<cfset variables.foo = "bar">

渡された値でこれを「パラメータ化」できます。

<cfset variables.foo = URL.foo>

(この例では URL.foo がパラメータです)

しかし、これを行うことは期待できませんでした:

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

(これは非常に不自然な例ですが、要点を示しています)。

<cfquery>全体がCFの単なる文字列であり、文字列の任意の部分を変数(列名、ブール演算子、句全体など)。したがって、拡張により、任意の変数を<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はそれがあなたの問題を解決するはずだと思います。これらすべてのSELECT/UNIONではなく、ループ内にVALUES句を作成するだけです。それはあなたの場合にうまくいくでしょうか?

于 2012-07-12T01:15:11.287 に答える