为什么这个Left Join加入Coldfusion / MySQL导致无限循环?

时间:2012-07-10 20:39:34

标签: mysql coldfusion left-join infinite-loop

我正在Coldfusion8中运行搜索查询(MySQL 5.0.88)。

查询在Coldfusion中构造LEFT JOIN,如下所示:

<cfquery datasource="db" name="q">
    SELECT ...
</cfscript>

并循环结果以创建MySQL查询语法:

<cfset variables.pl= "LEFT JOIN pricelists p ON ">
<cfloop query="q" >
    <cfscript>
    if( q.listitem IS '' )    
        variables.pl = variables.pl & '(a.iln = p.iln AND p.pl= "-Standard-" AND p.ean = a.ean AND p.iln = "#q.iln_verkaeufer#") OR ';
    else
        variables.pl= variables.pl & '(a.iln = p.iln AND p.pl= "#q.pl#" AND p.ean = a.ean AND p.iln = "#q.userID#") OR
    </cfscript>
</cfloop>
<cfset variables.pl= variables.pl& "(1=0)">

所以决赛看起来像这样:

LEFT JOIN plist p ON (p.iln = a.iln AND p.pl= "-Standard-" AND p.iln = "1111111111111") OR (p.iln = a.iln AND p.pl= "I" AND p.iln = "1111122222221") OR (1=0) 

将其输入实际查询synatx:

SELECT art, count(*) as number
    FROM article a
    <cfqueryparam value="#variables.pl#" cfsqltype="cf_sql_longvarchar">
WHERE ...

如果我尝试触发此操作,服务器就会挂断,我需要重新启动浏览器选项卡才能结束会话。我已从我的选择中删除了所有其他搜索条件。引起错误的是cfqueryparam提供我的文本contstruct。

但是我不知道问题是什么,因为我从来没有得到过错误。浏览器已经死了,所以我想我正在创建某种无限循环。

问题
谁能告诉我的代码我做错了什么?

谢谢!

修改 我设法从服务器挂断转到提交错误。但由于脚本是由Ajax调用触发的,我无法远程访问CFadmin,我需要盲目解决问题所在。

1 个答案:

答案 0 :(得分:4)

你在这里做的不是cfqueryparam的目的,我建议你阅读cfqueryparam的正确用法 - http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f6f.html

将代码重构为类似的内容应该按照您的意图运行。我根据自己的喜好替换了标签脚本,如果这是您的偏好,请随意使用脚本。

<cfquery ...>
SELECT art, count(*) as number
FROM article a
LEFT JOIN pricelists p ON
<cfloop query="q" >
<cfif q.listitem IS ''>
    (a.iln = p.iln
    AND p.pl= "-Standard-"
    AND p.ean = a.ean
    AND p.iln = <cfqueryparam value='#q.iln_verkaeufer#' />
    )
<cfelse>
    (a.iln = p.iln
    AND p.pl= <cfqueryparam value="#q.pl#"/>
    AND p.ean = a.ean
    AND p.iln = <cfqueryparam value="#q.userID#" />
    )
</cfif>
<cfif NOT q.isLast()>OR</cfif>
</cfloop>
WHERE ...
</cfquery>