Coldfusion和分页

问题描述:

首先,我对ColdFusion非常陌生,但我的学习速度非常快。因此,我正在尝试构建一个大型数据库,该数据库最初显示每页25行的所有结果,并具有下一个/ prev链接来浏览页面。Coldfusion和分页

这一切都很好,但是当我执行搜索,并且当新的结果显示大约几页的值时,分页链接不起作用。当我点击“下一个”链接时,它会回到原始的所有记录显示。我该如何解决这个问题,或者我需要做些什么才能使其工作?

对不起,我是新的发布,这是我的第一个。希望这是更好的。

我分页代码...

<cfset Next = StartRow + DisplayRows> 
<cfset Previous = StartRow - DisplayRows> 

<cfoutput> 
    <cfif Previous GTE 1> 
    <a href="#CGI.Script_Name#?StartRow=#Previous#"><b>Previous #DisplayRows# Records</b></a> 
    <cfelse> 
    Previous Records 
    </cfif> 
    <b> | </b> 
    <cfif Next lte records.RecordCount> 
    <a href="#CGI.Script_Name#?StartRow=#Next#"><b>Next 
    <cfif (records.RecordCount - Next) lt DisplayRows> 
     #Evalute((records.RecordCount - Next)+1)# 
    <cfelse> 
     #DisplayRows# 
    </cfif>Records</b></a> 
    <cfelse> Next Records 
    </cfif> 
<cfoutput> 

我在上面的代码...

<cfparam name="StartRow" default="1"> 
<cfparam name="DisplayRows" default="25"> 

<cfset ToRow = StartRow + (DisplayRows - 1)> 
<cfif ToRow gt records.RecordCount> 
    <cfset ToRow = records.RecordCount> 
</cfif> 

让我知道如果你需要看到更多...谢谢。

+2

您需要张贴一些代码。不是整个脚本,只是与分页相关的部分。 – Leigh 2014-12-03 13:51:59

+1

你不需要评估() - #(records.recordcount - next)+ 1#会输出很好。 – 2014-12-03 14:48:54

+1

我会将您的页面参数更改为“PageNumber”而非“StartRow”,从用户角度来看,链接到pagenumbers而非startvern是有意义的。 – Jarede 2014-12-03 14:51:02

这是我掀起的一个例子(对不起,如果它是简洁的),它涵盖了你已经与马克讨论过的东西。我也喜欢马克的<cfloop>上面的例子(下面)。大声笑......这种反应何时结束。

