<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
我做错了什么/如何解决这个问题?我检查并重新检查了我的表格,所有内容都已正确定义。
所以我试图让它来搜索所有这些,但忽略一个字段,如果省略一个?如果省略字段,我似乎无法将它们遗漏。
谢谢!
答案 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'
对city
和industry
WHERE 1=1 AND city = 'somevalue' AND industry = 'somevalue'
等等。
答案 1 :(得分:1)
您将要使用<cfqueryparam>
,因为
它可以列出值。
...
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>
...
请注意,上一个cfqueryparam
有list="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 =“是”。这是一个很棒的提示。 : - )