2014-12-03 32 views
3

首先,我對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

回答

0

這是我掀起的一個例子(對不起,如果它是簡潔的),它涵蓋了你已經與馬克討論過的東西。我也喜歡馬克的<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

    0

    你需要展示你是如何在你的代碼中進行導航的 - 這就是隱藏祕密醬的地方。你有你需要的一切(也許比你需要的更多)。

    你可能在你的代碼中有一個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

    -1

    我工作了這一點,使用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