directory search
oracle知识 ORACLE的数据类型 Oracle技术网—DBMS_Job包的用法 Oracle技术网—Oracle for NT系统实用工具介绍 Oracle技术网—Oracle常见错误代码 Oracle技术网—Oracle常用Script Oracle技术网—Oracle常用数据字典 Oracle技术网—ORACLE数据库简介 Oracle技术网—Oracle特殊包 Oracle技术网—Oracle相关站点 Oracle技术网—哪些初始化参数最影响Oracle系统性能 PL/SQL DBA Oracle7 7.3.2.2 Oracle技术网—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、16K Oracle技术网—如何手工指定使用哪个回退段 Oracle技术网—如何修改internal的口令 Oracle技术网—如何移动控制文件到新的目录中 Oracle技术网—如何移数据库文件 Oracle技术网—如何增加表空间的大小 Oracle技术网—怎样查看init.ora文件 Oracle技术网—怎样查看SGA值 Oracle技术网—怎样查看哪些用户拥有SYSDBA、SYSOPER权限? Oracle技术网—怎样快速查出Oracle 数据库中的锁等待 Oracle技术网—怎样识别IO竞争和负载平衡 Exp vs Imp Oracle技术网—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技术网—为何我的导出文件只有500K Oracle技术网—自动备份Oracle数据库 Oracle技术网—作Export或Import时,如何记录LOG信息? SQL技巧 Oracle技术网—LONG数据类型使用上的一些说明 Oracle技术网—Oracle8 PL/SQL编程风格与系统性能的提高 Oracle技术网—Oracle8中用户名、表名、列名、索引名...可以用中文命名吗 Oracle技术网—Oracle中如何实现某一字段自动增加1 Oracle技术网—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.2 Oracle技术网—Oracle 816中如何启动Enterprise Manager Oracle技术网—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 SERVICE Oracle技术网—如何连接两台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 object Oracle技术网—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并访问Oracle Oracle技术网—如何在Windosws 2000中安装perl并访问Oracle Oracle技术网—如何在Windosws 2000中安装PHP4并访问Oracle Oracle技术网—如何在Windosws NT中使用批处理命令自动启动或关闭Oracle Services Oracle技术网—如何在客户端省略输入数据库串,而只输入用户名、密码即可 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、DB2 Oracle技术网—各种数据类型的比较 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 2000 Oracle技术网—Developer/2000中各键盘触发子所对应的“按键” Oracle技术网—FORM调用REPORT时,如何去掉report server Oracle技术网—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中,怎样创建动态下拉列表List Oracle技术网—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 Unix How To Install Oracle 8.0.5 onto RedHat Linux 6 HOWTO: OAS for Linux on FreeBSD HOWTO: Oracle for Linux on FreeBSD Oracle 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 8i Oracle技术网—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机器上安装运行Oracle Oracle技术网—为Linux配备Oracle 8 Oracle技术网—在RedHat 6.0上安装Oracle 8i(全攻略)
characters



留言簿(带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 就可以了,不用将资料真的从资料库上移除。
Previous article: Next article: