У меня есть этот код, который передаст переменную в функцию и вставит ее. Но получаю ошибку:
<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#">
Я получаю такую ошибку:
Проблема с cfargument.name. Как правильно использовать cfargument для запроса вставки? Заранее спасибо.
Вы рискуете подвергнуться SQL-инъекции, если не используете cfqueryparam.






Во-первых, правильный объем - arguments, а не cfargument. Итак, измените такие вещи:
cfargument.name,
к этому:
arguments.name,
Затем вы должны окружить имена переменных знаками решетки, чтобы получить значение переменной, то есть #arguments.name#.
Затем используйте параметры запроса, например <cfqueryparam value = "#arguments.name#">. Помимо прочего, они будут экранировать специальные символы, используемые в синтаксисе запроса SQL.
Я бы также порекомендовал хотя бы некоторую базовую проверку ошибок или исправление, прежде чем вставлять значения формы в свою функцию. Или даже просто trim() вокруг значений, чтобы оставить начальные или конечные пробелы в ваших данных.
Ага. @ sg552 - Обратите внимание, хотя cfsqltype был опущен для краткости, всегда указывайте его, чтобы избежать неожиданных результатов в некоторых случаях.
Подводя итог всем правильным ответам и комментариям выше. Это была бы ваша лучшая практика:
returnType должна быть «запросом», а не «структурой».default, CF распознает аргумент как «необязательный».cfqueryparam для всех параметров запросаПо желанию
null в cfqueryparam, чтобы вставить NULL, если значение не задано.<!---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#">
либо поставить
#, либоcfqueryparam