2016-08-31 7 views
2

私は、結合の処理、mysqlとcoldfusionの周りを頭で覆そうとしています。次のクエリは、最後の条件なしで機能します。Coldfusion CFQUERY(内部の結合と日付形式が機能しない)

 <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> 

それは存在していない私に、変数[W]を伝える

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

で死にかけています。私はここに行くように申し訳ありませんが、私が学んでいます...

+0

「死んでいる」とは、エラーがあることを意味しますか? –

+0

はい、「変数[W]は存在しません」 – mck

+2

また、cfquery paramを使用して変数をサニタイズすることを強くお勧めします。私はあなたがクエリータグ内にオクタゴを必要としないと確信していますが、cfqueryを使ってから1年以上経ちました。 –

答えて

8

問題はDateFormat()は、ColdFusionの関数であり、それはして適用することができないということですMySQLの「変数」(w)です。 MySQLの場合はMONTH()関数を使用し、それに日付を渡す必要があります。

あなたのフォーム入力をサニタイズすることを忘れないでください。あなたはSQLインジェクションに非常に敏感です。そのようcfqueryparamを使用します。

MONTH(w.start_date) = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.home_by_month#" /> 
0

作業溶液は、スターリングアーチャーに感謝された:ここ

<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 MONTH(w.start_date) = '#form.home_by_month#' 
    ORDER BY w.start_date ASC 
</cfquery> 
+1

これがあなたの解決策ならば、 'cfqueryparam'を使ってもSterlingのアドバイスを受けるべきです。データベースクエリでパラメータを送信するときは、常に 'cfqueryparam'を使います。 – beloitdavisja

+0

また、年ではなく月にフィルタリングすると、予期しない結果につながる可能性があります。 –

+0

さらに、特定の月*および*年のレコードを検索する場合は、[this paradigm]の使用を検討してください(http://stackoverflow.com/questions/13666883/date-comparison-in-ms-sql-2005/ 13687006#13687006)、これは 'Month()'を使うよりもフレキシブルです。 – Leigh

3

(コメントには長すぎる...)

を使用すると、CF、CFは、エラーが発生した理由を理解するのに役立つ可能性データベースクエリを処理する方法に少し背景に新しいもの言及したので、 cfquery内でどのようなことができますか(またできないか)。

CFはデータベースエンジンと通信できますが、この2つは完全に別個の言語であり、まったく別の言語を使用しています。 cfqueryタグ内にCFMLとSQLを混在させることができるという事実は、CF関数がデータベースオブジェクト(またはその逆)を操作できるという誤った印象を与えます。彼らはできません。 CFサーバーはデータベースオブジェクトについて何も認識していません(データベースエンジンはCFMLを認識しません)。クエリタグ内の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"という名前の構造体です。明らかにそのような変数は存在しない。したがって、未定義のエラーです。

+0

これは、言語変数とデータベース変数がどのようにしてクエリ内に共存するかを示す非常に良い説明です。 (また、こんにちは!) –

+0

ありがとうスターリング。 *いくつかの方法では、同じスクリプト内でクライアント(JS)とサーバー側コード(CF)を混合することに似ています。ちょうどあなたがそれらを混在することができるので、CFサーバーがクライアント側のコードを実行できることを意味しない、またはその逆;-) – Leigh

+1

ありがとうリー...非常に役立つ!!!! – mck

関連する問題