PHP實例——留言板

留言板功能介紹
用戶利用留言板可以發表自己的留言,管理員可以在後臺對留言進行回覆或刪除管理。

前臺:

  • 從數據庫中讀出已有的留言信息,最新的留言顯示在最前面。
  • 當留言數較多時,需要分頁顯示。
  • 留言表單留言者可以輸入的信息爲:暱稱、電子郵箱(前臺不顯示)、及留言內容,並通過JAVASCRIPT腳本初步檢測信息。
  • 留言處理部分需要對輸入的信息再做長度限制級安全性處理,並將合法信息寫入數據表中。
  • 如果留言成功,使用html meta的refresh屬性自動返回留言顯示頁面。

後臺:

  • 管理員輸入管理密碼,改密碼與user便的信息進行比較驗證,也可與配置文件中配置的密碼比較
  • 驗證通過後,回到留言管理界面,每一條留言都提供一個表單以便於回覆留言。
  • 對於不巧當的留言,管理員可以直接刪除。

PHP留言板頁面佈局
conn.php:數據庫連接包含文件
config.php:系統配置文件,用於配置每頁顯示留言條數等
index.php:留言板主界面,用於留言數讀取顯示及用戶留言表單(留言表單在留言顯示下方)
submiting.php:助理留言者提交的留言信息
login.php:管理員登錄及驗證頁面
admin.php:留言管理主界面,讀取留言數據,提供回覆表單及刪除等操作界面
reply.php:用於留言回覆,刪除等具體操作

在phpmyadmin中需要創建兩個表guestbook用於儲存留言信息(包括暱稱,日期,留言內容,電子郵箱,回覆),user用於儲存管理員信息(包括管理員編號,管理員名稱,管理員密碼)。

config.php:

<?php
    $pagesize = 3;
    $gb_password = 123456;
?>

index.php(核心代碼)

<?php
        require("./conn.php");
        require("./config.php");
        //確定當前頁面$p的參數
        $p = $_GET['p']?$_GET['p']:1;
        //數據指針
        $offset = ($p-1)*$pagesize;

        $query_sql = "SELECT * FROM guestbook1 ORDER BY id DESC LIMIT  $offset , $pagesize";
        $result = mysql_query($query_sql);
        //如果出現錯誤則退出
        if(!$result)exit("查詢數據錯誤:".mysql_error());

        //循環輸出
        while($gb_array = mysql_fetch_array($result)){
            $content = nl2br($gb_array['content']);
            $name = nl2br($gb_array['nickname']);
            echo $name;
            echo'發表於:'.date("Y-m-d H:i",$gb_array['createtime']).'<br/>';
            echo'內容:'.nl2br($gb_array['content']).'</br></br>';

             if(!empty($gb_array['replytime'])) {
            echo '----------------------------<br />';
            echo '管理員回覆於:',date("Y-m-d H:i", $gb_array['replytime']),'<br />';
            echo nl2br($gb_array['reply']),'<br /><br />';
            }
            echo '<hr />';
            }
            //計算留言頁數
            $count_result = mysql_query("select count(*) from guestbook");
            $count_array  =mysql_fetch_array($count_result);
            $pagesize = ceil($count_array['count(*)']/$pagesize);//向上舍入爲最接近的整數
            echo'共 '.$count_array['count(*)'].' 條留言';
            if($pagenum > 1){
                for($i=1;$i<=pagenum;$i++){
                    if($i == $p){
                        echo'$nbsp;[',$i,']';
                    }   else {
                        echo'$nbsp;<a href="index.php?p=',$i,'">'.$i.'</a>';

                }
            }
        }
    ?>

效果圖:

這裏寫圖片描述

submiting.php:

<?php
error_reporting(E_ALL^E_NOTICE^E_WARNING);
    //禁止非POST方式訪問
if(!isset($_POST['submit'])){
    exit('非法訪問!');
}
//表單信息處理
if(get_magic_quotes_gpc()){
    $nickname = htmlspecialchars(trim($_POST['nickname']));
    $email = htmlspecialchars(trim($_POST['email']));
    $content = htmlspecialchars(trim($_POST['content']));
}   
    else{
        $nickname = addslashes(htmlspecialchars(trim($_POST['nickname'])));//addslashes() 函數返回在預定義字符之前添加反斜槓的字符串。
        $email = addslashes(htmlspecialchars(trim($_POST['email'])));
        $content = addslashes(htmlspecialchars(trim($_POST['content'])));
        }
