CFQuery给奇数内部服务器500错误

时间:2017-01-10 19:23:54

标签: sql-server tsql coldfusion cfquery

<cfif structKeyExists(url, 'results')>
   <cfquery datasource="UIAAWeb" name="fullQuery"> 
       SELECT *
       FROM BusinessDirectory
       ORDER BY businessname
   </cfquery> 
<cfelse>
   <cfquery datasource="UIAAWeb" name="BusinessQuery">
       SELECT *
       FROM   BusinessDirectory
       WHERE 
       <!--- Matches Exact Last Name if Match Radio is selected --->
       <cfif #form.match# is "yes"> 
          businessname = '#form.keyword#' 
       </cfif> 
       <!--- Matches Last Names Starting with user inputted letter --->
       <cfif (#match# is "no") AND (#form.keyword# neq "")> 
           businessname LIKE '#form.keyword#%' 
       </cfif>
       <!--- Gets all award types from selected field of awards --->
       <cfif #form.industry# neq "*"> 
           AND industry IN ('#form.industry#')
       </cfif>

       <!--- Matches Exact Last Name if Match Radio is selected --->
       <cfif #form.match1# is "yes"> 
           AND city = '#form.city#' 
       </cfif> 
       <!--- Matches Last Names Starting with user inputted letter --->
       <cfif (#match1# is "no") AND (#form.city# neq " ")> 
           AND city LIKE '#form.city#%' 
       </cfif>

       <!--- Gets all award types from selected field of awards --->
       <cfif #form.state# neq "*"> 
           state IN ('#form.state#')
       </cfif>

       <!--- Gets all award types from selected field of awards --->
       <cfif #form.country# neq "*"> 
           country IN ('#form.country#')
       </cfif>

    ORDER BY #sort#
</cfquery> 

我正在尝试编写类似的搜索查询,但是当我继续执行搜索页面时,我收到内部服务器错误500:

  

元素CITY未在FORM中定义。特定的文件序列   包括或处理的是:   C:\ inetpub \ wwwroot \ business \ search \ search_results.cfm,line:139

如果我从查询的所有区域删除city,我会收到此错误:

  

执行数据库查询时出错。关键字附近的语法不正确   '和'。包含或处理的特定文件序列是:   C:\ inetpub \ wwwroot \ business \ search \ search_results.cfm,行:146

如果我从任何地方删除AND,我都会收到此错误

  

执行数据库查询时出错。关键字附近的语法不正确   '行业'。包含或处理的特定文件序列是:   C:\ inetpub \ wwwroot \ business \ search \ search_results.cfm,行:146

我做错了什么/如何解决这个问题?我检查并重新检查了我的表格,所有内容都已正确定义。

searchform

所以我试图让它来搜索所有这些,但忽略一个字段,如果省略一个?如果省略字段,我似乎无法将它们遗漏。

谢谢!

3 个答案:

答案 0 :(得分:3)

看起来像是动态生成SQL WHERE子句的问题。

您似乎拥有一个裸WHERE个关键字。如果businessname上没有条件, businessname = 'val' 部分将不会包含在SQL文本中。因此生成的SQL将无效。

如果businessname上没有条件,但industry上有一个条件,则代码将生成无效的SQL构造,如下所示:

WHERE AND industry = 'someval'
      ^^^

(在该构造中,令牌AND是意外的关键字.MySQL并不期望这样。)

如果我们修改代码以删除AND关键字来解决该问题,我们就会产生另一个问题。当它执行并且businessname上存在条件时,代码将生成一个看起来像这样的无效SQL构造(因为我们删除了AND关键字):

WHERE businessname = 'val' industry = 'someval'
                           ^^^^^^^^

(在该结构中,当MySQL遇到industry时,它希望找到一个关键字标记,例如AND

要解决此问题,我建议使用如下代码模式:

从以 " WHERE 1=1" 结尾的查询文字开始。

这并不会影响查询,因为条件将始终评估为TRUE。 (优化器会把它扔掉。)我们只包括它,这样它可以使我们的代码的其余部分更简单。

稍后在代码中,当我们需要在WHERE子句中附加谓词(条件)时,我们只使用 AND 关键字。 (我们记得在关键字之前包含所需的空格。)我们追加:

 " AND somecol = 'somevalue'"

对于我们可能需要添加到WHERE子句的每个搜索条件,我们遵循相同的模式。

最终结果是,即使我们没有添加任何条件,我们也会获得有效的WHERE条款。

如果我们确实添加谓词(搜索条件),我们的代码不需要关心WHERE关键字是否已经包含在语句中。添加的第一个谓词需要使用WHERE关键字而不是AND。我们需要跟踪这一点。我们附加的第一个条件需要WHERE关键字,后续条件需要AND

由于对谓词是否将附加到语句进行了多次条件检查,因此我们需要在每次要附加到语句时进行检查。我们需要问一下我们是否已经启动了WHERE条款?&#34;或者&#34;这是WHERE条款中的第一个条件?&# 34;

通过声明包含 WHERE 1=1 ,我们可以更轻松地完成工作。我们不需要跟踪我们是否已添加WHERE关键字。

模式的最终结果,我们得到一个看起来更有趣的SQL语句(具有普通的1=1条件)。但另一方面,我们得到了稍微简单的代码。

遵循该模式,我们希望我们的代码能够生成如下的SQL语句:

没有在声明中添加搜索条件:

  WHERE 1=1

这是有效的。

city ...

上搜索条件
  WHERE 1=1 AND city = 'somevalue'

再次,这是有效的。

industry ...

上搜索条件
  WHERE 1=1 AND industry = 'somevalue'

cityindustry

的搜索条件
  WHERE 1=1 AND city = 'somevalue' AND industry = 'somevalue'

等等。

答案 1 :(得分:1)

您将要使用<cfqueryparam>,因为

  1. 您的代码容易受到SQL注入攻击
  2. 它可以列出值。

    ...
    WHERE 1= 1
    
    <!--- Matches Exact Last Name if Match Radio is selected --->
    <cfif form.match is "yes"> 
       AND businessname = <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#form.keyword#"> 
    </cfif> 
    <!--- Matches Last Names Starting with user inputted letter --->
    <cfif (form.match is "no") AND (form.keyword neq "")> 
        AND businessname LIKE <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#form.keyword#%"> 
    </cfif>
    <!--- Gets all award types from selected field of awards --->
    <cfif form.industry neq "*"> 
       AND industry IN (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#form.industry#" list="yes">)
    </cfif>
    
    ... 
    
  3. 请注意,上一个cfqueryparamlist="yes"

答案 2 :(得分:0)

雅各布,如果你还在寻找解决方案,那就像每个人都建议试试这个。

    <section id="video-container">
        <video id="video-player" controls="controls" poster="" src="" data-description=""></video>

        <div id="description" label="" type="text"> </div>

        <ul id="playlist">
            <li id="videoweek" data-description movieurl="http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" label="This is video number 1 " type="video/mp4" moviesposter="http://html5videoformatconverter.com/data/images/screen.jpg">
                <img src="http://html5videoformatconverter.com/data/images/screen.jpg" class="video-thumbnail">

            </li>
            <li id="videoweek" data-description="video 1" movieurl="http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" label="This is video number 2 " type="video/mp4"> <img src="http://html5videoformatconverter.com/data/images/screen.jpg" class="video-thumbnail"></li>

             <li id="videoweek" data-description="video 2"n movieurl="http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" label="This is video number 3 " type="video/mp4"> <img src="http://html5videoformatconverter.com/data/images/screen.jpg" class="video-thumbnail"></li>

              <li id="videoweek" data-description="video 3" movieurl="http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" label="This is video number 4 " type="video/mp4"> <img src="http://html5videoformatconverter.com/data/images/screen.jpg" class="video-thumbnail"></li>

               <li id="videoweek" data-description="video 4" movieurl="http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" label="This is video number 5 " type="video/mp4"> <img src="http://html5videoformatconverter.com/data/images/screen.jpg" class="video-thumbnail"></li>


        </ul>



    </section>
$(function() {
$("#playlist li").on("click", function() {
    $("#video-player").attr({
        "src": $(this).attr("movieurl"),
        "poster": "",
        "autoplay": "autoplay",
        "data-description": $(this).attr("data-description")
    })
})
 $("#playlist li").on("click", function() {
    $("#description").attr({
        "label": $(this).attr("label")
    }).text($(this).attr("label"))
})
$("#video-player").attr({
    "src": $("#playlist li").eq(0).attr("movieurl"),
    "poster": $("#playlist li").eq(0).attr("moviesposter"),
    "data-description": $("#playlist li").eq(0).attr("data-description")
    })
})

document.addEventListener('DOMContentLoaded', init, false)
      var videoId = document.getElementById('video-player')
      //var videoTitle = $(this).attr('data-description')


      var videoTitle = $('#videoweek').click(function () {
                           console.log($(this).attr('data-description'));
                       });
      console.log(videoTitle);

      function init () {
        videoId.addEventListener('ended', videoEnd, false)
        videoId.addEventListener('timeupdate', videoTimeUpdate, false)
        videoId.addEventListener('play', videoPlay, false)
        videoId.addEventListener('pause', videoPause, false)
      }

      function setKeyFrames (duration) {
        var quarter = (duration / 4).toFixed(1)
        sessionStorage.setItem('one', quarter)
        sessionStorage.setItem('two', (quarter * 2).toFixed(1))
        sessionStorage.setItem('three', (quarter * 3).toFixed(1))
      }

      function videoTimeUpdate () {
          var curTime = videoId.currentTime.toFixed(1)
          switch (curTime) {
            case sessionStorage.getItem('one'):
              ga('send', 'event', 'video', '25% video played', videoTitle)
              sessionStorage.setItem('one', null)
            case sessionStorage.getItem('two'):
              ga('send', 'event', 'video', '50% video played', videoTitle)
              sessionStorage.setItem('two', null)
            case sessionStorage.getItem('three'):
              ga('send', 'event', 'video', '75% video played', videoTitle)
              sessionStorage.setItem('three', null)
          }
      }

      function videoEnd () {
        ga('send', 'event', 'video', '100% video played', videoTitle)
      }

      function videoPlay () {
        ga('send', 'event', 'video', 'video played', videoTitle)
        setKeyFrames(this.duration)
      }

      function videoPause () {
        ga('send', 'event', 'video', 'video paused', videoTitle)
      }

然后,您可以将其他表单元素添加到查询中,如城市,地址或其他表单条目。宝贝步骤,一步一步。

此外,cfqueryparam的建议是现货。不知道你可以做list =“是”。这是一个很棒的提示。 : - )