Board logo

標題: 11-1-3 顯示留言的網頁 [打印本頁]

作者: 小誌    時間: 2011-4-23 23:19     標題: 11-1-3 顯示留言的網頁

11-1-3   顯示留言的網頁
顯示留言的網頁guest.php,具有三項功能:
1.管理模式與一般瀏覽模式切換。
2.顯示私人留言與否。
3.分頁瀏覽與跳頁選擇。
[attach]5754[/attach]
圖11-6   guest.php網頁畫面。

本留言板具備發言內容涉及敏感話題或是涉及私人隱私的發言可用『悄悄話』的方式發言與顯示,同時也希望板主能針對某位特定網友所發表的意見作出獨立的回應,因此,我們『顯示留言意見』的網頁就必須具備顯示模式選擇的功能,當顯示模式在一般情況時要能顯示網友們的一般性發言,同時還得將『悄悄話』的發言隱藏起來:
[attach]5755[/attach]
圖11-7  『悄悄話』功能。

當板主以密碼登入成為管理模式時,則將一般性發言與悄悄話發言的資料全部顯示出來,同時還得讓板主可以針對某位特定網友所發表的意見作出獨立的回應:
[attach]5756[/attach]
圖11-8  管理模式。
作者: 小誌    時間: 2011-4-23 23:21

進入管理模式
您應該發現到:當我們在一般顯示模式時(不會顯示悄悄話的發言),在網頁最下方將會有一個輸入密碼進入『板主管理』模式的欄位,而當我們以密碼登入管理模式時,則在網頁最下方會有一個『離開管理模式』的按鈕!
我們先來看看這兩個情況是如何產生的,請先檢視下列這段網頁敘述:
  1. <!-----管理模式選擇---------->
  2. <form method="post">
  3. <?if (@$_SESSION["checkedit"]=="yes") {?>
  4. <input type="hidden" value="yes" name="goexit">
  5. <input type="submit" value="離開管理模式">
  6. <?
  7. }
  8. else{
  9. ?>
  10. 密碼:<input type="text" name="password" size="4" maxlength="4">&nbsp&nbsp<input type="submit" value="板主管理">
  11. <?}?>
  12. </form>
複製代碼
在上面這段網頁敘述中,我們可以清楚的知道:要顯示一般模式或管理模式,完全得靠一個Session物件來決定!Session 物件用來記錄使用者的相關資訊,提供使用者再次對此網頁伺服器要求時作確認,例如,使用者帳號與密碼的確認,有 Session 物件的建立,來保留身分認證的結果,則使用者不用於瀏覽每一網頁時都需輸入密碼作確認。在本範例中,我們則利用Session物件來記錄目前的工作模式。

既然我們是利用Session物件來記錄目前的工作模式,那我們該如何變更Session物件記錄的『變數』值呢?很容易!請接著來看看我們管理模式的PHP程式:
  1. //*****管理模式檢驗*****
  2. //以下為進入管理模式的敘述
  3. if (isset($_REQUEST["password"]))
  4. {
  5.   if ($_REQUEST["password"]=="test")//<-----管理密碼
  6.      {
  7.       $_SESSION["checkedit"]="yes";
  8.      }
  9. }

  10. //以下為脫離管理模式的程式敘述
  11. if (isset($_REQUEST["goexit"]))
  12. {
  13.   if ($_REQUEST["goexit"]=="yes")
  14.      {
  15.       $_SESSION["checkedit"]="no";
  16.      }
  17. }
複製代碼
當我們第一次進入『顯示留言意見』網頁的時候,我們所見的網頁畫面一定是一般模式!為什麼?因為Session尚未被建立,因此它的『變數』值一定不會是「yes」,所以網頁中會出現一個輸入密碼進入『板主管理』模式的欄位,只有當我們輸入密碼按下『板主管理』的按鈕引發PHP程式中的進入管理模式敘述後,Session物件才會被建立,同時,『checkedit』Session物件變數值被設定為「yes」,因此就能進入管理模式,將一般性發言與悄悄話發言的資料全部顯示出來,同時還讓板主可以針對某位特定網友所發表的意見作出獨立回應。
[attach]5757[/attach]
圖11-9  管理模式驗證。
作者: 小誌    時間: 2011-4-23 23:22

