<marquee width=358>欢迎来到月影社区,希望这里可以成为您美丽的梦幻花园,如果你觉得这里好请分享给您的朋友!- wf66.com</marquee> 将月影社区设置为您的首页将月影社区地址加入到您的收藏栏
月影社区时尚音乐音乐查询IP手机许愿之瓶最新更新文件加密访客留言爱音乐
欢迎您,首页 >> 信息中心 >> 留言板

请输入您关键字:


留言板

推荐查看本文HTML版本

大部份的网站,都会考虑到和用户之间的互动关系。这时,用留言板的功能,可让用户留下到此一游,或者是一些和网站的互动信息。

在设计上,可以很简单的只留下用户的短篇留言,也可以设计到依性质分门别类很复杂的 Web BBS 系统。当然,要如何打造一个属于自己网站的留言板,就端赖网站的性质以及 Web 网站开发人员的巧思了。

在这里介绍的范例,是简单的列示所有留言的内容。供用户可以一次看到多笔留言的资料。系统的后端存放留言是用 Oracle 7.x 版的数据库系统。范例中的数据库 (database) 名称为 WWW,连接的用户帐号为 user38、密码为 iam3849。要直接使用本例,必须先执行下面的 SQL 指令,建立 guestbook 的资料表格。

CREATE TABLE guestbook ( serial varchar2(255) not null, ref varchar2(255) null, id char(8) not null, alias varchar2(32) not null, ip varchar2(1024) null, msgdate date not null, email varchar2(1024) null, msg varchar2(2000) not null, flag char(1) default 1, primary key(serial));

上面的 SQL 各字段说明及详细资料见下表

序号字段名称资料类型资料长度字段说明限制Key0流水号serialvarchar2255NNPK1参照流水号refvarchar2255暂保留。供回
覆留言功能用2帐号idchar8用户帐号NN3匿名aliasvarchar232显示的名字NN4网址ipvarchar21024上网 IP5时间msgdatedateNN6电子邮件emailvarchar210247留言内容msgvarchar22000NN8显示标志flagchar10: 不显示
1: 显示 (默认)

在本节的留言板相关程序中,若加入了用户认证功能,则可以在 guestbook 资料表的帐号栏中留下用户的认证帐号,方便 Webmaster 日后找寻不当的发信者。在这儿先留下字段,让需要的读者们实习了。

要使用本节的程序,首先要先装好 Oracle 7.x 版,并确定 Web Server 端的 SQL*net 可以顺利连上 Oracle 数据库。之后还要在编译 PHP 时加入 --with-oracle=/home/oracle/product/7.3.2 的选项,当然改成其它的路径也没关系,只要该路径真的是 Oracle 的路径即可。有关 Oracle 装设及使用上的细节请参考相关书籍。

下面的程序是将用户的留言信息加到 guestbook 留言资料表中。若要配置用户认证功能,可在程序刚开始时检查,发留言者就可以确认身份,而读取留言就不必身份检查。这种配置可以防止不当发言,却又不会让留言功能只有少数人使用。

