まあ....私のアドバイスは、SQLに到達する前にエラーをキャッチすることです。DBMS (SQL Server、MySQL など) を指定しなかったので、ColdFusion ソリューションに焦点を当てます。これらの提案のいずれかが正しい道を示してくれることを願っています。
オプション:
- Coldfusion の日付検証に関するリンク先の記事では、推奨される解決策として isValid 関数について言及しています。提案されているように、それを USDATE 検証タイプで使用することを検討してください。
- APIメソッドにCFCまたは少なくともcffunctionsを使用している場合は、日付が有効であることを確認するのに役立つ cfargument type="date" を自由に使用できます(ただし、isDateと同じ寛大な動作になると思います)
- cfquery タグ内では、渡すすべてのパラメータ、特にユーザーから直接渡されるパラメータ (フォーム ポストまたは API 呼び出し) に対して cfqueryparam を使用する必要があります。cfqueryparam cfsqltype=CF_SQL_DATE を使用する必要があります
上記の方法のいずれか (またはすべて) を使用すると、coldfusion コードを try/catch コンストラクトでラップする必要があり、エラーの処理がはるかに簡単になります。
DBMS によっては、Try/catch コンストラクトにもアクセスできる場合があります。
**** 更新しました:
国際変換の問題に関するあなたのコメントを読んだ後、私は次の 2 つのアプローチから選択します。
私はコードなどをテストしていないことに注意してください....
まず、国際機能が役立つかもしれません。
http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_in-k_37.html
Setlocale を使用して場所を英語 (オーストラリア) に設定し、次に LSParseDateTime を使用して yyyy-mm-dd 形式で読み取り、dateformat を使用して mm/dd/yyyy または想定される日付形式を使用して mySQL に書き込みます。ただし、これらの LS 関数を扱った経験はあまりありません。
2 番目のオプションは、指定した正規表現を使用して入力が正しい構造であることを確認してから、createDate を使用して、解析された mm dd 要素と yyyy 要素を使用して米国形式の日付を作成します。isValid を使用して usdate を検証します。
これは、盲目的にコード化された 2 番目のオプションの試みです。このコードはテストしていないことを忘れないでください。リスト関数 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>
入力された値が有効な日付でない場合、これらの日付関数の少なくとも 1 つが例外をスローし、catch ブロックによって取得されると確信しています。
お役に立てれば。私は寝ます。