當我們進入管理模式頁面後,您將發現網頁最下方,原本的密碼登入欄位不見了,而以『離開管理模式』的按鈕取代:
[attach]5758[/attach]
圖11-10  進入管理模式。
這是因為Session物件被建立了,而且變數值被設定為「yes」,網頁中的敘述就變為:
  1. <!-----管理模式選擇---------->
  2. <form method="post">
  3. <input type="hidden" value="yes" name="goexit">
  4. <input type="submit" value="離開管理模式">
  5. </form>
複製代碼
當我們要脫離管理模式而按下『離開管理模式』的按鈕後,則會引發脫離管理模式的PHP程式敘述:
  1. //以下為脫離管理模式的程式敘述
  2. if (isset($_REQUEST["goexit"]))
  3. {
  4.   if ($_REQUEST["goexit"]=="yes")
  5.      {
  6.       $_SESSION["checkedit"]="no";
  7.      }
  8. }
複製代碼
此時我們將回到一般模式的頁面,而且Session物件變數值被設定為「no」,網頁中的敘述就變為:
  1. <!-----管理模式選擇---------->
  2. <form method="post">
  3. 密碼:<input type="text" name="password" size="4" maxlength="4">&nbsp&nbsp<input type="submit" value="板主管理">
  4. </form>
複製代碼
而網頁中的『離開管理模式』按鈕,也就變回輸入密碼進入『板主管理』模式的欄位。
作者: 小誌    時間: 2011-4-23 23:24

留言的分頁
還為何需要進行分頁瀏覽?因為當網友的發言與板主回覆的資料筆數太多時,一次要將全部的資料內容顯示在網頁中,光是等待網頁下載的時間就嚇死人了,因此我們最好是採用固定筆數分頁瀏覽的方式來顯示網頁。
要進行分頁顯示,首先我們得先知道目前有多少筆的留言資料,而這些留言資料筆數可分解成幾個頁次來瀏覽,要想資料資料檔案中目前有幾筆資料錄,我們可以透過Recordset物件的『RecordCount』屬性得知,例如:本例中我們將每5筆資料為一單位分頁顯示:
  1. //分頁筆數設定
  2. $nums=5;
  3.       //將回傳結果存放於變數中
  4.       $datalist=mysql_query($SQL);
  5.       //取得欄位數量
  6.       $fieldnum=mysql_num_fields($datalist);
  7.       //取得資料錄數量
  8.       $rowsnum=mysql_num_rows($datalist);
  9.       //計算總共有多少分頁
  10.       if (($rowsnum / $nums) >intval($rowsnum / $nums))
  11.        {
  12.         $TotalPage=intval($rowsnum / $nums)+1;
  13.        }
  14.       else
  15.        {
  16.         $TotalPage=intval($rowsnum / $nums);
  17.        }
複製代碼
當我們將所有的發言資料採用固定筆數分頁瀏覽的方式來顯示後,最好提供一個跳頁連結顯示的功能,讓瀏覽者可以選擇希望瀏覽的頁次進行瀏覽,因此,我們必須再撰寫一段可以指定瀏覽頁次的PHP程式敘述:
  1. //決定開始顯示的分頁
  2. //若未指定分頁則預設顯示第一頁
  3. if (! isset($_REQUEST["ToPage"]))
  4. {
  5.   $GoPage=1;
  6. }
  7. //若指定分頁數小於1則預設顯示第一頁
  8. else if ($_REQUEST["ToPage"]<1)
  9. {
  10.   $GoPage=1;
  11. }
  12. //若指定指定的分頁超過總分頁數則顯示最後一頁
  13. else if ($_REQUEST["ToPage"]>$TotalPage)
  14. {
  15.   $GoPage=$TotalPage;
  16. }
  17. else
  18. {
  19. $GoPage=$_REQUEST["ToPage"];
  20. }
  21. //將作用中資料錄位置移到分頁的第一筆資料錄上來開始顯示內容
  22.   mysql_data_seek($datalist,($GoPage-1)*$nums);  
複製代碼
在這段指定瀏覽頁次的PHP程式敘述中,我們使用了mssqql_data_seek()函數來移動資料庫中資料錄的存取位置。
作者: 小誌    時間: 2011-4-23 23:25

