cfinvokeargument со специальным символом не работает в SELECT
У меня есть cfinvoke:
<cfinvoke component="cfcs.people" method="getPerson">
<cfinvokeargument name="name" value="José">
</cfinvoke>
И функция:
<cffunction name="getPerson" access="remote" returntype="any">
<cfargument name="name" type="string">
<cfquery name="qry" datasource="#datasource#">
SELECT id
FROM people
WHERE name = <cfqueryparam value="#name#" cfsqltype="CF_SQL_NVARCHAR">
</cfquery>
<cfreturn qry>
</cffunction>
У меня есть ряд в
people
стол с
name
"José", однако cfinvoke не возвращает эту строку. Любое имя, не содержащее специального символа, работает, но любое имя со специальным символом не возвращает строк.
Что заставляет специальные символы нарушать SELECT, и что я могу сделать, чтобы это исправить?
1 ответ
Попробуйте вывести только буквальную строку в скрипте .cfm
José
Если браузер отображает искаженную строку ниже, значит, это проблема с кодировкой файла, а не с
cfinvoke
или
cffunction
José
Чтобы решить эту проблему, установите кодировку UTF-8 в верхней части скрипта:
<cfprocessingdirective pageencoding="utf-8">
Вы также можете изменить его глобально для всего jvm, используя jvm arg
-Dfile.encoding=UTF-8
.
Стоит отметить, что директиву cfprocessingdirective часто неправильно понимают. Только причина , это необходимо здесь потому , символьная строка
José
встроен в исходный код cfm. Если эта строка в конечном итоге будет заменена, скажем, полем формы, тогда директива вам не понадобится. Исходный код будет работать без проблем.
<!--- works in modern versions of CF -->
<cfinvoke component="cfcs.people" method="getPerson">
<cfinvokeargument name="name" value="#form.name#">
</cfinvoke>
Смотрите также <cfprocessingdirective>
и как не использовать это