Что не так с моей простой вставкой?

Я использую coldfusion для вставки содержимого структуры (пар ключ-значение) в таблицу базы данных. Это мой код:

<cfloop collection="#results#" item="ID" >
    <cfquery name="insertStuff" datasource="myDataSource">
        INSERT INTO web..Stuff (ID, Name)
        VALUES (#ID#, #results[ID]#)
    </cfquery>
</cfloop>

Это кажется достаточно простым... но я получаю следующую ошибку:

Incorrect syntax near 'VA'. 

Любые идеи?


person froadie    schedule 20.12.2010    source источник


Ответы (2)


Вам действительно следует подумать о параметризации ваших данных.

<cfloop collection="#results#" item="ID" >
    <cfquery name="insertStuff" datasource="myDataSource">
        INSERT INTO web..Stuff (ID, Name)
        VALUES (
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#ID#">, 
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#results[ID]#">)
    </cfquery>
</cfloop>
person Steve Martin    schedule 20.12.2010
comment
По мнению Стива, использование cfqueryparam может многое для вас сделать. Он закавычил бы для вас строку «VA», защищая вас от целого ряда плохих вещей. Вы хотите сделать это даже в приложении для интрасети. - person Aaron Greenlee; 20.12.2010
comment
хорошее замечание... спасибо. Я обязательно попробую это. Я возвращаюсь в cf после долгого перерыва... так что я многое забыл :) - person froadie; 20.12.2010

Я думаю, что, возможно, решил это... забыл кавычки, и они оба являются полями varchar: -/

<cfloop collection="#results#" item="ID" >
    <cfquery name="insertStuff" datasource="myDataSource">
        INSERT INTO web..Stuff (ID, Name)
        VALUES ('#ID#', '#results[ID]#')
    </cfquery>
</cfloop>
person froadie    schedule 20.12.2010
comment
Я бы все равно сделал CFQueryParam. - person Nathan Stanford; 05.01.2011
comment
Полностью согласен. CFQueryParam определенно является лучшей практикой. Я использую сниппеты CFEclipse, чтобы упростить их вставку (их может быть сложно печатать). - person Kyle Humfeld; 05.01.2011