顯示跳頁選擇  
完成移動資料庫中資料錄存取位置的PHP程式敘述後,接下來我們要作的就是將這些跳頁選擇的連結資料顯示在網頁中:
[attach]5759[/attach]
圖11-11  跳頁選擇。

在網頁中出現的跳頁選擇列表,瀏覽者正進行瀏覽的頁次將不會有跳頁選擇的超連結功能!非瀏覽中的頁次才具有跳頁選擇的超連結功能!要有這樣的功能,我們則可透過下列這段PHP程式敘述來達成:
  1. <!-------顯示頁選擇與分頁設定開始---------->
  2. <?
  3. for ($I=1; $I<=$TotalPage; $I++)
  4. {
  5. //如果非正在顯示的分頁則建立頁碼連結
  6.    IF ($I != $GoPage )
  7.       {
  8.       $myURL=$_SERVER["PHP_SELF"] . "?ToPage=";
  9.       echo "<a href=" . $myURL . $I . ">" . $I . "</a>|" ;
  10.       }
  11. //如果是正在顯示的方頁則單純顯示頁碼
  12.    else
  13.       {
  14.       echo $I . "|" ;
  15.       }
  16. }
  17. ?>
  18. <!-------顯示頁選擇與分頁設定結束---------->
複製代碼

作者: 小誌    時間: 2011-4-23 23:27

留言內容的顯示
最後就簡單的來為您解說一下『資料顯示』的處理原則,我們以『發言內容』為例來說明。
[attach]5760[/attach]
圖11-12  發言內容處理。

我們如何判斷要不要將『悄悄話』的發言內容顯示出來?有兩個判斷原則:第一:確認是不是在『管理模式』,如果是在管理模式就得將『悄悄話』的發言內容顯示出來,第二:如果在『一般模式』的時候,判斷發言性質是不是『悄悄話』,如果是,則發言的內容就以預設的文字內容代替:
  1. <!-----如果是公開模式或是板主管理模式則顯示留言內容---------->
  2. <? if ($fielddatas["私人公開"] == 0 || @$_SESSION["checkedit"]=="yes") {?>
  3. <font color="#FF0080">留言主題:</font>
  4. <font color="#0000FF"><?=$fielddatas["留言主題"];?></font>
  5. <br><font color="#000000"><?=$fielddatas["留言內容"];?></font>
  6. <!-----非公開模式或非板主管理模式則不顯示留言內容------------>
  7. <?
  8. }
  9. else{
  10. ?>
  11. <FONT COLOR=BLUE>:) 這是留給板主的悄悄話...</FONT>
  12.   <br><font color="#FF00F00">私人討論</font>
  13. <? }?>
複製代碼
我們先利用If判斷資料庫檔案中『私人公開』欄位中的資料內容是否為「0」,如果為「0」代表不是『悄悄話』的發言,則開將發言內容公開出來,又或者Session物件的變數「checkedit」值為「yes」,如果Session物件的變數值為 "yes",代表在管理模式,就必須將『悄悄話』的發言顯示出來:
[attach]5761[/attach]
圖11-13  管理模式下任何留言都要顯示出來。

