Как правильно использовать sql-запрос в функции coldfusion

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

<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#">

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

Как правильно использовать sql-запрос в функции coldfusion

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

либо поставить #, либо cfqueryparam

Bernhard Döbler 24.11.2018 22:36

Вы рискуете подвергнуться SQL-инъекции, если не используете cfqueryparam.

Seanvm 25.11.2018 03:01
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
2
792
2

Ответы 2

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

cfargument.name,

к этому:

arguments.name,

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

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

Я бы также порекомендовал хотя бы некоторую базовую проверку ошибок или исправление, прежде чем вставлять значения формы в свою функцию. Или даже просто trim() вокруг значений, чтобы оставить начальные или конечные пробелы в ваших данных.

Shawn 25.11.2018 18:28

Ага. @ sg552 - Обратите внимание, хотя cfsqltype был опущен для краткости, всегда указывайте его, чтобы избежать неожиданных результатов в некоторых случаях.

SOS 26.11.2018 20:26

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

  • Функция 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#">

Другие вопросы по теме