0

データベースの一部をクライアントに公開する API を作成しています。この API の一部では、特定の条件に対して特定の HTML 応答コードを送信する必要があります。これは通常、単純なチェックで簡単ですが、(たとえば) 無効な日付が SQL に送信される 'InvalidDateTimeException' エラーをキャッチする方法がわかりません。

ERROR 変数と cfcatch 変数をダンプしようとしましたが、それらが大量のスタック トレースを生成する一方で、特定のタイプのエラーをチェックするために簡単に解析できるフィールドが見つかりません (エラー メッセージまたはスタック トレースでテキスト検索を行う以外に)。

次のような正規表現で事前チェ​​ックを行うこともできます

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

ただし、これでも無効な日付が生成される可能性があります。Coldfusion もいくつかの日付検証を提供しますが、特に悪いと読んだことがあります。これは、日付を扱わない他のシナリオにも役立ちません。

簡単に言うと、coldfusion で「InvalidDateTimeException」などの特定のエラーに対応する最善の方法は何ですか?

[編集] コメントからのいくつかの説明 - MYSQL 5 と cfqueryparams を使用しています。ここオーストラリアでは「ユーロ」の日付形式を使用していますが、混乱を避けるために、API ユーザーが ISO 形式の日付 (yyyy-mm-dd) を提示することをお勧めします。

4

1 に答える 1

2

まあ....私のアドバイスは、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 ブロックによって取得されると確信しています。

お役に立てれば。私は寝ます。

于 2013-06-06T02:20:43.683 に答える