guest.php
  1. <?
  2. session_start();
  3. //連結SQL Server
  4.     $conn = mysql_connect("localhost", "root", "12345a");
  5. //選擇資料庫
  6.     mysql_select_db("Message", $conn);
  7. //指定提取資料的校對字元表
  8.     mysql_query("set character set big5");  
  9. //建立查詢字串
  10. $SQL="Select * From allmessage Order By 留言時間 Desc";

  11. //分頁筆數設定
  12. $nums=5;
  13.       //將回傳結果存放於變數中
  14.       $datalist=mysql_query($SQL);
  15.       //取得欄位數量
  16.       $fieldnum=mysql_num_fields($datalist);
  17.       //取得資料錄數量
  18.       $rowsnum=mysql_num_rows($datalist);
  19.       //計算總共有多少分頁
  20.       if (($rowsnum / $nums) >intval($rowsnum / $nums))
  21.        {
  22.         $TotalPage=intval($rowsnum / $nums)+1;
  23.        }
  24.       else
  25.        {
  26.         $TotalPage=intval($rowsnum / $nums);
  27.        }
  28.       
  29. //決定開始顯示的分頁
  30. //若未指定分頁則預設顯示第一頁
  31. if (! isset($_REQUEST["ToPage"]))
  32. {
  33.   $GoPage=1;
  34. }
  35. //若指定分頁數小於1則預設顯示第一頁
  36. else if ($_REQUEST["ToPage"]<1)
  37. {
  38.   $GoPage=1;
  39. }
  40. //若指定指定的分頁超過總分頁數則顯示最後一頁
  41. else if ($_REQUEST["ToPage"]>$TotalPage)
  42. {
  43.   $GoPage=$TotalPage;
  44. }
  45. else
  46. {
  47. $GoPage=$_REQUEST["ToPage"];
  48. }
  49. //將作用中資料錄位置移到分頁的第一筆資料錄上來開始顯示內容
  50.   mysql_data_seek($datalist,($GoPage-1)*$nums);  

  51. //*****管理模式檢驗*****
  52. //以下為進入管理模式的敘述
  53. if (isset($_REQUEST["password"]))
  54. {
  55.   if ($_REQUEST["password"]=="test")//<-----管理密碼
  56.      {
  57.       $_SESSION["checkedit"]="yes";
  58.      }
  59. }

  60. //以下為脫離管理模式的程式敘述
  61. if (isset($_REQUEST["goexit"]))
  62. {
  63.   if ($_REQUEST["goexit"]=="yes")
  64.      {
  65.       $_SESSION["checkedit"]="no";
  66.      }
  67. }
  68. ?>

  69. <html>
  70. <head>
  71. <meta http-equiv="Content-Type" content="text/html; charset=big5">
  72. <title>麻辣家族留言板</title>
  73. </head>
  74. <body style="font-size: 10 pt">
  75. <div align="center">
  76. <img src="title.gif"><br><a href="addmsg.php">
  77. <img border="0" src="top.gif" align="absmiddle">留下您的足跡
  78. <img border="0" src="top.gif" align="absmiddle"></a>
  79. </div>
  80. <center>
  81. <form method="post" name="formpage">

  82. <table border="0" width="100%" cellpadding="0" cellspacing="0" style="font-size: 10 pt; border-collapse: collapse" bordercolor="#111111">
  83. <tr>
  84. <td><p align=right>
  85. <!-------顯示頁選擇與分頁設定開始---------->
  86. <?
  87. for ($I=1; $I<=$TotalPage; $I++)
  88. {
  89. //如果非正在顯示的分頁則建立頁碼連結
  90.    IF ($I != $GoPage )
  91.       {
  92.       $myURL=$_SERVER["PHP_SELF"] . "?ToPage=";
  93.       echo "<a href=" . $myURL . $I . ">" . $I . "</a>|" ;
  94.       }
  95. //如果是正在顯示的方頁則單純顯示頁碼
  96.    else
  97.       {
  98.       echo $I . "|" ;
  99.       }
  100. }
  101. ?>
  102. <!-------顯示頁選擇與分頁設定結束---------->
  103.   </p>
  104. </td>
  105. <td align=right>
  106. 目前共有<?=$rowsnum;?>筆留言;
  107. 目前顯示第<?=$GoPage;?>頁留言;
  108. 共<?=$TotalPage;?>頁
  109. </tr></table>
  110. <hr size="1" align="center" width="100%" >
  111. </form>
  112. <!-----讀入與顯示資料錄----->
  113. <?
  114. for ($y=0;$y<$nums;$y++)
  115. {
  116.   //將資料錄轉換為欄位陣列集合
  117.   if (($fielddatas=mysql_fetch_array($datalist)))
  118. {
  119. ?>
  120. <table border=0 width=90% bgcolor=#FFEEE6 style="border-collapse: collapse; font-size: 10 pt" bordercolor="#111111" cellpadding="0" cellspacing="0">
  121. <tr>
  122. <td><fieldset id=info align=center style='margin:5'>
  123.   <img src="<?=$fielddatas["圖形"];?>.gif" border="0">&nbsp<?=$fielddatas["網友姓名"];?>&nbsp於<?=$fielddatas["留言時間"];?>發表&nbsp&nbsp
  124. <? if (!empty($fielddatas["聯絡信箱"])) { ?> <a href="mailto:<?=$fielddatas["聯絡信箱"];?>">
  125. <img src="mail.gif" alt="聯絡信箱 <?=$fielddatas["聯絡信箱"];?>" border="0"></a>
  126. <? }?>
  127. <table border="1" width=100% bordercolor="#FF80C0" style="border-collapse: collapse; font-size: 10 pt" cellpadding="0" cellspacing="0">
  128.   <tr>
  129. <td  valign="top" align="left">
  130. <!-----如果是公開模式或是板主管理模式則顯示留言內容---------->
  131. <? if ($fielddatas["私人公開"] == 0 || @$_SESSION["checkedit"]=="yes") {?>
  132. <font color="#FF0080">留言主題:</font>
  133. <font color="#0000FF"><?=$fielddatas["留言主題"];?></font>
  134. <br><font color="#000000"><?=$fielddatas["留言內容"];?></font>
  135. <!-----非公開模式或非板主管理模式則不顯示留言內容------------>
  136. <?
  137. }
  138. else{
  139. ?>
  140. <FONT COLOR=BLUE>:) 這是留給板主的悄悄話...</FONT>
  141.   <br><font color="#FF00F00">私人討論</font>
  142. <? }?>
  143.   </td></tr>
  144. <!------如果板主有回覆則顯示回覆內容------------------------->
  145. <?if (@!empty($fielddatas["板主回覆"])) {?>
  146. <tr bgcolor="#3399FF">
  147.   <td align="left" valign=top bgcolor="#FFE8F3" >  
  148.   <font color="#800000">板主於<?=$fielddatas["板主回覆時間"];?>回覆:</font>
  149.   <br>
  150. <font color="#900000"><?=$fielddatas["板主回覆"];?></font>
  151. </td></tr>
  152.   <? } ?>
  153. <!------如果為板主管理模式則出現回覆留言的連結----------------->
  154.   <? if (@$_SESSION["checkedit"]=="yes") { ?>
  155. <tr><td>
  156.   <DIV ALIGN=RIGHT>【<a href=ans.php?ID=<?=$fielddatas["編號"];?>>板主回覆</a>】</DIV>
  157. </td></tr>
  158.   <?}?>
  159. </table>
  160. </td></tr></table><br>
  161. <?
  162. }
  163. }
  164. ?>
  165. <p>
  166. <!-----管理模式選擇---------->
  167. <form method="post">
  168. <?if (@$_SESSION["checkedit"]=="yes") {?>
  169. <input type="hidden" value="yes" name="goexit">
  170. <input type="submit" value="離開管理模式">
  171. <?
  172. }
  173. else{
  174. ?>
  175. 密碼:<input type="text" name="password" size="4" maxlength="4">&nbsp&nbsp<input type="submit" value="板主管理">
  176. <?}?>
  177. </form>
  178. </center>
  179. </body>  
  180. </html>
複製代碼

作者: yuoo    時間: 2012-12-31 22:45

小誌大哥 95 行 很難理解是否能指導一下 感恩中

IF ($I != $GoPage )

$gopage =顯示指標頁數 何時才會不條件不成立呢?目前想到只有使用者在網址輸入頁數 在未滿足一頁的條件底下 思路還是很模糊......
作者: 小誌    時間: 2013-1-1 05:33

$I 是非顯示中的頁數
$GoPageg是當前顯示中的頁數
若是當前顯示中的頁數就不建立跳頁連結,$I != $GoPage 條件式成立就建立跳頁
作者: s80878089    時間: 2014-11-1 02:24

想請問一下
我的都會顯示這個
Notice: Undefined variable: fielddatas"
不知道要怎麼解決才好
作者: huangmoon    時間: 2016-5-11 11:27     標題: 錯誤

本帖最後由 huangmoon 於 2016-5-11 11:29 編輯

請問大大為甚麼會出現這東西?
哪裡有錯?
作者: huangmoon    時間: 2016-5-11 11:51

回復 10# huangmoon


    我已經解決~~剩下51行有錯誤~~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)