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 变量是一个空字符串。但是,我会收到一个指向该行的错误,并说“无法将值转换为请求的类型”,即使它不应该到达该行。

但真正奇怪的是……如果我在 WHERE 子句中添加“AND 1=1”,查询就可以完美运行。

我在一些查询中偶尔会发生这种情况,但我不能说我认识到它的模式。查询总是写得很完美。在某些情况下,查询之前正在工作,然后突然停止,可能是在文件中的其他地方发生更改时。我所要做的就是在 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 中有一个条件和。但是如果所有的 ands 都是假的,你最终会得到这样的查询:

select * from table where 1=1

即返回所有记录

如果你有一个或多个 ands 为真,而你没有 1=1,你最终会得到:

select * from table where and x = 1

..这不起作用。所以它只是一个简单的捷径来确保所有的ands都可以工作,无论你需要0还是全部。

于 2012-05-16T21:14:29.353 回答
2

无论如何,我认为查询不正确-子句中没有ANDOR结合了这两个部分。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 回答