仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 713|回复: 19
打印 上一主题 下一主题

[学习教程] PHP编程:带Oracle数据库分页显示功效的留言簿

[复制链接]
乐观 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:08:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
也得学会了PHP。然后再学,见异思迁是最不可取的,狗熊掰玉米就是这个道理,如果经常中途放弃,只能是一无所获,还浪费了N多的时间和经历,得不偿失,最重要的是,你会被别人瞧不起。   大部分的网站,城市思索到和利用者之间的互动关系。这时候,用留言版的功效,可以让利用者留下到此一游,或是一些和网站的互动讯息。
  在设计上,可以很复杂的只留下利用者的短篇留言,也能够设计到依性质分门别类很庞杂的 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 各栏位申明及具体材料见下表
  序号 栏位   称号  数据类型 长度 栏位 申明  限制 Key
   0 流水号  serial varchar2  255 NN   PK
   1 参照流水号 ref  varchar2  255 暂保存 

  覆留言功效用

  2 帐号 id char 8 利用者帐号 NN

  3 匿名 alias varchar2 32 显示的名字 NN

  4 网址 ip varchar2 1024 上彀 IP

  5 工夫 msgdate date NN

  6 电子邮件 email varchar2 1024

  7 留言内容 msg varchar2 2000 NN

  8 显示旗标 flag char 1 0: 不显示

   1: 显示 (内定)
  在本节的留言版相干法式中,若到场了利用者认证功效,则可以在 guestbook材料表的帐号栏中留下利用者的认证帐号,便利 Webmaster 往后找寻不妥的发信者。在这儿先留下栏位,让需求的读者们练习了。
  要利用本节的法式,起首要先装好 Oracle 7.x 版,并肯定 Web Server 真个SQL*net 可以顺遂连上 Oracle 材料库。以后还要在编译 PHP 时加
  --with-oracle=/home/oracle/product/7.3.2 的选项,固然改成其它的途径也不妨,只需该途径真的是 Oracle 的途径便可。有关 Oracle 装设及利用上的细节请参考相干书本。
  上面的法式是将利用者的留言信息加到 guestbook 留言数据表中。若要设定利用者认证功效,可在法式刚入手下手时反省,发留言者就能够确认身份,而读取留言就不用身份反省。这类设定可以避免不妥讲话,却又不会让留言功效只要多数人利用。
<?php
file://---------------------------
// 新增留言法式 addmsg.php
// Author: Wilson Peng
// Copyright (C) 2000
file://---------------------------
//
// 可自行在这儿到场身份反省功效
//
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
}
?>
  下面的法式在履行时,先反省变数 alias 和 msg 是不是有材料,若无材料则送出填写留言的表格到利用者端,供利用者填写留言。
  若利用者填好留言,按下 "送出留言" 的按钮后,则履行法式的前半部分。
  法式也许分红五部分
  1.. 设定 Oracle 需求的情况变数
  2.. 连上 Oracle 材料库
  3.. 收拾整顿材料,送入 Oracle 中
  4.. 停止与 Oracle 的连线
  5.. 停止法式,显示最新的留言材料

  在设定 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
file://---------------------------
// 留言显示法式 index.php
// Author: Wilson Peng
// Copyright (C) 2000
file://---------------------------
$WebmasterIPArray =
ay(
"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;
}
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="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);
$gu
estbook[$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>
  ";
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>

  在显示留言的部分,思索到留言内容若良多,加上彀路慢的话,能够会让利用者在线路慢的时分拖累全部材料库,因而,尽快的连上材料库,获得需求的材料后,即刻封闭材料库,再渐渐送给利用者,应是最好的对策

法式分红四部分

  1.. 初始化

  2.. 取数据库中的数据

  3.. 盘算要显示的页数

  4.. 送出材料

  这个法式在 BIGLOBE 上有实作,因为这是一间 ISP 公司,因而在设准时限制保持或专线的会员才干看到,进入前要输出帐号及暗码。为了回护留言者的隐私,留言以马赛克处置。
$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
file://---------------------------
// 留言删除法式 erase.php
// Author: Wilson Peng
// Copyright (C) 2000
file://---------------------------
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 就能够了,不必将材料真的从材料库上移除。


会MYSQL吗?会,我会把我的信息在数据库里插入删除啦
不帅 该用户已被删除
沙发
发表于 2015-2-4 09:19:29 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
分手快乐 该用户已被删除
板凳
发表于 2015-2-5 11:52:37 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
变相怪杰 该用户已被删除
地板
发表于 2015-2-10 02:44:03 | 只看该作者
实践是检验自己会不会的真理。
活着的死人 该用户已被删除
5#
发表于 2015-2-28 15:43:20 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
金色的骷髅 该用户已被删除
6#
发表于 2015-3-12 10:16:50 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-12 16:37:47 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
莫相离 该用户已被删除
8#
发表于 2015-3-17 12:09:55 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
再现理想 该用户已被删除
9#
发表于 2015-3-23 20:52:50 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
再见西城 该用户已被删除
10#
发表于 2015-4-1 18:11:26 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
深爱那片海 该用户已被删除
11#
发表于 2015-4-6 10:52:10 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
精灵巫婆 该用户已被删除
12#
发表于 2015-4-7 20:11:27 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
简单生活 该用户已被删除
13#
发表于 2015-4-9 16:28:51 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
山那边是海 该用户已被删除
14#
发表于 2015-4-29 02:06:41 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
admin 该用户已被删除
15#
发表于 2015-5-9 05:56:19 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
灵魂腐蚀 该用户已被删除
16#
发表于 2015-5-10 09:27:46 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
柔情似水 该用户已被删除
17#
发表于 2015-5-11 15:19:33 | 只看该作者
实践是检验自己会不会的真理。
18#
发表于 2015-5-12 09:43:47 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
乐观 该用户已被删除
19#
 楼主| 发表于 2015-6-5 13:30:46 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
透明 该用户已被删除
20#
发表于 2015-6-11 18:12:29 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-20 21:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表