0

cfquery を作成しましたが、正当な理由もなく機能しないことが何度かありました。たとえば、最近、次のようなクエリがありました。

<cfquery name="get_projects" datasource="#application.dsn#">
        SELECT *
        FROM   projects
        WHERE  project_id = <cfqueryparam cfsqltype="cf_sql_integer" value="#project_id#">

          <cfif start_date NEQ "">
               AND project_start_date = <cfqueryparam cfsqltype="cf_sql_timestamp" value="#start_date#">
          </cfif>

        ORDER BY project_name
    </cfquery>

start_date 変数が空の文字列であることを確認しました。ただし、その行を指すエラーが表示され、「値を要求された型に変換できません」というエラーが表示されますが、その行に到達することはありません。

しかし、ここで本当に奇妙なことがあります.. "AND 1=1" を WHERE 句に追加すると、クエリは完全に機能します。

これは多くのクエリで散発的に発生しましたが、パターンを認識しているとは言えません。常にクエリは完璧に書かれています。場合によっては、クエリが以前は機能していたのに、おそらくファイルの別の場所で変更があったときに、突然停止することがあります。WHERE 句に「AND 1=1」を追加するだけで、再び機能します。他の誰かがこれに遭遇したり、それを修正する方法を考えていますか?

4

5 に答える 5

4

多くの開発者が使用するショートカットです。ここに例を示します

select * from table where 1 = 1
<cfif x EQ 1>and x = 1</cfif>
<cfif y EQ 1>and y = 1</cfif>
<cfif z EQ 1>and z = 1</cfif>

これは常に機能します。3つのifに条件付きandがあります。しかし、すべての and が false の場合は、次のクエリになります。

select * from table where 1=1

つまり、すべてのレコードを返します

1 つまたは複数の AND が true で、1=1 がない場合は、次のようになります。

select * from table where and x = 1

..これは機能しません。したがって、すべてのandが必要かどうかに関係なく、すべてのandが確実に機能するようにするための簡単なショートカットです。

于 2012-05-16T21:14:29.353 に答える
2

とにかくクエリが正しいとは思いません-句に2つの部分がないANDか、OR結合されていません。WHERE

于 2012-05-16T20:42:42.160 に答える
1

上記のクエリがそのまま実行される方法がわかりません。

CFIF ステートメントに AND を追加しました。これは実行されるはずです (cfqueryparams.

SELECT *
FROM   projects
WHERE  project_id = <cfqueryparam>
       <cfif start_date NEQ "">
          AND project_start_date = <cfqueryparam>
      </cfif>
ORDER BY project_name

私はよく、次のような「AND 1=1」ステートメントを使用します。ここでは、1 = 1 で WHERE 句を開始します。

SELECT *
FROM   projects
WHERE  1 = 1
       AND project_id = <cfqueryparam>
       <cfif start_date NEQ "">
          AND project_start_date = <cfqueryparam>
      </cfif>
ORDER BY project_name
于 2012-05-16T21:09:18.870 に答える
1

クエリが正しくコンパイルされず、その中のテキストの一部を変更すると (1=1 を追加するなど)、クエリが再コンパイルされるのを見てきました。

于 2012-05-16T21:12:10.850 に答える
0

IIRC、 aTimestampは a と同じではありませんDate。MSSQL Server を使用している場合は、http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx を参照してください。

<cfqueryparam cfsqltype="cf_sql_timestamp" value="#start_date#">

する必要があります

<cfqueryparam cfsqltype="cf_sql_date" value="#start_date#">

追加するAND 1=1と、サーバーのクエリ オプティマイザーが WHERE 述語全体を無視するようになる可能性があります。

于 2012-05-16T20:49:56.940 に答える