2

私は、結合、mysql、およびコールドフュージョンの処理に頭を悩ませようとしています。次のクエリは、最後の条件なしで機能します。

        <cfquery name="GetWeekends">
        SELECT w.id, w.weekend_type, w.community_id, w.start_date, w.end_date,
          w.language,
          c.community_id, c.location, c.language, c.state, c.country
        FROM _weekends w
        INNER JOIN _communities c
        ON w.community_id=c.community_id
        WHERE w.weekend_type = 1 AND w.start_date > Now() AND           
        #DateFormat(w.start_date, "m")# = '#form.home_by_month#'
        ORDER BY w.start_date ASC
        </cfquery>

それは死んでいる

  #DateFormat(w.start_date, "m")#

変数 [W] が存在しないことを教えてくれます。申し訳ありませんが、私はここに行きながら学んでいます...

4

3 に答える 3

3

(コメントが長くなりました…)

CF は初めてだとおっしゃっていたので、CF がデータベース クエリをどのように処理するかについて少し背景を知っておくと、エラーが発生した理由と、cfquery 内で実行できる (および実行できない) ことの種類を理解するのに役立つ場合があります。

CF はデータベース エンジンと通信できますが、この 2 つは完全に分離しており、まったく異なる言語を話します。cfquery タグ内で CFML と SQL を混在させることができるという事実は、CF 関数がデータベース オブジェクトを操作できる(またはその逆) という誤解を招く印象を与えます。彼らはできません。CF サーバーは、データベース オブジェクトについて何も認識しません (データベース エンジンも CFML を認識しません)。query タグ内のすべての CFML コードが最初に処理されます (CF サーバー上)。生成された SQL はデータベース エンジンに送信され、個別に実行されます。

CF サーバーは、データベース クエリを検出すると、タグの内容を解析し、評価する必要のある CFML 変数または式を探します。

SELECT Column FROM Table WHERE ColA = '#form.someField#' AND ColB = '#form.otherField#'

次に、これらの変数と式を文字列、数値などのリテラル値に変換します。最後に、CF は生成された SQL 文字列を実行のためにデータベース エンジンに渡します。

SELECT Column FROM Table WHERE ColA = 'John Smith' AND ColB = 'ABC'

したがって、CF が詰まる理由は、データベース列の参照を#DateFormat(w.start_date, "m")#理解していないためです。w.start_dateこれは、CF 変数の名前であると考えられます。具体的には、キー「start_date」を含む「w」という名前の構造体です。明らかに、そのような変数は存在しません。したがって、未定義のエラー。

于 2016-09-01T03:33:56.710 に答える