我有一个让我很烦恼的问题。我为Coldfusion 11上运行的页面编写了一个基本的分页工具:http://fftoolbox.scout.com/ffwc/rankings.cfm?rankings=season&page=2
我设计了它,以便有一个名为page的url查询来保存页码。这样,用户只需输入他想要的页码,而不必按下下一个和上一个按钮。
页面1 - 25的分页工作正常,但在第26页及之后,它将url.page变量记录为1,即使控件上的链接清楚地显示变量应该是第26页。
如果您注意到,我将coldfusion转储到页面顶部的URL范围。您将注意到,当页面等于或小于25时,将正确报告页面。但是,任何超过25的值,url.page都会被赋值为1,即使这不是根据浏览器发送的内容。我已经在FF,Chrome和IE中对此进行了测试,并且都表现出相同的行为。这让我相信它不是代码中的东西或基于浏览器的特性,而是可能是某种服务器设置。
以下是该项目的各种代码:
转储并设置会话变量。
<cfdump var='#url#'>
<cfif not StructKeyExists(url,'page')>
<cfset session.page = 1>
<cfelse>
<cfset session.page = url.page>
</cfif>
<cfset startingRank = (session.page - 1)*50 +1>
<cfset endingRank = (session.page - 1)*50 +50>
在SQL查询中使用此开始和结束排名来检索适当的玩家范围。我不包括SQL,除非有人请求它,因为它工作正常。事实上,当我将url.page硬编码为26时,一切都按预期工作。
上一页和下一页链接:
<tr><td colspan='2' style='text-align: center'>
<cfif session.page gt 1>
<a href='./rankings.cfm?rankings=season&action=#Evaluate(session.page - 1)#'>Previous</a>
</cfif></td>
<td colspan='2' style='text-align: center'>
<cfif session.page lt Evaluate(Int((GetMax.recordCount -1)/50) +1)>
<a href='./rankings.cfm?rankings=season&page=#Evaluate(session.page + 1)#'>Next</a>
</cfif></td></tr>
如果您需要更多信息,请与我们联系。我认为这实际上是Apache问题或CF问题,因为分页在第1到第25页上正常工作。
编辑:
我有一个显示查询的请求。有两个。一个用于获取数据,另一个用于获取整个数据集的计数。
<cfquery name='GetData' datasource='XXXXXXXX'>
select * from
(select @currentRank := @currentRank +1 as rank,player_name, point_sum, contest_type from
(select player_name,sum(points) as point_sum, contest_type, (select @currentRank := 0) r
from 2014_ranking_season
inner join ecom_item_type on ecom_item_type.ecom_item_type_id = 2014_ranking_season.contest_type
where contest_type = #session.filter#
group by player_name)t1
order by point_sum desc)t2
where rank between #startingRank# and #endingRank#
</cfquery>
<cfquery name='GetMax' datasource='XXXXXXXX'>
select * from
(select @currentRank := @currentRank +1 as rank,player_name, point_sum, contest_type from
(select player_name,sum(points) as point_sum, contest_type, (select @currentRank := 0) r
from 2014_ranking_season
inner join ecom_item_type on ecom_item_type.ecom_item_type_id = 2014_ranking_season.contest_type
where contest_type = #session.filter#
group by player_name)t1
order by point_sum desc)t2
</cfquery>
我希望有所帮助。请记住,除了我正在尝试的上一个按钮,一切正常,直到页面&gt; 25。
编辑:
GetMax.recordCount = 2242的值。此外,我正在编写一个缩小的小型复制页面,以便生成结果。完成后,我将发布整个页面的代码。无论它是否重现结果,它都会告诉我们SOMETHING。
编辑:
即使使用按比例缩小的代码,也可以使用复制页面并且错误可以重现。以下是网址:http://fftoolbox.scout.com/ffwc/testPagination.cfm?rankings=season&page=26
以下是整个代码清单:
<cfdump var='#url#'>
<cfset session.page = 1>
<cfif StructKeyExists(url,'page')>
<cfset session.page = url.page>
</cfif>
<cfset startingRank = (session.page - 1)*50 +1>
<cfset endingRank = (session.page - 1)*50 +50>
<cfif not StructKeyExists(session,'filter')>
<cfset session.filter = 0>
</cfif>
<cfparam name="url.rankings" default="season">
<html>
<head>
<title>Test Pagination</title>
</head>
<body>
<br /><br />
<cfoutput>
<table width='99%' cellpadding='5' cellspacing='0'><tr class='header'>
<cfset count = 0>
<cfquery name='GetData' datasource='fftoolbox_sql'>
select * from
(select @currentRank := @currentRank +1 as rank,player_name, point_sum, contest_type from
(select player_name,sum(points) as point_sum, contest_type, (select @currentRank := 0) r
from 2014_ranking_season
inner join ecom_item_type on ecom_item_type.ecom_item_type_id = 2014_ranking_season.contest_type
group by player_name)t1
order by point_sum desc)t2
where rank between #startingRank# and #endingRank#
</cfquery>
<cfquery name='GetMax' datasource='fftoolbox_sql'>
select * from
(select @currentRank := @currentRank +1 as rank,player_name, point_sum, contest_type from
(select player_name,sum(points) as point_sum, contest_type, (select @currentRank := 0) r
from 2014_ranking_season
inner join ecom_item_type on ecom_item_type.ecom_item_type_id = 2014_ranking_season.contest_type
group by player_name)t1
order by point_sum desc)t2
</cfquery>
<th>RANK</th><th>PLAYER NAME</th><th>TEAM NAME</th><th>POINTS</th></tr>
<cfloop query='GetData'>
<cfquery name='GetOneName' datasource='fftoolbox_sql'>
select team_name
from 2014_ranking_season
where player_name = <cfqueryparam cfsqltype='CF_SQL_VARCHAR' value='#GetData.player_name#'>
limit 1
</cfquery>
<cfset name = URLEncodedFormat(#player_name#)>
<tr <cfif #count#%2 eq 0>class='evenRow'<cfelse>class='oddRow'</cfif>><td>#rank#</td>
<td><a href='./player.cfm?name=#variables.name#' target='_blank'>#player_name#</a></td><td>#GetOneName.team_name#</td><td>#point_sum#</td></tr>
<cfset count++>
</cfloop>
<tr><td colspan='2' style='text-align: center'>
<cfif session.page gt 1>
<a href='./testPagination.cfm?rankings=season&page=#Evaluate(session.page - 1)#'>Previous</a>
</cfif></td>
<td colspan='2' style='text-align: center'>
<cfif session.page lt Evaluate(Int((GetMax.recordCount -1)/50) +1)>
<a href='./testPagination.cfm?rankings=season&page=#Evaluate(session.page + 1)#'>Next</a>
</cfif></td></tr>
</table>
</cfoutput>
</body>
</html>
我还将获得要在该页面上显示的http请求标头。如果人们想要的话,我会把它们放在问题中,但是问题开始变得很长,cfdump在浏览器中很好地格式化了。感谢大家到目前为止的互动。
更新:
我怀疑我们的配置团队,我无法控制,可能在后端做了一些事情,比如把它放在Varnish上,这不应该发生。请继续查看代码等,我会咆哮这棵树,看看他们是否有所做的事情。 25似乎只是&#34;人类&#34;一个数字,它不是一个设置的地方。我会及时向大家发布。
更新:
我已经与配置团队核实过,并且Varnish没有激活,并且负载平衡不会导致问题,因为我可以在绕过LB时复制该问题。我认为这是Apache或CF的配置问题似乎越来越有可能在我们排除规则之外。
更新:
在添加@Leigh建议的代码后,我们发现http请求肯定是page = 26,并且URL范围肯定是page = 1。我正在寻找一个应用程序文件可能会搞乱它。
最终更新:
检查Application.cfm后,我找到了以下代码:
<cfif cgi.script_name NEQ "/ffwc/all-time-leaderboard.cfm">
<cfset ValidPages = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25">
<cfif IsDefined("url.page") and ListFind(ValidPages,url.page) eq 0>
<cfset url.page = 1>
</cfif>
</cfif>
在评论完之后,分页工作得很好。使其工作的另一种替代方法是不使用page作为页面的变量名。 (这对我来说是违反直觉和令人反感的)我认为像分页这样的结构应该包含在一个文件或目录中,而不是在网站范围内。
答案 0 :(得分:3)
检查Application.cfm后,我找到了以下代码:
<cfif cgi.script_name NEQ "/ffwc/all-time-leaderboard.cfm">
<cfset ValidPages = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25">
<cfif IsDefined("url.page") and ListFind(ValidPages,url.page) eq 0>
<cfset url.page = 1>
</cfif>
</cfif>
在评论完之后,分页工作得很好。使其工作的另一种替代方法是不使用page作为页面的变量名。 (这对我来说是违反直觉和令人反感的)我认为像分页这样的结构应该包含在一个文件或目录中,而不是在网站范围内。
感谢所有评论的人,并帮助我完成了这项工作。
答案 1 :(得分:1)
首先,您的&#34;之前&#34;按钮不是设置URL.page
或session.page
- 使用&#34;操作。&#34;由于page
未在网址中定义,因此会自动将网页设置为一个...所以点击&#34;之前的&#34;然后&#34; next&#34;无论我从哪里开始,总会让我回到第2页。
现在,你的&#34;下一个&#34;链路...
<cfif session.page lt Evaluate(Int((GetMax.recordCount -1)/50) +1)>
<a href='./rankings.cfm?rankings=season&page=#Evaluate(session.page + 1)#'>Next</a>
</cfif>
我在我自己的.cfm页面设置session.page
之后运行了这段代码......
A&#34;下一个&#34;只有session.page
为零或GetMax.recordcount
超过session.page
值的50倍时才会显示按钮。我提出这个问题因为GetMax.recordcount不应该改变。您一次显示50条记录。
以下代码不起作用,所以我不知道你在做什么......
<cfset GetMax.recordcount = 50>
<cfset session.page = 1>
<cfoutput>
<cfif session.page lt Evaluate(Int((GetMax.recordCount -1)/50) +1)>
<a href='./rankings.cfm?rankings=season&page=#Evaluate(session.page + 1)#'>Next</a>
</cfif>
</cfoutput>
可能是向我们展示查询逻辑的时候了。
为什么不做这样的事情?
<cfset StartRecord = #url.page# * 50 - 49>
<cfquery name="listOfPeople" datasource="XXX">
SELECT TOP 50 *
FROM PeopleTable
WHERE PeopleID >= #StartRecord#
</cfquery>
这很简单,我只是不知道为什么需要查询GetMax
。所有额外的数学运算只会增加错误的风险。分页不应该是一个自己的项目。