if(strlen($nickname)>16){
    exit('錯誤:暱稱不得超過16個字符串 [ <a href="javascript:history.back()">返 回</a> ]');
}
if(strlen($nickname)>60){
    exit('錯誤:郵箱不得超過60個字符串 [ <a href="javascript:history.back()">返 回</a> ]');
}


// 數據寫入庫表
require("./conn.php");
$createtime = time();
$insert_sql = "INSERT INTO guestbook1(nickname,email,content,createtime)VALUES";
$insert_sql .= "('$nickname','$email','$content',$createtime)";

if(mysql_query($insert_sql)){
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm
l1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="Refresh" content="2;url=index.php">
<title>留言成功</title>
</head>
<body>
<div class="refresh">
<p>留言成功!非常感謝您的留言。<br />請稍後,頁面正在返回...</p>
</div>
</body>
</html>
<?php
} else {
    echo '留言失敗:',mysql_error(),'[ <a href="javascript:history.back()">返 回</a> ]';
}

?>

效果圖:

這裏寫圖片描述

login.php(略)

效果圖:

這裏寫圖片描述

admin.php(核心代碼):

<?php
require("./conn.php");
require("./config.php");

$p = $_GET['p']?$_GET['p']:1;
$offset = ($p-1)*$pagesize;
$query_sql = "SELECT * FROM guestbook1 ORDER BY id DESC LIMIT  $offset , $pagesize";
$result = mysql_query($query_sql);
if(!$result) exit('查詢數據錯誤:'.mysql_error());

// 循環輸出當前頁顯示數據
while($gb_array = mysql_fetch_array($result)){
    echo $gb_array['nickname'],'&nbsp;';
    echo '發表於:',date("Y-m-d H:i:s", $gb_array['createtime']);
    echo ' ID號:',$gb_array['id'],'<br />';
    echo '內容:',nl2br($gb_array['content']),'<br />';

?>

效果圖:

這裏寫圖片描述

reply.php:

<?php
error_reporting(E_ALL^E_NOTICE^E_WARNING);
session_start();
if(!isset($_SESSION['username'])){
    header("Location: http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/\\'
)."/login.php");
    exit;
}
require("./conn.php");
if($_POST){
    if(get_magic_quotes_gpc()){
        $reply = htmlspecialchars(trim($_POST['reply']));
    } else {
        $reply = addslashes(htmlspecialchars(trim($_POST['reply'])));
    }
    // 回覆爲空時,將回復時間置爲空
    $replytime = $reply?time():'NULL';
    $update_sql = "UPDATE guestbook1 SET reply = '$reply',replytime = $replytime WHERE id = $_POST[id]";
    if(mysql_query($update_sql)){
        exit('<script language="javascript">alert("回覆成功!");self.location="admin.php";</script>');
    } else {
        exit('留言失敗:'.mysql_error().'[ <a href="javascript:history.back()">返 回</a> ]');
    }
}

// 刪除留言
if($_GET['action'] == 'delete'){
    $delete_sql = "DELETE FROM guestbook1 WHERE id = $_GET[id]";
    if(mysql_query($delete_sql)){
        exit('<script language="javascript">alert("刪除成功!");self.location = "admin.php";</script>');
    } else {
        exit('留言失敗:'.mysql_error().'[ <a href="javascript:history.back()">返 回</a> ]');
    }
}
?>

更新線
———————————————————————————————————————————
正常留言後發現顯示的留言時間與當前時間相差八個小時整,找到的原因是php.ini文件配置裏的時區不對。
1、打開php.ini文件,ctrl+f查找到DATE如下:

這裏寫圖片描述

將其中的date.timezone 後面的改爲GMT-8。

2、date_defalut_timezone_set方法
在使用date()函數前加入如下代碼:
date_defalut_timezone_set(“Etc/GMT-8”)

3、直接加上八小時的秒數

<?php
echo date("Y-m-d H:i:s",time()+8*60*60);
?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章