为什么左侧加入Coldfusion/MySQL会导致无限循环?

问题描述:

我在Coldfusion8(MySQL 5.0.88)中运行搜索查询。为什么左侧加入Coldfusion/MySQL会导致无限循环?

查询构造了一个LEFT JOIN在ColdFusion中,像这样:

<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,所以我需要盲目解决问题。

你在做什么这里就不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> 
+0

哦。这更好。我继承了原来的剧本,并且试图从中创造出一些东西 – frequent 2012-07-10 21:22:32

+0

hm。用你的例子,我喜欢很多。但是在查询或任何查询结果后,我无法获得标志。即使是查询后的cfdump也不会触发。需要更多地了解这一点 – frequent 2012-07-10 21:46:45