$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> $WebmasterIPArray = $WebmasterIP=false; putenv("ORACLE_SID=WWW"); $handle=ora_logon("user38@WWW","iam3849") or die; $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"; echo "<a href=addmsg.php>新增留言....</a><p>\n"; if ($QUERY_STRING!="") $page = $QUERY_STRING; $page = 0; $i=count($guestbook); $pagestr=""; if ($i!=$page) $pagestr = $pagestr."<a href=index.php?$i>".($i+1)."</a> "; $pagestr = $pagestr.($i+1)." "; $pagestr="<div align=center>$pagestr</div>"; for ($i=$start; $i<$end; $i++) echo "<p><hr><p>\n"; echo "<p><hr><p>\n"; ?> |
在显示留言的部份,考虑到留言内容若很多,加上网路慢的话,可能会让使用者在线路慢的时候拖累整个资料库,因此,尽快的连上资料库,取得需要的资料后,马上关闭资料库,再慢慢送给使用者,应是最好的对策。