線上編輯器: TryCF
<cfparam>
<cfif>
<cfswitch>
<cfloop>
<cfinclude>
<cffunction>建立自訂函數<cfoutput>, cfdump <cfdump>,<cfabort>: 中斷程式執行語法: <cfset var1="Hello!">
規定:
_ 與 $ ,其他符號都不行型態: number, boolean, string, array date, list, structure, query, object
<!--- ... --->
作用: 1. 把CFML的變數內容或函式傳回值輸出到網頁, 2. 輸出資料庫的查詢結果。
#用#包起來,提醒coldfusion輸出字串前,先處理被#包起來的變數或函式
<cfset dateTime = Now()>
<cfoutput>
當前時間: #dateTime#
</cfoutput>
#為特殊意義, 要輸出#或是包含#的變數(顏色...)時,使用##。
<cfoutput>
<font color="##FFOOOO">顏色</font>
</cfoutput>
如果少打一個#,Coldfusion會認為FFOOOO為一個變數而出錯
&作用: 串聯字串,但 沒有 Javasript+ 的運算功能
<cfset msg1="歡迎">
<cfset msg2="#msg1# 光臨">
<cfset msg3="msg1 光臨">
<cfset msg4=msg1&"光臨">
結果: msg2="歡迎光臨", msg3="msg1 光臨", msg4="歡迎光臨"
Coldfusion 透過在變數名稱前面加上前置詞,控制變數的有效範圍與來源。
<cfset Variables.myDog = "Lucky">
<cfoutput>
Dos' Name: #Variables.myDog#
</cfoutput>
前置詞: Variable, Form, URL, Cookie, Server, Client, ...
function 內的前置詞: [#arg argument.參數], [#this this.變數],控制變數只在在function中有效<cfparam>避免因變數尚未定義,產生的錯誤
三個基本屬性: name, default, type
<cfparam name="UR:.id" default="1" type="any">
<cfif>, <cfswitch>, <cfloop>, <cfinclude>
<cfif><cfif 條件敘述>
條件成立,執行這裡
<cfelse>
條件不成立,執行這裡
</cfif>
eq: 等於,也可以寫成 is, equal
neq: 不等於is not, not equal
gt: 大於,也可以寫成greater than
lt: 小於,也可以寫成less than
ge: 大於等於,也可以寫成greater than or equal to , gte
le: 小於等於,也可以寫成less than or equal to, lte
contain: 包含,範例"ColdFusion MX" contain "MX" 將回傳truedoes not contain: 不包含<cfset hr = "3p">
<cfif ht is "15:00">
現在時間下午3點
</cfif>
and, or, not
xor: true加false,false加true,兩種情況才會回傳trueeqv: true加true,false加false,兩種情況才會回傳trueimp: true加false,會回傳false<cfswitch>效率比一連串ifesle好,易讀
<cfset number=3>
<cfswitch expression="#number#">
<cfcase value="1">
符合條件值時,執行這裡
</cfacse><cfcase value="2"></cfcase><cfcase value="3"></cfcase>
</cfswitch>
<cfcase value="1, 3">
變數NUMBER 可能是1 或3
</cfcase>
<cfcase value="1, 2"></cfcase>
<cfcase value="1, 3"></cfcase>
<cfcase value"banana|orange" delimiters="|">
<cfloop>索引迴圈、條件迴圈
<cfloop index="counter" from="1" to="5" step="2">
大家好! <br>
</cfloop>
true 就會不斷執行,直到條件變為 false
<cfset counter=1>
<cfloop condition="counter LT 6">
大家好! <br>
<cfset counter = counter + 1>
</cfloop>
<cfinclude>在頁面中包含另外一個網頁,好讓我們替網站頁面嵌入統的頁眉(header)與頁腳(footer)
字串處理、規則運算式、清單(list)、Array、Structure 變數
<cfset str=#x# & #y#>
Trim(): <cfset user = Trim(Form.userName)>
RTrim(): 去除第一個非空白字元的之前空格; LTrim(): 去除最後一個非空白字元的之後空格;Compare(str1, str2)
<cfset str1="apple Pie">
<cfset str2="APPLE">
<cfset order=Compare(str1, str2)>
<cfoutput>
<cfswitch expression="#order#">
<cfcase value="-1">
#str1# 大於 #str2#
</cfcase>
<cfcase value="0">
#str1# 等於 #str2#
</cfcase>
<cfcase value="1">
#str1# 小於 #str2#
</cfcase>
</cfswitch>
</cfoutput>
CompareNoCase()
Find()
Find(搜尋字串, 被搜尋字串 [, 搜尋起點]),大小寫有差別FindNoCase()
@來達成
<!-- 讀取 email 表單欄位的值 -->
<cfset email=Form.email>
<!-- Len(): 字串長度 -->
<cfset emailLen=Len(email)>
<!-- 找尋 @ -->
<cfset firstAt = Find("@", email)>
<!-- 找不到時 firstAt = 0 -->
<cfset secondAt = Find("@", mail, firstAt + 1)>
<cfif sescondAt is not 0>
e-mail 只能有一個 @ 字元
<cfabort>
<cfelseif firstAt LTE 1 OR firstAt is emailLen>
請仔細填寫 e-mail !
</cfif>
Replace(來源字串, 要被替換字串, 替換內容, 搜尋範圍)
ReplaceNoCase()
one 只替換第一個找到的; 2. all 替換所有找 到的<cfset str1="apple Pie apple sida apple juice">
<cfset str2=Replace(str1, "apple", "orange", "all")>
<cfoutput>
替換前: #str1#
<br>
替換後: #str2#
</cfoutput>
Mid(字串, 起始編號, 字數),範例
<cfset email="ColdFusion@yahoo.com.tw">
<cfoutput>
網域名稱: #Mid(email, 12, 5)#
</cfoutput>
Left(字串, 字數): 從左邊開始數; Right(字串, 字數): 從右邊開始數@ 之前的字串當作使用者名稱,@之後當作網域
<cfset email="ColdFusion@yahoo.com.tw">
<cfset indexEmail=Find("@", email)>
<cfset userName=Left(email, indexEmail-1)>
<cfset emailLen=Len(email)>
<cfset domainName=Right(email, emailLen-indexEmail)>
<cfoutput>
使用者名稱: #userName#
<br>
網域: #domainName#
</cfoutput>
上面的搜尋方式為找到指定的字元,這邊可以透過特殊字元搜尋目邊的起始位子、出現頻率、字元的範圍等等
<cfset result=REFind("ColdFusion", "ColdFusion@yahoo.com")>,result的值為字元的位子REFindNoCase("規則", 字串)
^: 開頭; $: 結尾; "^cubie$"表示目標字串需要完全吻合\t: 定位字元\s: 任何空白字元(包含定位鍵以及換行...)\S: 任何 非 空白字元\d: 任何數字\D: 任何 非 數字\w: 任何字母與數字\W: 任何 非 字母與數字\, ,, ., -使用\\, \,, \., \-
[a-z]: 任何小寫字母[a-zA-Z]: 任何大小寫字母[0-9]: 任何數字[a-zA-Z0-9.]: 任何大小寫字母, 數字, "."符號[[:punct:]]: 匹配任何標點符號 (POSIX字元集合)<cfset result=REFindNoCase("^[^0-9][a-z0-9]$", target)>
{n}: 匹配 n 個數量字元,如 p{2}將匹配 "apple" 和 "apple" 的前面兩個 p{n, }: 匹配 n 個或多個數量的字元{n, m}: 匹配 n~m 個字元*: 匹配多次 *字元,範例: bo* 將匹配 "book" 的 boo與 "bike" 裡面的 b?: 匹配 一次 ?之前的字元,範例: books? 將匹配 book 與 books+: 匹配多次 +之前的字元,範例: o+ 匹配 "book" 裡面 的 oo 與 "booook" 裡的 oooo.: 匹配第 一個吻合以外 的所有字元,範例: .c匹配 "clock" 的第二個 cx|y: 匹配 x 或 y,範例: black|white|gray,匹配 "black", "white" 或 "gray"[\w]+@[\w]+\.[\w\.]+
<cfset listData="材, 米, 油, 鹽">
ValueList(資料查詢名稱.資料欄位 [, 界定符號])
'語法: QutedValueList(bookTitle.title, ";")
<cfquery name="bookTitle" datasource="bookStore">
SELECT title FROM books
</cfquery>
<cfset titleList=ValueList(bookTitle.title, ";")>
//result: ActionScript;ColdFusion;APS.Net
<cfset titleList=QuetedValueList(bookTitle, ";")>
//result: 'ActionScript';'ColdFusion';'APS.Net'
<cfquery>為查詢資料庫標籤的指令ListLen(list, "")
ListGetAt(清單, 位置編號, 界定符號)
ListAppend(清單, 值, 界定符號) : 指定的值放在清單元素最後ListPrepend(清單, 值, 界定符號) : 指定的值放在清單元素之前ListInsertAt(清單, 位置編號, 值, 界定符號) : 指定值放在指定位置<cfset listData=newValue & "," & listData>的方式效率更好ListDeleteAt(清單, 位置編號, 界定符號)
<cfset listData="材;米;油;鹽">
<cfset i=1>
<cfloop index="item" list="#listData#" delimiters=";">
<cfoutput>
元素 #i# : #item# <br>
</cfoutput>
<cfset i = i + 1>
</cfloop>
ListFind(搜尋對象, 要搜尋的內容): 可以搜尋、匹配清單的元素內容,只能和找尋對象一模一樣的內容ListFindNoCase(搜尋對象, 要搜尋的內容): 不分大小寫javascript <cfset listData="材,米,油,鹽"> <cfset orderList="米,鹽"> 尚未購買的商品: <br> <!-- <cfloop> 中的index,把每次迴圈取出的值暫存到product --> <cfloop list="#listData#" index="product"> <cfif ListFind(orderList, product) is 0> <cfoutput> #product#<br> </cfoutput> </cfif> </cfloop>
ListContains(搜尋對象, 要搜尋的內容): 比對包含搜尋內容的元素,回傳0(失 敗), 1(成功)ListContainsNoCase(搜尋對象, 要搜尋的內容): 不分大小寫<cfset listData = "Flash MX,FlashComm,Dreamviewer,flash ROM">
包含"flash"字串的元素: <br>
<cfloop list=#listData# index="word">
<cfset result=ListContainsNoCase(word, "flash")>
<cfif result neq 0>
<cfoutput>
#word#<br>
</cfoutput>
</cfif>
</cfloop>
ListValueCount(統計對象, 項目): 統計項目出現次數ListValueCountNoCase(): 不分大小寫<cfset listData="贊成,反對,沒意見">
<cfset voteList="贊成,反對,沒意見,贊成,贊成,反對,反對,沒意見,沒意見,贊成,贊成,沒意見,反對,反對">
<h3>投票結果</h3>
<cfloop list=#listData# index="vote">
<cfoutput>
#vote#: #ListValueCount(voteList, vote)# 票<br>
</cfoutput>
</cfloop>
儲存許多相關資料,需要使用Array,Array元素從1開始依序編號
<cfset myArray = ArrayNew(1)>: 建立Array,!ArrayNew()裡面的參數,代表維度,不是數量Arrayset(陣列變數的名稱,起始編號,結束編號,初始值): 初始化Array的函式AaaryLen() : 傳回長度ArrayAppend(array, 值): 加入新的元素在array最後,成功會回傳TrueArrayPrepend(array, 值): 加入新的元素在array開頭,成功會回傳TrueArrayInsertAt(array,位置,值): 指定位置插入新的元素,成功會回傳TrueArrayDeleteAt(array, 位置): 指定位置刪除元素,刪除後後面元素自動遞補,成功會回傳TrueArraySwap(array,位置1,位置2): 交換位置1與位置2的元素,成功會回傳TrueArrayClear(array): 清除array內容,成功會回傳TrueArrayIsEmpty(array): 確認array是否沒有任何元素,沒有的話回傳TrueArraySort(array, 排序類型[,排列順序]): 排序完成回傳True
ArrayToList(array, 分格符號): 將array換成列表,用分格符號分隔字串(輸出到網頁上常用)ArrayResize(array, 指定大小): 將array重新設定為指定大小<cfset scoresArray = ArrayNew(1)>
<cfset scoresArray[1] = 77>
<cfset scoresArray[2] = 66>
<cfset scoresArray[3] = 88>
<cfoutput>
原始內容: #ArrayToList(scoresArray, ", ")#<br>
</cfoutput>
<cfset temp=ArraySort(scoresArray, "Numeric")>
<cfoutput>
排序後: #ArrayToList(scoresArray, ", ")#
</cfoutput>
ArrayAvg(array): 平均值ArrayMax(array): 最大值ArrayMin(array): 最小值ArraySum(array): 總和<cfset scoresArray = ArrayNew(1)>
<cfset scoresArray[1] = 77>
<cfset scoresArray[2] = 66>
<cfset scoresArray[3] = 88>
<cfoutput>
總分:#ArraySum(scoresArray)#<br>
平均:#ArrayAvg(scoresArray)#<br>
最高:#ArrayMax(scoresArray)#<br>
最低:#ArrayMin(scoresArray)#<br>
</cfoutput>
結構變數就是 命名陣列(Associate Array),一般Array都是透過索引編號參照元素位置,結構變數可以用名稱來參照,這個名稱叫做 鍵值(key)
<cfset bookData = StructNew()>: 建立結構變數<cfset bookData["title"] = "MX 與 XML 動態網站實作">: 設定key<cfdump>]標籤檢視資料:
<cfoutput>顯示變數內容外,一般變數內容不可見的。<cfdump>可以輸出內容讓我們開法更方便,var為必要參數var: 指定查看的變數名稱,變數名稱要用##包起來expand: boolean(Yes, No),設定是否展開結構內容,預設Yes,如果設No,始會列出結構的Key,不顯示內容label: 設定標題文字<cfset bookData["title"] = "Flash MX">
<cfset bookData["author"] = "Harry">
<cfset bookData["price"] = 680>
<cfdump var=#bookData# label="書籍資料">
IsStruct(變數): 判斷變數是否是結構,回傳True, FalseStructCount(): 計算Key數量StructEmpty(結構變數名稱):StructKeyExists(結構變數名稱, "key"): 判斷指定的key 是否存在StructKeyList(結構變數名稱, 分界符號): 取出結構變數中的關鍵值StructKeyArray(結構變數名稱): 找尋結構中的keyStructDelete(結構變數名稱, key[, indicateNotExisting]): 刪除結構中特定的元素StructClear(結構變數名稱): 清除結構中的全部資料Duplicate(): 複製結構,存放在不同記憶體,兩邊不影響StructCopy(): 複製結構,參照原有結構的記憶體,改任何一邊結構將影響另一邊結構<cfset bookData["title1"] = "Flash MX 寶典">
<cfset bookData["title2"] = "Flash XML 動態網站">
<cfset bookData["title3"] = "Dreamviewer">
<cfloop index="counter" from="1" to="#StructCount(bookData)#" step="1">
<cfoutput>
第#counter# 本書: #bookData["title" & counter]#<br>
</cfoutput>
</cfloop>
TimeFormat(date[,mask]): 可以自訂時間的顯示格式,mask值如以下:
H: 顯示12時制,1~9時 沒有 前導0Hh: 顯示24時制,1~9時 有 前導0HH: 顯示24時制,1~9時 有 前導0M: 1~9 沒有 前導0的分鐘數mm: 1~9 有 前導0的分鐘數S: 1~9 沒有 前導0的秒數Ss: 1~9 有 前導0的分鐘數T: 上午或下午的標記,顯示A 或P 值Tt: 上午或下午的標記,顯示AM 或 PM 值<cfoutput>
時間格式一: #TimeFormat(Now())#
<br>
時間格式二: #TimeFormat(Now(), "hh:mm:ss tt")#
</cfoutput>
DateFormat(date[,mask]): 可以自訂日期的顯示格式,mask值如以下:
d: 顯示一位或兩位數的日期,1~9時前面沒有0dd:顯示兩位數日期,1~9前面有0ddd: 顯示星期簡寫,如 Mon, Tue...dddd: 顯示星期全名,如 Mondaym: 顯示一位或兩位的月份,1~9前面沒有0mm: 顯示兩位的月份,1~9前有有0mmm: 顯示月份簡寫,如 Jan ...mmmm: 顯示月份全名,如 January ...y:顯示一位或兩位數的年份,1~9前面沒有0yy: 顯示兩位數的年份,1~9前面有0yyyy: 顯示四位數的年份<cfoutput>
時間格式一: #DateFormat(Now(), "yyyy/mm/dd")#
<br>
時間格式二: #DateFormat(Now(), "dddd, mmmm dd, yyyy")#
</cfoutput>
LSTimeFormat(date, [,mask]): 區域性時間函數LSDateFormat(date, [,mask]): 區域性日期函數<cfoutput>
#LSTimeFormat(Now(), "hh:mm:ss tt")#
</cfoutput>
<cfoutput>
時間格式一: #LSDateFormat(Now())#
<br>
時間格式二: #LSDateFormat(Now(), "yyyy年 mmmd 日 ddd")#
</cfoutput>
IsDefined: 確認變數是否定義,回傳true代表有,false 代表沒有<cffunction><cffunction name="函數名稱" [returnType="傳回類型" roles="角色列表" access="存取類型" output="布林值"]>
程式內容
<cfreturn 運算式>
</cffunction>
<cfargument name="引數名稱" [Type="類型" required="布林值" default="預設值"]>: 定義涵式的引數
<cffunction name="CFconverter">
<cfargument name="degree" default="0">
<cfargument name="type" default="C2F">
<cfif type EQ "C2F">
<cfset degree = 9/5*degree+32>
<cfelse>
<cfset degree = 5/9*(degree-32)>
</cfif>
<cfreturn DecimalFormat(degree)>
</cffunction>
<cfoutput>
#CFconverter(20, "C2F")#
</cfoutput>
this.變數: 函式區域變數
<cffunction name="CtoF">
<cfargument name="degree">
<cfset this.result=9/5*degree+32>
<cfreturn this.result>
</cffunction>
常被用來變數設定, 條件判斷, 迴圈, 自訂函數
寫法與JS相似,但是在伺服器運行
<cfscript></cfscript>一定要放程式,不能只放註解,不然會錯// 與 /* */。var
WriteOutput(),<cfoutput>不能用<cfscript>
WriteOutput("這是""MX""版本");
//result: 這是"MX"版本
<cfscript>
<cfscript>
softArray = ArrayNew(1);
softArray[1] = "Flash";
softArray[2] = "yaiud";
</cfscript>
<cfscript>
user = StructNew();
user.ID = FORM.userID;
user.name = FORM.userName;
</cfscript>
if...else...: 注意,比較運算子是CF的比較運算子,範例:
<cfset version = "MX">
<cfscript>
if(version eq "MX"){
WriteOutput("""MX""是最新的版本");
} else if(version eq "5.0"){
WriteOutput("5.0版也是很強大。");
} else {
WriteOutput("更新一下");
}
</cfscript>
switch...case: 注意,要加break,程式會一直執行到break或是default才離開switch,語法:
switch(變數){
case 特定值 1:
//特定值 1 情況的程式碼
break;
case 特定值 2:
//特定值 2 情況的程式碼
break;
default:
//條件都不符合的情況,執行的程式碼
}
while:
MOD: 取餘數的運算子continue: 強迫迴圈回到判斷式執行,不會執行continue後面的程式<cfscript>
i = 1;
ans = 0;
while(i LTE 5){
if((i MOD 2) NEQ 0){
i += 1;
continue;
}
ans += i;
i += 1;
}
WriteOutput("運算結果:" &ans);
</cfscript>
for: 範例
<cfscript>
i = 1;
ans = 0;
for(i = 1; i LTE 5; i++){
ans = ans + i;
}
WriteOutput("運算結果: #ans#");
</cfscript>
<cfscript>
function functionName(){
// 程式碼
}
</cfscript>
var 必須在function程式內容的開頭<cfscript>
function argTest(){
var args = ArrayLen(Arguments);
writeOutput("引數的數量: " &args& "<br>");
for(i = 1; i LTE args; i++){
writeOutput("第" & i & "個引數值: " & Arguments[i] & "<br>");
}
}
</cfscript>
<cfoutput>
#argTest(20, "Hello")#
</cfoutput>
當瀏覽器發出請求到服務器,Web服務器和瀏覽器創建這個環境變數,包含的資訊有IP位址、瀏覽器類型,驗證用戶名等等。要注意的是這個變數只能用來讀取不能修改。
<cfset var = 1 />
<cfparam name="foo#var#" default="default" />
<cfdump var="#foo1#" />