嗯....我使用的建議是在錯誤發生之前趕上SQL。您沒有指定您的DBMS(SQL Server,MySQL等),所以我將專注於ColdFusion解決方案。我希望這些建議中的一條能夠指引您走上正確的道路。
選項:
- 你鏈接到有關ColdFusion的日期驗證的文章中提到的isValid功能推薦的解決方案。按照建議,考慮使用USDATE驗證類型。
- 如果您使用的是CFC或至少是您的API方法的函數,那麼您可以隨時使用cfargument type =「date」來協助確保日期有效(儘管我的感覺是,它會具有與isDate)
- 在您的cfquery標記中,您應該使用cfqueryparam來傳遞所有傳遞的參數,尤其是那些直接從用戶傳遞的參數(無論是表單發佈還是API調用)。您應該使用cfqueryparam cfsqltype = CF_SQL_DATE
使用任何上述方法(或全部),你應該換你的ColdFusion代碼在try/catch結構,並有一個更容易的錯誤處理。
根據您的DBMS,您可能也有權訪問Try/catch結構。
****更新:
閱讀有關國際轉換問題您的評論後,我有,我會選擇以下兩種方法:
請記住,我沒有測試過任何代碼或任何東西....
首先,也許國際功能可以幫助你。
http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_in-k_37.html
使用的setlocale的位置設置爲英語(澳大利亞),然後使用LSParseDateTime在YYYY-MM-DD格式的讀取,然後使用日期格式使用MM/DD/YYYY將其寫入到MySQL或無論它期望什麼dateformat。雖然我沒有太多處理這些LS功能的經驗。
第二個選項,使用您提供的正則表達式確保輸入具有正確的結構,然後使用createDate使用解析的mm dd和yyyy元素以美國格式創建日期。使用isValid驗證usdate。
下面是對第二個選項的盲目編碼嘗試。記住,我沒有測試過這個代碼。我大量使用列表函數listGetAt將輸入的日期時間拆分爲單獨的日期和時間字符串,然後使用listGetAt解析出各個日期部分。
<cfscript>
isosampledate = "2013-06-05 14:07:33";
passesValidation = false;
expectedDatePattern = "\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}";
try {
if (refind(expectedDatePattern,isosampledate)) {
datePortion = listGetAt(isosampledate,1," ");
timePortion = listGetAt(isosampledate,2," ");
yearPart = listGetAt(datePortion,1,"-");
monthPart = listGetAt(datePortion,2,"-");
dayPart = listGetAt(datePortion,3,"-");
hoursPart = listGetAt(timePortion,1,":");
minutesPart = listGetAt(timePortion,2,":");
secondsPart = listGetAt(timePortion,3,":");
thisUSDate = createDateTime(yearPart,monthPart,dayPart,hoursPart,minutesPart,secondsPart)
if (isValid("usdate",thisUSDate) {
passesValidation = true;
sqlDate = CreateODBCDateTime(thisUSDate);
}
}
} catch (e:any) {
passesValidation = false;
}
</cfscript>
我敢肯定,這些日期函數,如果輸入的值不是一個有效的日期則至少有一個會拋出這將由catch塊得到拿起一個例外。
希望這會有所幫助。我去睡了。
一盎司的預防值得一磅的治療。儘管ColdFusion的日期驗證並不完美,但它比InvalidDateTimeExceptions更好。 –
如果您想控制用戶向您發送的內容,cfinput具有掩碼屬性。請注意,如果您預先填充表單域,那麼mask屬性使編輯該值有點棘手。 –