Возможно, вы не сможете найти заводной путь с помощью команды which
. После установки sdkman на Linux-подобные системы Mac OSX, Linux, Cygwin, Solaris и FreeBSD,
Сначала запустите $ source "$HOME/.sdkman/bin/sdkman-init.sh"
, затем вы сможете получить доступ к установленным комплектам разработки.
А именно, если вы наберете 'which groovy'
, он должен показать путь, и вы сможете вызывать другие команды SDK.
set
upload path to a web accessible, CF-enabled directory!!!
isStruct()
before isObject()
in a series of
's expecting isStruct only catches struct (cfc component returns True from isStruct() as well)
no HtmlEditFormat()
when displaying user-generated content (XSS)
forgot to add output=false on CFC methods
not using
inside
not scoping not-so-evident variables like cfquery name or loop index in a method
use
when all they need is plain-vanilla HTML
forgot to UrlEncodedFormat()
user-defined URL
use
without sanitizing the content
trust isDate()
too much (any number would return true)
expect string comparison to be case-sensitive (IS and EQ operators are case-insensitive)
sending strings "yes" or "no" to SerializeJSON()
without appending a whitespace to preserve the string (otherwise SerializeJSON()
or DeserializeJSON()
will translate them to "true" and "false")
not putting singletons services in application scope
blindly create as much CFCs as one wants like one would do in JAVA
putting complex value/object into a list (can't, list is just a string of comma-seperated values)
writing functions that takes array as an argument and modify that array expecting that array will be modified (array in CFML is passed by value)
blindly changes access="remote"
on a method and expect it to work (when remote proxy is generally more appropriate)
use a lot of WriteOutput() in cfscript when CFML is more appropriate
blindly uses IsDefined()
when StructKeyExists()
can generally do it more efficiently
blindly uses Iif()
and De()
without knowing they're as nasty as Evaluate()
update some code in onApplicationStart() and not seeing the difference on refresh (restart the app!)
or '' outside of
causing multiple new query connections to be opened. 99% of the time it's better to have multiple statements inside of one cfquery to perform multiple actions, or to UNION data together.
hardcoding absolute path when ExpandPath()
is generally better
forgot to turn on Unicode support in DSN (Unicode becomes '????')
not upgrading to the latest JRE and Hotfixes
misusing Client scope and blow up Windows registry...
uses depreciated/obsolete functions/features (i.e. flash form aka flex 1.x alpha, cftable, Verity full-text search, etc...)
passing CFCATCH
to a function as argument type Struct
(CFCATCH
behaves like a Struct
, but it is not. Just pass it as type 'Any
').
Not reading CFC Best Practices from ColdBox wiki.
buying in the mindset of .ASP(X) or .JSP or [insert web technology] are always better.. ;)
not use PrecisionEvaluate()
and getting all sort of floating point rounding error especially when calculating money.
Inappropriate use of #
SELECT *
Not scrubbing URL/form inputs
Debugging on in production environment (even if output is suppressed)
SQL Injection Attacks. It seems like cfquery is just made to allow them. So you should use cfqueryparams.
В Coldfusion все переменные по умолчанию являются глобальными, если они не объявлены с ключевым словом var
. (В некоторой степени похоже на ситуацию в Javascript.)
Таким образом, вы должны либо запомнить var
каждую переменную, используемую в функции, включая такие вещи, как имена, которые используют в cfquery
name
, или вы можете просто использовать этот трюк:
<cffunction name="MyFunction">
<cfset var Local = StructNew()>
<!--- Now anything Local. is automatically local --->
<cfset Local.x = 42>
<!--- Including cfquery name="" --->
<cfquery name="Local.Customers" datasource="some_datasource">
SELECT C.ID, C.Name
FROM Customers C
</cfquery>
</cffunction>
В имени Local
нет ничего волшебного, это просто соглашение. Хотя Coldfusion 9 добавит явную локальную область видимости , поэтому, если вы используете Local
, это, вероятно, упростит обновление до CF9, когда придет время.
Обратите внимание, что ситуация немного иная. для CFC: В CFC область переменных
(область "по умолчанию") не t global, как и для обычных функций, но существует для каждого экземпляра вашего CFC. Таким образом, хотя забыть использовать var
не так опасно в CFC, как в функции верхнего уровня, лучше всего использовать var
все время.
Чрезмерное использование «запроса запроса». То есть дальнейшая фильтрация или сортировка результатов запроса с использованием тега cfquery.
Этот тип работы часто лучше выполняется самой базой данных, особенно если набор данных большой.
Одной из самых больших ошибок было бы неиспользование cfqueryparam
Очень плохо:
SELECT UserName
FROM Customers
WHERE CustomerID = #URL.custid#
Очень хорошо:
SELECT UserName
FROM Customers
WHERE CustomerID = <cfqueryparam value="#URL.custid#" cfsqltype="cf_sql_integer">`
Совершение этой ошибки будет стоить вам веб-сайта.
Бесстыдное воровство форматирования Генри ...
Помещение переменных в неправильную область видимости; даже если вы не взорвете реестр или не сломаете сервер, легко медленно снизить производительность вашего приложения, увеличивая переменные до максимальной области, в которой, по вашему мнению, они могут вам понадобиться, или потерять информацию, потому что вы сохранили ее в одна область и попыталась получить к ним доступ в другой области.
Использование cfcatch
без захвата и / или передачи некоторой информации об ошибке, чтобы ее можно было найти и исправить. (Трудно найти ошибку, которая не сообщает вам, что она произошла.)
Использование listcontains ()
, когда вы хотите listfind ()
. Особенно, если в списке есть числа. listfind ()
соответствует только целому элементу в списке; listcontains ()
соответствует части элемента. (Да, мы однажды допустили эту ошибку.)
С доступом администратора:
Неспособность помешать пользователям видеть ошибки холодного слияния.
Добавьте метод onError в файл Application.cfc верхнего уровня, чтобы пользователи не могли видеть их все в подробных сообщениях дампа, раскрывающих вашу внутреннюю работу (и
<cffunction name="onError" returntype="void" output="true">
<cfargument name="exception" type="any" required="true" />
<cfargument name="eventname" type="string" required="true" />
varscoper также является отличным инструментом для автоматизации проверки на предмет пропусков переменной области видимости в компонентах.