<?php
//---------------------------
// 新增留言程序 addmsg.php
// Author: Wilson Peng
//        Copyright (C) 2000
//---------------------------
//
// 可自行在这儿加入身份检查功能
//
if (($alias!="") and ($msg!="")) {
  putenv("ORACLE_SID=WWW");
  putenv("NLS_LANG=american_taiwan.zht16big5");
  putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
  putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
  putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
  putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");

  $handle=ora_logon("user38@WWW","iam3849") or die;
  $cursor=ora_open($handle);
  ora_commitoff($handle);

  $serial=md5(uniqid(rand()));
  $ref="";
  $id=$PHP_AUTH_USER;
  $ip=$REMOTE_ADDR;
  $msg=base64_encode($msg);
  $flag="1";
  $query="INSERT into guestbook(serial, ref, id, alias, ip, msgdate, email, msg, flag) values('$serial', '$ref', '$id', '$alias', '$ip', sysdate, '$email', '$msg', '$flag')";

  ora_parse($cursor, $query) or die;
  ora_exec($cursor);

  ora_close($cursor);
  ora_logoff($handle);

  Header("Location: ./index.php");
  exit;

} else {
?>
<html>
<head>
<title>填写留言</title>
</head>
<body bgcolor=ffffff>
<form method=POST action="<? echo $PHP_SELF; ?>">
<table border=0 cellpadding=2 width=395>
  <tr>
    <td nowrap><font color=004080>代号小名</font></td>
    <td width=20%><input type=text name=alias size=8></td>
    <td nowrap><font color=004080>电子邮件</font></td>
    <td width=50%><input type=text name=email size=18></td>
  </tr>
  <tr>
    <td nowrapvalign=top><font color=004080>内容</font></td>
    <td width=80% colspan=3><textarea rows=5 name=msg cols=33></textarea></td>
  </tr>
  <tr>
    <td width=100% colspan=4 align=center>
       <input type=submit value="送出留言">
       <input type=reset value="擦掉留言">
    </td>
  </tr>
</table>
</form>
</body>
</html>
<?php
}[月影读书频道 http://wf66.com/]
?>

上面的程序在执行时,先检查变量 alias 和 msg 是否有资料,若无资料则送出填写留言的表格到用户端,供用户填写留言。

若用户填好留言,按下 "送出留言" 的按钮后,则执行程序的前半部份。

程序大概分成五部份 配置 Oracle 需要的环境变量 连上 Oracle 数据库 整理资料,送入 Oracle 中 结束与 Oracle 的连接 结束程序,显示最新的留言资料

在配置 Oracle 环境的部份,用 PHP 的函数 putenv(),可配置操作系统层的环境变量。要使用中文要记得加入下面这行

putenv("NLS_LANG=american_taiwan.zht16big5");

之后就使用 Oracle 函数库的功能: ora_logon() 等等。详见 Oracle 数据库函数库。利用这个函数库,可以很轻易的操作 Oracle 数据库。

再来就是整理资料,以便置入 Oracle 数据库中

$serial=md5(uniqid(rand()));
$ref="";
$id=$PHP_AUTH_USER;
$ip=$REMOTE_ADDR;
$msg=base64_encode($msg);
$flag="1";
$query="INSERT into guestbook(serial, ref, id, alias, ip, msgdate, email, msg, flag) values('$serial', '$ref', '$id', '$alias', '$ip', sysdate, '$email', '$msg', '$flag')";

$serial 变量为独一无二的字符串,程序先随机数产生独特的字符串,再用 md5 编码,将字符串弄乱,形成类似哈稀处理后的无意义字符串。由于字符串长,又变得很乱,可防止用户,尤其是黑客或飞客利用序号来戳系统。

$ref 变量目前是无效的。$id 变量为用户认证用,若在程序开始处有加入用户认证的程序,则 $PHP_AUTH_USER 会变成用户的帐号,传入 $id 变量中。

至于用户写的字符串,为了防止数据库或处理时的复杂性甘脆将它用 BASE64 编码。可以让中文字的奇怪字符一字消失,当然这是锯箭法,不过对 Web 程序而言,执行快速、修改方便才是最重要的,实在没有必要再浪费精力去处理这些中文的冲码问题了。值得注意的是使用 BASE64 编码,会让字符串膨胀大约 1/3,若数据库的储存空间有限,可能就不适合用这个方法了,话又说回来,现在硬碟便宜,随便就是十几 GB 以上,应该不会考虑数据库空间有限的问题才对。

最后,将变量整理成 $query 字符串,供数据库执行 SQL 指令使用就可以了。

ora_parse($cursor, $query) or die;
ora_exec($cursor);
ora_close($cursor);
ora_logoff($handle);

要执行 Oracle 的 SQL 指令前,要先经过 parse 的步骤。若在前面加上 @ (如: @ora_prase();),可以不让用户看到错误信息。在执行 query 指令后,就可以关闭与 Oracle 之间的连接了。

Header("Location: ./index.php");
exit;

这二行让浏览器重定向到 index.php。让用户看到他的新留言,就完成了留言的步骤。

之后来看看留言的内容显示程序。

<html>
<head>
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
<title>留言板</title>
</head>
<body bgcolor=ffffff>
<?php
//---------------------------
// 留言显示程序 index.php
// Author: Wilson Peng
//        Copyright (C) 2000
//---------------------------

$WebmasterIPArray = array(
  "10.0.1.30",     // 管理人员甲的机器 IP
  "10.0.2.28"      // 管理人员乙的机器 IP
);
[月影社区 http://wf66.com/]
$WebmasterIP=false;
for ($i=0; $i<Count($WebmasterIPArray); $i++) {
  if ($REMOTE_ADDR == $WebmasterIPArray[$i]) $WebmasterIP=true;
}

putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5"); [月影社区 http://wf66.com/]
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");

$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);

$query="SELECT serial, ref, id, alias, ip, TO_CHAR(msgdate, 'yyyy/mm/dd hh:mi:ss'), email, msg FROM guestbook where flag='1' order by msgdate desc";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
$i=0;
while(ora_fetch($cursor)) {
  $guestbook[$i][0] = ora_getcolumn($cursor,0);
  $guestbook[$i][1] = ora_getcolumn($cursor,1);
  $guestbook[$i][2] = ora_getcolumn($cursor,2);
  $guestbook[$i][3] = ora_getcolumn($cursor,3);
  $guestbook[$i][4] = ora_getcolumn($cursor,4);
  $guestbook[$i][5] = ora_getcolumn($cursor,5);
  $guestbook[$i][6] = ora_getcolumn($cursor,6);
  $guestbook[$i][7] = ora_getcolumn($cursor,7);
  $i++;
}
ora_close($cursor);
ora_logoff($handle);

echo "<a href=addmsg.php>新增留言....</a><p>\n";

if ($QUERY_STRING!="") {
  $page = $QUERY_STRING;
} else {
  $page = 0;
}

$i=count($guestbook);
$msgnum=20;   // 每页二十笔
$start = $page * $msgnum;
$end = $start + $msgnum;
if ($end > $i) $end=$i;
$totalpage=$i/$msgnum;

$pagestr="";
if ($page>0) $pagestr=$pagestr."<a href=index.php?".($page-1)."><上页</a> - ";
$pagestr=$pagestr."[第 ";
for ($i=0; $i<$totalpage; $i++) {
  if ($i!=$page) {
    $pagestr = $pagestr."<a href=index.php?$i>".($i+1)."</a> ";
  } else {
    $pagestr = $pagestr.($i+1)." ";
  }
}
$pagestr=$pagestr." 页] ";
if ($page<($totalpage-1)) $pagestr=$pagestr."- <a href=index.php?".($page+1).">下页></a> ";

$pagestr="<div align=center>$pagestr</div>";
echo "<p>".$pagestr."<hr><p>\n";

for ($i=$start; $i<$end; $i++) {
  echo "<p><hr><p>\n";
  echo "<p>\n<font color=e06060>".$guestbook[$i][5]."</font>   "; [月影社区 http://wf66.com/]
  if ($guestbook[$i][6]!="") echo "<a href=mailto:".$guestbook[$i][6].">";
  echo "<strong>".$guestbook[$i][3]."</strong>";
  if ($guestbook[$i][6]!="") echo "</a>";
  echo "<br>\n";
  if ($WebmasterIP) echo "<a href=erase.php?".$guestbook[$i][0].">删除本篇!!</a> (".$guestbook[$i][2].")   ";
  echo "<font size=-1 color=c0c0c0>from: ".$guestbook[$i][4]."</font><p>\n";
  $msg=base64_decode($guestbook[$i][7]);
  $msg=nl2br($msg);
  echo $msg;
  echo "<p>\n";


echo "<p><hr><p>\n";
echo $pagestr;

?>
</body>
</html>

在显示留言的部份,考虑到留言内容若很多,加上网络慢的话,可能会让用户在线路慢的时候拖累整个数据库,因此,尽快的连上数据库,取得需要的资料后,马上关闭数据库,再慢慢送给用户,应是最好的对策。

程序分成四部份 初始化 取数据库中的资料 计算要显示的页数 送出资料

 

$WebmasterIPArray = array(
  "10.0.1.30",     // 管理人员甲的机器 IP
  "10.0.2.28"      // 管理人员乙的机器 IP
);

$WebmasterIP=false;
for ($i=0; $i<Count($WebmasterIPArray); $i++) {
  if ($REMOTE_ADDR == $WebmasterIPArray[$i]) $WebmasterIP=true;
}
// 之后初始化 Oracle 程序略

显示程序和留言程序的初始化部份都差不多,但显示程序多加了一个功能,配置 Webmaster 的电脑。将 Webmaster 使用的 IP Address 加在 $WebmasterIPArray 数组变量中,可以在显示留言时,显示删除留言的字符串,方便处理不当的留言。

$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);

$query="SELECT serial, ref, id, alias, ip, TO_CHAR(msgdate, 'yyyy/mm/dd hh:mi:ss'), email, msg FROM guestbook where flag='1' order by msgdate desc";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
$i=0;
while(ora_fetch($cursor)) {
  $guestbook[$i][0] = ora_getcolumn($cursor,0);
  $guestbook[$i][1] = ora_getcolumn($cursor,1);
  $guestbook[$i][2] = ora_getcolumn($cursor,2);
  $guestbook[$i][3] = ora_getcolumn($cursor,3);
  $guestbook[$i][4] = ora_getcolumn($cursor,4);
  $guestbook[$i][5] = ora_getcolumn($cursor,5);
  $guestbook[$i][6] = ora_getcolumn($cursor,6);
  $guestbook[$i][7] = ora_getcolumn($cursor,7);
  $i++;
}
ora_close($cursor);
ora_logoff($handle);

在初始化后,就可以连上 Oracle 数据库,将留言的资料取出放在 $guestbook 数组中。取得资料后,就赶紧将数据库关闭,再来处理 $guestbook 数组的资料了。

if ($QUERY_STRING!="") {
  $page = $QUERY_STRING;
} else {
  $page = 0;
}

这一段程序判断是要显示第几页,默认值是显示第一页。要显示第三页的页面,需要使用 http://xxxxxx/index.php?2 的格式,也就是传入 $QUERY_STRING,余类推。之后的数行程序,都是用来处理显示的页数及笔数的资料。

$msgnum=20;   // 每页二十笔

要改变每页的显示笔数,可以改 $msgnum 变量。程序的默认值为 20 笔。

for ($i=$start; $i<$end; $i++) {
  echo "<p><hr><p>\n";
  echo "<p>\n<font color=e06060>".$guestbook[$i][5]."</font>   ";
  if ($guestbook[$i][6]!="") echo "<a href=mailto:".$guestbook[$i][6].">";
  echo "<strong>".$guestbook[$i][3]."</strong>";
  if ($guestbook[$i][6]!="") echo "</a>";
  echo "<br>\n";
  if ($WebmasterIP) echo "<a href=erase.php?".$guestbook[$i][0].">删除本篇!!</a> (".$guestbook[$i][2].")   ";
  echo "<font size=-1 color=c0c0c0>from: ".$guestbook[$i][4]."</font><p>\n";
  $msg=base64_decode($guestbook[$i][7]);
  $msg=nl2br($msg);
  echo $msg;
  echo "<p>\n";
}

这一段程序就是真正显示留言资料给用户看的程序了。利用 for 循环,将 $guestbook 数组的资料按照配置的页数取出,显示给用户看。值得一提的是,若看留言的机器 IP 为 $WebmasterIPArray 变量数组中的一个元素的话,则会在留言者的匿称后显示 "删除本篇!!" 的字符串,供管理人员删除不当留言。

以下即为删除留言的程序。

<?php
//---------------------------
// 留言删除程序 erase.php
// Author: Wilson Peng
//        Copyright (C) 2000
//---------------------------
putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5");
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");

$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);

$query="UPDATE guestbook set flag='0' where serial='".$QUERY_STRING."'";
ora_parse($cursor, $query) or die;
ora_exec($cursor);

ora_close($cursor);
ora_logoff($handle);

Header("Location: ./index.php");
?>

其实这个程序很单纯,只要打开 Oracle 数据库,将要删除的序号那笔资料的 flag 字段设成 0 就可以了,不用将资料真的从数据库上移除。

留言板 2006-9-22
转到本主题第:[ 1 ]
相关评论

暂无评论

总计0页 [ ]上一页 下一页
发表评论(揪错)
呢称: * 您尚未登陆,请登录
来自: *
内容:
 

(为防止非法信息,您的言论提交后需要审核才能正常显示)

文学
精品文萃 情感天地 言情小说
网络小说 玄幻小说 悬疑恐怖
武侠小说 古典品谈 外国名著
儿童文学 会员原创 学习园地
杂谈其它
娱乐
爆笑网文 星座占卜 影音动漫
娱乐新闻 影视剧情
诗词
青竹诗歌 个人诗集 宋词雅赏
全唐诗录
新闻
国际新闻 国内新闻 科技新闻
体育新闻
图片
图文专区 艺术长廊 桌面壁纸
精品素材 像素图片
漫画
单幅漫画 爆笑四格 连环漫画
电脑
电脑入门 图形图像 编程开发
游戏
我爱Q宠 最新攻略 最新秘籍
游戏新闻 技巧心得
经济
帕格节电 财经资讯 股市证券
生活
百科知识 外语学院 潮流时尚
健康医疗 宠物花卉 汽车地带
行走天下
美食
面食甜点 家常菜品 药膳食疗
美食天下 烹饪技巧 松辽风味
燕京风味 巴蜀风味 滇黔风味
赣江风味 徽皖风味 闽台风味
齐鲁风味 中州风味 岭南风味
荆楚风味 三晋风味 淞沪风味
苏扬风味 潇湘风味 钱塘风味
民族风味 素斋仿荤
营销
管理杂谈 谈经论道 培训激励
经营战略 职场生涯 公关交际
关于我们版权声明本站导航友情连结作品演示 TOP↑
本论坛言论纯属发表者个人意见,与£月影社区£立场无关。 皖ICP备16024038号-1
禁止发布任何色情/政治/反动相关信息让我们共同来营造一个属于我们的梦幻家园
Copyright ©2001-2006 MoonShadow. All rights reserved.  Version 4.0  Licence 2006.4.2
建站天数:7135天 本站基于ASP+JS构建,完全自主开发,版权归属月影社区 管理员QQ:23165062 Time:78ms