因此,我们有:

  • 查询总记录(最大)
  • 在你的范围
  • 在你的射程结束开始
  • 每页

  • 输出与奖金页次查询字符串为您的下一个记录组(我认为是你想要的)。

    那看起来就这样在你的页面:

    <cfparam name="pageNum" default="1"> 
    
    <cfquery name="q" datasource="#application.dsn#"> 
        select * from yourTable 
    </cfquery> 
    
    <cfset maxRows = 10> 
    <cfset startRow = min((pageNum-1) * maxRows+1, max(q.recordCount,1))> 
    <cfset endRow = min(startRow + maxRows-1, q.recordCount)> 
    <cfset totalPages = ceiling(q.recordCount/maxRows)> 
    
    <cfset loopercount = round(q.recordCount/10)> 
    
    <cfoutput> 
        <cfloop from="1" to="#looperCount#" index="i"> 
          <a href="?pageNum=#i#">#i#</a> 
        </cfloop> 
    </cfoutput> 
    
    <br><br> 
    
    <cfoutput 
        query="q" 
        startrow="#startRow#" 
        maxrows="#maxRows#"> 
    
        #id#<br> 
    
    </cfoutput> 
    
  • +0

    感谢这个代码...这是一个很好的设置,是我可以肯定的工作。 :) – CatherineL 2014-12-05 13:48:13

    +0

    @CatherineL不客气!我想有一个简化/完整的软件包将是有用的:)编辑...此外,如果这解决了你的特殊问题点击我甜蜜的绿色复选框! – 2014-12-05 14:20:33

    +0

    我会点击绿色的支票,但这并没有真正解决我的问题。当我点击下一页或数字时,它仍会重置为所有结果。我仍在搞清楚如何做到这一点。 – CatherineL 2014-12-08 14:46:20

    你需要展示你是如何在你的代码中进行导航的 - 这就是隐藏秘密酱的地方。你有你需要的一切(也许比你需要的更多)。

    你可能在你的代码中有一个cfoutput或cfloop。你会用你的STARTROWdisplayrows输出行的一组数记录 - 像这样:

    <Cfoutput query="records" startrow="#next#" maxrows="#displayrows#"> 
    
    ... code to output your data goes here 
    
    </cfoutput> 
    

    如果您正在使用CFLOOP是相似的。

    <Cfloop query="records" startrow="#next#" endrow="#next+displayrows#"> 
    
    ...code to output your data. 
    
    </cfloop> 
    

    您也可以使用索引循环,像这样:

    <cfloop from="#next#" to="#next+displayrows#" index="x"> 
    
    .... your outputs will look like this: 
    #records[columname][x]# 
    
    </cfoutput> 
    

    希望这些样品的人会按门铃。您放入代码片段的逻辑只是创建一个起点并定义多少个循环。这是输出记录要显示的记录。

    另请注意评论 - 你差不多从来没有在你的代码中需要evaluate()

    +0

    我现在的方式是像你列出的第一个。有没有更好的方法来做到这一点? – CatherineL 2014-12-03 15:02:52

    +1

    重读你的问题凯瑟琳,它似乎也许你没有传递搜索参数。每个新页面的链接都需要重新运行_search query_ - 因此您需要确保在分页链接中包含搜索变量。也许这是你的问题? – 2014-12-03 15:08:29

    +0

    好吧,我在想那个,但不知道该怎么做那部分......有没有一种简单的方法/如何做到这一点的例子?或者你能指导我到哪里我可以找到如何做到这一点? – CatherineL 2014-12-03 15:18:33

    我工作了这一点,使用CFFORM标签与BACK - 更多 - HOME提交按钮。

    第一页有查询ID 1到25和更多提交按钮。 隐藏字段是计数25

    下一个页面有HOME和更多的按钮 首页有1 更多隐藏字段有计数的隐藏字段+ 25(50)

    下一个页面有返回首页和多个按钮 回到了计数的隐藏字段 - 25 HOME具有1 MORE隐藏字段有计数+ 25(75)

    等的隐藏字段。

    查询根据使用的提交按钮的值的隐藏字段的数目创建查询WHERE和输出的25行

    <cfif submit IS "NEXT"> 
    
        <cfset count1 = #count# + 1> 
        <cfset count2 = #count# + 25> 
    
    <cfelseif submit is "BACK"> 
    
        <cfset count1 = #count# - 26> 
        <cfset count2 = #count#> 
    
    <cfelseif submit is "HOME"> 
    
        <cfset count1 = 1> 
        <cfset count2 = 25> 
    
    </cfif> 
    

    在查询

    SELECT * 
    FROM mytabl 
    WHERE ID BETWEEN #count1# AND #count2# 
    

    显示

    <table> 
        <cfoutput query="myquery"> 
        <tr> 
         <td> 
         #my data1# 
         </td> 
         <td> 
         #my data2# 
         </td> 
        </cfoutput> 
        </tr> 
        <table> 
    
    +0

    不要假设id是连续的,因为如果记录被删除,分页逻辑会中断。该代码可能显示的记录太少或根本没有。另外,总是使用'cfqueryparam'。它使用绑定变量来防止SQL注入并提高性能。 – Leigh 2014-12-05 14:07:04

    +0

    我不知道为什么我停靠试图有帮助。既然如此,你可能会为第25条记录做好准备,而你的隐藏可能是最后一个ID ......我只是想给CatherineL一个起点...... – Andy 2014-12-05 21:26:52

    +0

    我投下了这个票,因为它不正确,将无法可靠地工作。再加上sql将数据库暴露给sql注入。隐藏领域的方法遭受同样的逻辑问题。 ID值!=记录号码。虽然帮助总是值得赞赏,但提供准确的信息非常重要。特别是对那些新的语言。 – Leigh 2014-12-05 22:58:16