目录搜索
oracle知识ORACLE的数据类型Oracle技术网—DBMS_Job包的用法Oracle技术网—Oracle for NT系统实用工具介绍Oracle技术网—Oracle常见错误代码Oracle技术网—Oracle常用ScriptOracle技术网—Oracle常用数据字典Oracle技术网—ORACLE数据库简介Oracle技术网—Oracle特殊包Oracle技术网—Oracle相关站点Oracle技术网—哪些初始化参数最影响Oracle系统性能PL/SQLDBAOracle7 7.3.2.2Oracle技术网—listener.log的内容增长很快,是否可以删除重建Oracle技术网—ORACLE表空间恢复方案Oracle技术网—Oracle常用系统文件有哪些Oracle技术网—ORACLE回滚段管理(上)Oracle技术网—ORACLE回滚段管理(下)Oracle技术网—Oracle如何决定使用哪个回退段Oracle技术网—Oracle数据库的空间管理技巧Oracle技术网—Oracle数据库碎片整理Oracle技术网—Oracle数据库有哪几种关闭方式Oracle技术网—Oracle数据库有哪几种启动方式Oracle技术网—Oracle预定义角色有哪些Oracle技术网—ROLLBACK不能回滚的命令Oracle技术网—查看哪些session正在使用哪些回滚段Oracle技术网—存储参数(storage子句)含义及设置技巧Oracle技术网—和权限有关的表有哪些Oracle技术网—漫谈数据库的启动和关闭Oracle技术网—哪些初始化参数最影响Oracle系统性能Oracle技术网—如何备份控制文件Oracle技术网—如何查出前台正在发出的sql语句Oracle技术网—如何查看Oracle版本及安装了哪些选项Oracle技术网—如何查看Oracle数据表的建表语句Oracle技术网—如何查看SGA区剩余可用内存Oracle技术网—如何查看各个表空间占用磁盘情况Oracle技术网—如何查看后台进程Oracle技术网—如何查看什么时间有哪些数据库对象结构被修改过Oracle技术网—如何查看数据库的各种数据文件Oracle技术网—如何查看数据库的字符集Oracle技术网—如何查看数据文件是否自动扩展Oracle技术网—如何查看数据文件所在的路径Oracle技术网—如何查看用户表上的约束内容Oracle技术网—如何查看用户表所占空间的大小Oracle技术网—如何查询出primary key和forgen key的关系表Oracle技术网—如何改变当前联机日志文件的大小Oracle技术网—如何利用DBMS_SQL包和游标计算当前用户下所有表的行数Oracle技术网—如何启动ARCHIVELOG模式Oracle技术网—如何取出某一用户的密码,再原封不动的改回去Oracle技术网—如何设置BLOCK_SIZE大于2K,如:4K、16KOracle技术网—如何手工指定使用哪个回退段Oracle技术网—如何修改internal的口令Oracle技术网—如何移动控制文件到新的目录中Oracle技术网—如何移数据库文件Oracle技术网—如何增加表空间的大小Oracle技术网—怎样查看init.ora文件Oracle技术网—怎样查看SGA值Oracle技术网—怎样查看哪些用户拥有SYSDBA、SYSOPER权限?Oracle技术网—怎样快速查出Oracle 数据库中的锁等待Oracle技术网—怎样识别IO竞争和负载平衡Exp vs ImpOracle技术网—EXP、IMP 命令详解Oracle技术网—Exp/Imp大量数据Oracle技术网—Export/Import 使用技巧与常见错误Oracle技术网—Oracle数据库的备份与恢复Oracle技术网—如何把数据exp到Sql loader里Oracle技术网—如何单独备份一个或多个表Oracle技术网—如何单独备份一个或多个用户Oracle技术网—如何导入指定表Oracle技术网—如何建立一个与现存数据库相同,但不包含数据的空库Oracle技术网—如何在oracle7和oracle8之间exp/imp数据Oracle技术网—提高ORACLE数据库系统import性能Oracle技术网—为何我的导出文件只有500KOracle技术网—自动备份Oracle数据库Oracle技术网—作Export或Import时,如何记录LOG信息?SQL技巧Oracle技术网—LONG数据类型使用上的一些说明Oracle技术网—Oracle8 PL/SQL编程风格与系统性能的提高Oracle技术网—Oracle8中用户名、表名、列名、索引名...可以用中文命名吗Oracle技术网—Oracle中如何实现某一字段自动增加1Oracle技术网—SQL(Structured Query Language)语句分哪几类Oracle技术网—SQL*PLUS常用命令列表Oracle技术网—SQL*Plus系统环境变量有哪些?如何修改?Oracle技术网—SQL*Plus中缓冲区命令列表Oracle技术网—SQL*Plus中能运行哪几种命令Oracle技术网—SQLPlus中的复制和粘贴技巧Oracle技术网—查看本用户下的各种对象的SQL脚本Oracle技术网—查找a表中有,而在b表中没有的记录Oracle技术网—利用PL/SQL打印ASCII表Oracle技术网—如何查找、删除表中重复的记录Oracle技术网—如何对CLOB行字段执行全文检索Oracle技术网—如何对CLOB字段进行全文检索?Oracle技术网—如何改变表中列的名字Oracle技术网—如何改变一个字段初始定义的Check范围Oracle技术网—如何给表、列加注释Oracle技术网—如何将 primary key 建在其它的表空间上Oracle技术网—如何删除表中的列Oracle技术网—如何使‘CREATE TABLE AS SELECT’能支持ORDER BY ?Oracle技术网—如何通过 SQL*PLUS 将符号 & 、'号(单引号) 插入Oracle数据库的表中Oracle技术网—如何用SQL生成SQL批处理文件Oracle技术网—如何在PL_SQL中读写文件Oracle技术网—如何自动生成一个含有20000101至20500101共50年日期的表Oracle技术网—如何自动生成一个含有2000年01月至2050年01月共50年月份的表Oracle技术网—删除a表中和b表相同的数据Oracle技术网—在Oracle快速进行数据行存在性检查Oracle技术网—怎样查看表的结构Oracle技术网—怎样改变SQL*Plus启动时默认路径Oracle技术网—怎样计算表中的记录数Oracle技术网—怎样在SQL*Plus中使用 '&' 来实现自定义参数变量?Oracle技术网—怎样在查询记录时给记录加锁Oracle错误Oracle7 7.3.2.2Oracle技术网—Oracle 816中如何启动Enterprise ManagerOracle技术网—Oracle Enterprise Manager(OEM)工具中如何以SYSOPER、SYSDBA方式登录Oracle技术网—ORACLE数据库应用开发常见问题及排除Oracle技术网—监听器错误Oracle技术网—联机热备份失败后,如何打开数据库Oracle技术网—没有备份、只有归档日志,如何恢复数据文件Oracle技术网—某个数据文件损坏,如何打开数据库Oracle技术网—如何使用归档日志进行完全恢复Oracle技术网—如何正确建立TYPE、partition(分区)Oracle技术网—一个控制文件被损坏,如何启动Oracle技术网—在SQL*Plus中insert进的都是中文的,为什么一存入服务器后,再select出的就是???了Oracle技术网—重装Oracle服务器后,以前的数据可以恢复吗Oracle初学者入门Oracle技术网—Oracle 8.1.6 for Win2000 系统文件解释Oracle技术网—Oracle 基本知识Oracle技术网—Oracle8 数据类型Oracle技术网—what is sql?Oracle技术网—安装、配置后,SQL*Plus操作初步Oracle技术网—安装Oracle后,经常使用的修改表空间的SQL代码Oracle安装、删除Oracle技术网—Oradim工具的用法Oracle技术网—WINDOWS NT上,如何删除ORACLE SERVICEOracle技术网—如何连接两台Oracle服务器Oracle技术网—如何在Windows 2000下将Oracle完全卸载Oracle技术网—如何在WINDOWS NT上删除所有的Oracle安装?Oracle技术网—手工安装数据库时需要安装那些系统包Oracle技术网—手工创建数据库的全部脚本及说明Oracle安全性问题Oracle技术网—Linux ORACLE 8.1.5漏洞Oracle技术网—Oracle 8.1.6的oidldapd中的漏洞Oracle技术网—Oracle8的不安全因素及几点说明Oracle技术网—Oracle数据库的安全策略Oracle技术网—Oracle数据库密码文件的使用和维护Oracle技术网—提高Oracle数据库应用系统安全的举例与分析数据库安全性策略Oracle系统设置、优化、连接《Oracle8 优化技术》摘录 (第一章 安装)《Oracle8 优化技术》摘录 (第二章 内存/CPU)《Oracle8 优化技术》摘录 (第三章 输入/输出)Oracle技术网—ASP 中通过OLEDB访问 Oracle 的代码Oracle技术网—Delphi5 企业版使用BDE访问 Oracle方法Oracle技术网—oracle database access objectOracle技术网—Oracle基于Client/Server的性能调整Oracle技术网—PB7 连接 Oracle 的配置方法Oracle技术网—PB内置Oracle数据库接口的使用方法Oracle技术网—PHP+Oracle(OCI) 初步Oracle技术网—PHP4连接Oracle 8i的方法(转译)Oracle技术网—多个数据库时,如何设置默认数据库Oracle技术网—如何备份Oracle设置Oracle技术网—如何让你的SQL运行得更快Oracle技术网—如何修改 SQL*Plus 的启动参数Oracle技术网—如何在Windosws 2000中安装JSP并访问OracleOracle技术网—如何在Windosws 2000中安装perl并访问OracleOracle技术网—如何在Windosws 2000中安装PHP4并访问OracleOracle技术网—如何在Windosws NT中使用批处理命令自动启动或关闭Oracle ServicesOracle技术网—如何在客户端省略输入数据库串,而只输入用户名、密码即可Oracle技术网—使用Database Configuration Assistant安装第二个数据库Oracle技术网—修改Oracle7数据库maxdatafiles参数的方法索引、序列、快照、数据库链路、触发器Oracle技术网—触发器的几种应用Oracle技术网—建立触发器时最容易忽略的两个地方Oracle技术网—快照和触发子结合使用的例子Oracle技术网—能否通过视图更新表中的数据Oracle技术网—如何创建一个简单的JAVA存储过程?Oracle技术网—如何创建隐藏IP地址的最后一项的函数?Oracle技术网—如何加密Oracle中的存储过程Oracle技术网—为什么有时ORACLE数据库不用索引来查找数据Oracle技术网—我的数据库链路为什么不工作Oracle技术网—一个建立快照的简单例子Oracle技术网—怎样创建一个简单的自定义过程并引用Oracle技术网—怎样手工刷新快照oracle与其他数据库的比较MySQL 测试Oracle技术网—Oracle 和 mysql 的一些简单命令对比参照Oracle技术网—Oracle8i和Microsoft SQL Server7.0比较Oracle技术网—比较SQL Server与Oracle、DB2Oracle技术网—各种数据类型的比较Oracle技术网—戏说SQL—几种SQL 服务器的比较关键任务      在Internet上运作公司是一项艰苦的任务其它知识OEM常见问题及其解决办法Oracle 8 资料库函式库Oracle 资料库函式库Oracle技术网—Decode()函数使用技巧(NT+IIS+ASP+ORACLE)Oracle技术网—Dual伪列Oracle技术网—NULL 使用详解Oracle技术网—OLAP及其多维数据分析Oracle技术网—Oracle for NT系统实用工具介绍Oracle技术网—ORACLE 用户的规范化管理Oracle技术网—user、uid伪列Oracle技术网—大型数据库设计原则Oracle技术网—留言簿(带Oracle数据库分页的显示功能)Oracle技术网—漫谈oracle中的空值Oracle技术网—如何正确利用Rownum来限制查询所返回的行数Oracle技术网—什么是ROWID,为什么需要它Oracle技术网—数据库技术考试大纲(中级)Oracle技术网—数据库行业的现状和展望Oracle技术网—在客户端处理Oracle的数据行加锁问题如何对CLOB行字段执行全文检索Developer 2000Oracle技术网—Developer/2000中各键盘触发子所对应的“按键”Oracle技术网—FORM调用REPORT时,如何去掉report serverOracle技术网—FORM中,Exception(例外)都有哪些,如何书写Oracle技术网—FORM中,FORM中,如何引入图像Oracle技术网—FORM中,WINDOW标题的设置Oracle技术网—FORM中,常用快捷键有哪些Oracle技术网—FORM中,触发子exit_form的两种功能是什么Oracle技术网—FORM中,当光标走到块的最后一项时,如何让按“enter回车”键时,光标自动走到下一条记录的第一项?Oracle技术网—FORM中,当用鼠标点击标签画布的某一“标签页”时,如何判断点击的是哪一页Oracle技术网—FORM中,如何屏蔽默认的功能键Oracle技术网—FORM中,如何实现屏幕同步刷新?Oracle技术网—FORM中,如何使用警告Oracle技术网—FORM中,如何通过 ODBC 访问 Acress 数据?Oracle技术网—FORM中Oracle技术网—FORM中,设置应用特性(光标类型)Oracle技术网—FORM中,怎样创建动态下拉列表ListOracle技术网—FORM中如何存取声音Oracle技术网—FORM中如何存取图象?如何把图象从一个表中导到另一个表中?Oracle技术网—MIS中的图像应用技术Oracle技术网—MIS中的图像应用技术Oracle技术网—从FORM中调用REPORT时,如何使打印结果直接输出到打印机上Oracle技术网—如何从FORM中调用REPORT程序Oracle技术网—如何改变FORM(FMX模块)运行时的title?Oracle技术网—如何在FORM运行中,使定制菜单中的“窗口(W)”菜单项不显示Oracle技术网—如何在启动FORM程序时直接登录到Oracle数据库上?Oracle技术网—运行FORM时,如何使按钮变灰(即无效)Oracle技术网—运行FORM时,如何使窗口(runtime窗口、画布窗口)自动变成最大化、最小化?Oracle技术网—在Developer/2000中如何读写文本型操作系统文件Oracle技术网—在Oracle中实现报表的定长输出linux vs UnixHow To Install Oracle 8.0.5 onto RedHat Linux 6HOWTO: OAS for Linux on FreeBSDHOWTO: Oracle for Linux on FreeBSDOracle 7.3.4 Enterprise Edition for SCO UNIX 安装步骤Oracle技术网—Oracle .com 套件在TurboLinux上的安装Oracle技术网—ORACLE 7.3 Enterprise在SCO OPEN SERVER 5.02 及 5.04 的安装过程Oracle技术网—ORACLE 7.3.4.2 for SCO Unix 安装说明Oracle技术网—Oracle 8 for solaris 2.6 安装步骤Oracle技术网—Oracle 8(8.0.5)标准版安装指南Oracle技术网—Oracle 8i(8.1.5)企业版安装指南Oracle技术网—ORACLE FOR SUN SOLARIS 安装手册Oracle技术网—ORACLE FOR SUN SOLARIS 维护手册Oracle技术网—ORACLE V.7.3.4.3 FOR AIX 安装说明Oracle技术网—ORACLE8I FOR SUN SOLARIS2.7 安装说明Oracle技术网—RedHat 6.1 Step-by-step Install notes for Oracle 8iOracle技术网—RedHat Linux 6.0 上 Oracle 8(8.0.5)标准版 安装实例Oracle技术网—RedHat Linux 6.0 上 Oracle 8i R2 (8.1.6) 企业版安装实例Oracle技术网—如何集成Linux/Apache/PHP4/FastCGI/Oracle/MySQL环境Oracle技术网—如何在你的Linux机器上安装运行OracleOracle技术网—为Linux配备Oracle 8Oracle技术网—在RedHat 6.0上安装Oracle 8i(全攻略)
文字



留言簿(带Oracle数据库分页的显示功能)

摘自:程序人生

作者:可乐


大部份的网站,都会考虑到和使用者之间的互动关系。这时,用留言版的功能,可让使用者留下到此一游,或者是一些和网站的互动讯息。 
在设计上,可以很简单的只留下使用者的短篇留言,也可以设计到依性质分门别类很复杂的 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).">&lt;上页</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).">下页&gt;</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> 
&nbsp; "; 
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].") 
&nbsp; "; 
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 公司,因此在设定时限定拨 
接或专线的会员才能看到,进入前要输入帐号及密码。有兴趣者不妨买个 BIGLOBE 的 
拨接帐号参考。为了保护留言者的隐私,留言以马赛克处理。 



$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> &nbsp; "; 
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].") &nbsp; "; 
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 就可以了,不用将资料真的从资料库上移除。
上一篇:下一篇: