Как правильно использовать SQL-запрос в функции Coldfusion? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть этот код, который передаст переменную в функцию и вставит ее.Но я получаю ошибку:

<cffunction name="insertSupplierPersonnel" output="false" access="public" returnType="struct">
    <cfargument name="name" type="string" required="true" />
    <cfargument name="email" type="string" required="false" default="" />
    <cfargument name="office_phone" type="string" required="false" default="" />
    <cfargument name="mobile_phone" type="string" required="false" default="" />
    <cfargument name="designation" type="string" required="false" default="" />

    <cfset var res = '' />

    <cfquery datasource="#session.dsn_aset#" result="res">
        INSERT INTO `supplier_personnel_incharge` (
            `name`,
            `email`,
            `office_phone`,
            `mobile_phone`,
            `designation`
        )
        VALUES
        (
            cfargument.name,
            cfargument.email,
            cfargument.office_phone,
            cfargument.mobile_phone,
            cfargument.designation
        ) ;
    </cfquery>

    <cfreturn res />
</cffunction>

<cfset res = insertSupplierPersonnel(name='#form.personnel_name#', email='#form.personnel_email#', office_phone='#form.personnel_office_phone#', mobile_phone='#form.personnel_mobile_phone#', designation='#form.personnel_designation#') />

<cfdump  var="#res#">

Я получаю эту ошибку:

enter image description here

Есть проблема с cfargument.name.Как правильно использовать cfargument для запроса вставки?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Чтобы суммировать все правильные ответы и комментарии выше.Это будет вашей лучшей практикой:

  • Функция returnType должна быть «запросом», а не «структурой»
  • Если вы укажете значение default, CF распознает аргумент как«не требуется»
  • Используйте cfqueryparam для всех параметров запроса

Необязательно

  • Используйте атрибут null cfqueryparam для вставкиNULL если значение не указано
  • Вам не нужна конечная точка с запятой в конце оператора sql

<!---return type is query, not struct --->
<cffunction name="insertSupplierPersonnel" output="false" access="public" returnType="query">
    <cfargument name="name" type="string" required="true" />
    <!--- NOTE: If you specify a default value, CF recognizes the argument as "not required" --->
    <cfargument name="email" type="string" default="" />
    <cfargument name="office_phone" type="string" default="" />
    <cfargument name="mobile_phone" type="string" default="" />
    <cfargument name="designation" type="string" default="" />

    <cfquery datasource="#session.dsn_aset#" result="local.data">
        INSERT INTO supplier_personnel_incharge (
            name, /*Unless your database column names are case-sensitive, you don't need quotation marks around the column names*/
            email,
            office_phone,
            mobile_phone,
            designation
        )
        VALUES
        (
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.name)#">,
            /*insert NULL if there is no value given*/
            <cfqueryparam cfsqltype="cf_sql_varchar" null="#Not Len(trim(arguments.email))#" value="#trim(arguments.email)#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" null="#Not Len(trim(arguments.office_phone))#" value="#trim(arguments.office_phone)#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" null="#Not Len(trim(arguments.mobile_phone))#" value="#trim(arguments.mobile_phone)#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" null="#Not Len(trim(arguments.designation))#" value="#trim(arguments.designation)#">,
        ) /*you don't need a trailing semi-colon*/
    </cfquery>

    <cfreturn local.data />
</cffunction>

<cfset local.res = insertSupplierPersonnel(name='#form.personnel_name#',
    email='#form.personnel_email#', 
    office_phone='#form.personnel_office_phone#', 
    mobile_phone='#form.personnel_mobile_phone#', 
    designation='#form.personnel_designation#') />

<cfdump var="#local.res#">
0 голосов
/ 25 ноября 2018

Во-первых, правильная область действия arguments, а не cfargument.Итак, измените этот тип вещи:

cfargument.name,

на это:

arguments.name,

Затем вы должны окружить имена переменных знаками решетки, чтобы получить значение переменной, т.е.#arguments.name#.

Далее используйте параметры запроса, например <cfqueryparam value="#arguments.name#">.Помимо прочего, они будут экранированы от специальных символов, используемых в синтаксисе SQL-запроса.

...