Coldfusion网址变量意外更改

时间:2015-07-22 20:43:33

标签: apache coldfusion

我有一个让我很烦恼的问题。我为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中对此进行了测试,并且都表现出相同的行为。这让我相信它不是代码中的东西或基于浏览器的特性,而是可能是某种服务器设置。

以下是该项目的各种代码:

  1. 转储并设置会话变量。

    <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>
    
  2. 在SQL查询中使用此开始和结束排名来检索适当的玩家范围。我不包括SQL,除非有人请求它,因为它工作正常。事实上,当我将url.page硬编码为26时,一切都按预期工作。

    1. 上一页和下一页链接:

      <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>
      
    2. 如果您需要更多信息,请与我们联系。我认为这实际上是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作为页面的变量名。 (这对我来说是违反直觉和令人反感的)我认为像分页这样的结构应该包含在一个文件或目录中,而不是在网站范围内。

2 个答案:

答案 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.pagesession.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。所有额外的数学运算只会增加错误的风险。分页不应该是一个自己的项目。