欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
PHPLIB簡(jiǎn)明教程(中文)

◇本書(shū)版權所有 ---- 黑仔強


目 錄
一. 本文目標與聲明
二.phplib 的概述
三.phplib 的基本功能介紹
四.phplib 基本安裝和使用
五. 如何使用phplib數據庫驅動(dòng)(一)
六. 如何使用phplib數據庫驅動(dòng)(二)
七. 如何使用phplib的Session功能
八. 使用phplib編程具體例子
九. 使用phplib編程具體例子(二)
十. 使用phplib編程具體例子(三)




一.本文目標與聲明


本文可以說(shuō)是筆者用phplib進(jìn)行開(kāi)發(fā)的經(jīng)驗與技巧總結。在開(kāi)發(fā)期間,本人用phplib和自己寫(xiě)的一些核心函數庫和 類(lèi),用很短時(shí)間就開(kāi)發(fā)了很多高效而強大的程序工具,足以表明模塊化面向對象編程的好處。

  由于筆者使用phplib做開(kāi)發(fā)的時(shí)間并不很長(cháng),而且程序本身很多高級的算法并沒(méi)采用phplib,因此 phplib的很多核心高級功能也沒(méi)有完全使用。水平有限,所以如果出現任何的錯誤疏漏,請各位不吝賜教。

  本文的目標是期望讀者可以在短時(shí)間內熟悉phplib的基本功能,并能夠利 用它進(jìn)行中小型程序,例如簡(jiǎn)單的新聞發(fā)布,數據查詢(xún),簡(jiǎn)單留言本和小論壇等。由于篇幅關(guān)系,phplib的一些高級應用本文并未提及,請各位原諒。

  聲明:凡是參考本文章后如果出現任何錯誤或者失誤,本人并不提供任何技術(shù)支持。

  凡是發(fā)現本文的任何錯誤,請給筆者發(fā)email或者oicq告訴,幫助筆者完善本文檔。

凡是與標準的phplib有出入的地方,請大家以標準phplib的為依據。



二.phplib的概述

現在互聯(lián)網(wǎng)上流行著(zhù)很多優(yōu)秀的嵌入式的腳本語(yǔ)言,例如perl,php,asp,jsp等。其中最流行的一種就是 php,它以全部公開(kāi)代碼、開(kāi)發(fā)容易、跨平臺、功能強大以及支持數據庫類(lèi)型繁多等特點(diǎn)贏(yíng)得了網(wǎng)上眾多程序員的青睞。

  而隨著(zhù)php的應用和推廣,php的眾多開(kāi)發(fā)人員和很多愛(ài)好者在php的基礎上開(kāi)發(fā)了很多php的程序庫,這些程 序庫包括了大量的類(lèi)、方法、變量和方法,能夠處理復雜的web資源和提供強大的功能,大大簡(jiǎn)化了程序設計和提高了代碼的可重用性。其中phplib就是這 些庫中相當優(yōu)秀的產(chǎn)品,它特別在數據庫訪(fǎng)問(wèn)、數據庫驅動(dòng)以及訪(fǎng)問(wèn)認證和模板等方面具有很高的價(jià)值和實(shí)用性。用來(lái)開(kāi)發(fā)大中型程序是相當適合的。

  利用phplib可以非常輕易的開(kāi)發(fā)出跨硬件、操作系統平臺和數據庫無(wú)關(guān)的 程序,其中很多優(yōu)秀的程序都是采用了phplib來(lái)開(kāi)發(fā)的。例如著(zhù)名的phpslash就是一個(gè)例子。由于有了面向對象庫和類(lèi)的支持,數據庫驅動(dòng)都由類(lèi)來(lái) 完成,因此寫(xiě)程序的時(shí)候基本上不需要考慮用的是什么數據庫和如何驅動(dòng)數據庫,只需要懂得標準SQL語(yǔ)言就可以了。phpslash一旦安裝好后就可以很好 的運行,提供優(yōu)異的用戶(hù)認證功能。即使在不支持session的php3下也可以很正常的使用session。并且它可以運行在nt或者unix平臺下, 支持多達7種數據庫而程序從一個(gè)平臺或者系統轉移到另外一個(gè)平臺或者系統上的時(shí)候,程序行本身一個(gè)字也不需要改動(dòng)。

有關(guān)phplib的詳細信息和文檔可以到http://phplib.netuse.de 查找。




三.phplib的基本功能介紹

phplib包含了很多功能,提供了眾多的函數。然后根據筆者經(jīng)驗,覺(jué)得只要很好掌握其中的基本類(lèi)和方法后,平時(shí)的工作 幾乎都不需要那些額外的高級類(lèi)就可以完成了。

1.將數據庫驅動(dòng)和對數據庫操作完全分離,這樣的好處是對數據庫的操作你需要的知識僅僅是SQL語(yǔ)言而不需要去估計各 個(gè)不同數據庫間的函數不同,如果需要將程序移植的話(huà),那么phplib的優(yōu)勢非常明顯。需要修改的僅僅是數據庫驅動(dòng)文件,而程序行幾乎都不需要修改任何一 行。如果是采用具體數據庫函數操作的程序(例如用MySQL函數編寫(xiě)),那么移植起來(lái)幾乎是等于重新編寫(xiě)。區別一看就知道了。

2.支持Session,這個(gè)功能可以創(chuàng )建一個(gè)受保護的頁(yè)面。它可以廣泛的應用 到需要進(jìn)行登陸或者依靠賬號和權限來(lái)判別的程序。例如論壇、虛擬社區、新聞發(fā)布、用戶(hù)管理、電子商務(wù)等。而且這個(gè)和純粹的cookie不同,采用了 base_64的編碼和解碼。因此一般并不容易破譯。為了加強安全性,用戶(hù)可以自己編寫(xiě)自己的編碼方式取代它原來(lái)的編碼方式。

同時(shí)phplib還將每一個(gè)會(huì )話(huà)都保存到數據庫中,因此可以通過(guò)查詢(xún)數據庫值得 有多少用戶(hù)在線(xiàn)上。

3.權限許可(Perm),這個(gè)功能可以定義一系列具有不同級別和權限的用戶(hù)。不需要編 程人員額外地自己編寫(xiě)相應功能的代碼就可以實(shí)現了分級管理和限制。同時(shí)可以利用phplib中page/admin目錄中的管理程序創(chuàng )建用戶(hù)和修改相關(guān)信 息。編程人員可以修改這些程序來(lái)服務(wù)自己的系統,節省了大量時(shí)間。

4.模板templete,和 FastTemplete類(lèi)似的是,phplib也有自己的模板功能類(lèi)和文件。讓用戶(hù)可以方便的創(chuàng )建和修改html模板,并且將php代碼和html代碼 分離。便于讓程序員和美工良好的合作。phplib的模板采用了定義標記和語(yǔ)法分析、模式匹配等技術(shù),從而實(shí)現了和FastTemplete類(lèi)似的功能。 編程人員可以根據實(shí)際的需要對這個(gè)功能代碼進(jìn)行修改以滿(mǎn)足自己需求。

5.購物車(chē)Cart,這個(gè)是個(gè)比較簡(jiǎn)易的 購物車(chē),各種物品和項目可以存放到車(chē)中,也可以被取出來(lái),通過(guò)一些改造后也可以將這個(gè)功能做成電子商務(wù)中流行的購物系統的。 6.Html部件,在phplib中還有一些稱(chēng)為"HTML Widgets"的東西,可以方便地生成窗口/表格等。具體可以參考phplib手冊。這里不再贅述。




四.phplib基本安裝和使用

要想使用phplib強大的功能,有幾種途徑可以達到目的。

1.采用phplib建議的安裝方式,說(shuō)安裝,其實(shí)就是把phplib的類(lèi)預先讓解析器加載到內存,這樣使用的時(shí)候就 不需要做任何設置,這樣的好處顯而易見(jiàn)。不過(guò)缺點(diǎn)也是很多的,如果程序按照這個(gè)方式直接引用phplib的函數的話(huà),對于一些采用虛擬主機的用戶(hù)來(lái)說(shuō),如 果ISP的服務(wù)器沒(méi)有安裝phplib的話(huà),就不可以直接使用phplib了。所以這個(gè)方式的前提是:你的ISP支持phplib或者你有權限控制web 服務(wù)器,對于一般用戶(hù)在自己機器上調試的話(huà),這個(gè)方式比較好。

詳細做法這里不再贅述,只簡(jiǎn)單說(shuō)個(gè)過(guò)程而已:

a.下載phplib最新包,并解壓好。

b.將里面的php目錄的內容放 到一個(gè)安全的地方,例如/usr/local/phplib下

c.將這個(gè)目錄的路徑名添加到 php3.ini/php.ini的include關(guān)鍵字段后
include .:/usr/local/phplib
然后在找到auto_prepend_file關(guān)鍵字改成:
auto_prepend_file = prepend.php3
重新啟動(dòng)一次web服務(wù)器,用phpinfo()函數檢查包含路徑和自動(dòng)預加載參數,如果顯示的值和剛才設定的一樣的話(huà)就證明成功了。

更加詳細的安裝/設定可以參考phplib的文檔。

2.包含的方式。這個(gè)方式就是 比較麻煩,但是好處就是對于使用虛擬主機的用戶(hù)來(lái)說(shuō),可以不需要ISP支持phplib就能享受phplib的功能?;痉椒ê芎?jiǎn)單,可以在使用到 phplib功能的程序最頂部加入相應的包含文件。不過(guò)要注意文件之間的相互依賴(lài)關(guān)系,下面是一個(gè)簡(jiǎn)單例子,它可以調用到基本的MySQL數據庫驅動(dòng)功能 和Session功能:

$LIBDIR = " /usr/local/phplib ";
require($LIBDIR . "db_mysql.inc");
require($LIBDIR . "ct_sql.inc");
require($LIBDIR . "session.inc");
require($LIBDIR . "local.inc");
require($LIBDIR . "page.inc");




五.如何使用phplib數據庫驅動(dòng)(一)

第一部份:數據庫連接/查詢(xún)

a.四步曲:

【ChinaByte 教程】1.要根據庫中的DB_Sql來(lái)編寫(xiě)一個(gè)類(lèi),這個(gè)只需要在你的頂層包含文件中定義好就行了,同一個(gè)程序使用時(shí)不需要重定義,例子是:

class slashDB extends DB_Sql
{
var $classname="slashDB";
/**** Remember to change the below items to match your db *****/
var $Host = "localhost";
var $Database = "abc";
var $User = "abc";
var $Password = "abc";

function halt($msg){
printf("數據庫出現錯誤!: %s \n", $msg);
printf("MySQL 錯誤!: %s (%s) \n", $this->Errno, $this->Error);
printf("請聯(lián)系WebMaster并報告此出錯信息得詳細內容。\n ");
die("Session 掛起。");
}
}

其中slashDB的名字是任意的,根據編程者的喜好設定,不過(guò)都建議 用extends語(yǔ)句生成的類(lèi)的名字 最好都有DB兩個(gè)字。例如userDB,slashDB。并且$classname要和class slashDB extends DB_Sql中 slashDB一樣!否則類(lèi)定義出錯。其他需要修改的僅僅是類(lèi)的名字,$classname,$Host,$Database ,$User,$Password等需要修改。函數halt是錯誤提示。你可以自定義到一個(gè)頁(yè)面。

2.使用編寫(xiě)好的類(lèi)的時(shí)候,用new關(guān)鍵字 $abc = new slashDB; 其中$abc是個(gè)變量名,這代表你要使用slashDB類(lèi)的功能。

3.查詢(xún)數據庫

一般有2個(gè)方法,短的查詢(xún)直接將語(yǔ)句寫(xiě)到函數,長(cháng)的就先用一個(gè)變量分別儲存再查詢(xún)。

a. 短語(yǔ)句:

$abc->query("SELECT * FROM user WHERE username='kk' AND passwd='kk' ");

注意的是這里是一個(gè)調用slash類(lèi)中的 方法query,并且數據庫查詢(xún)語(yǔ)句不能漏了" ",否則出錯。

b.長(cháng)語(yǔ)句

$q = "SELECT username,passwd,email,nation,url,edulev";
$q .= ",seclev FROM user WHERE username='$username' ";
$q .= "AND aid='$aid' ORDER BY ID DESC";
$abc->query($q); //這里才執行查詢(xún)

采用了短語(yǔ)句 合成長(cháng)語(yǔ)句的方法。其中需要注意的是第一個(gè)$q是起始的語(yǔ)句,不能跟“.”號!

接著(zhù)同名的$q就是需要和第一 個(gè)$q合成的變量,其實(shí)是同一個(gè)變量但是分別賦一個(gè)長(cháng)語(yǔ)句的不同 部分。因為為了避免互相覆蓋就用“.”號!!切記切記!

另外查詢(xún)語(yǔ)句中該有空格的必須有空格,即使該行沒(méi)有,下一行也必須有。例如$q .= ",seclev FROM user WHERE username='$username' ";句中最后有一個(gè)空格如果他沒(méi)有,而接著(zhù)的行開(kāi)頭沒(méi)有的話(huà),數據庫查詢(xún)會(huì )出錯的。

4.取得結果

$abc->next_record();

這個(gè)是一個(gè)沒(méi)有返回值的 語(yǔ)句,他只會(huì )讓Record[];這個(gè)方法產(chǎn)生相應的查詢(xún) 結果。如果沒(méi)有這句話(huà)就不會(huì )產(chǎn)生相應的結果。next_record()是將當前指針向前移動(dòng)并更新Record 、Error、Row、Errno的函數。因此不運行他一定不能夠產(chǎn)生你需要的結果。

$temail = $abc->Record["email"];
$turl = $abc->Record["url"];

這幾句 就是將查詢(xún)后的結果賦值給指定的變量。

注意:一般如果返回的row超過(guò)一行,你就要用習慣方法: while($abc->next_record()) { php代碼 } 來(lái)進(jìn)行處理了。這個(gè)方法就是便歷了所有查詢(xún)到的結果。




六.如何使用phplib數據庫驅動(dòng)(二)

第二部份:數據庫插入/刪除

b. 插入/兩步曲:

【ChinaByte 教程】1.創(chuàng )建一個(gè)調用類(lèi)的變量

$add = new slashDB;

2.進(jìn)行數據庫查詢(xún)操作(實(shí)際上無(wú)論是SELECT還是INSERT等語(yǔ)句都是調用query方法和MySQL交互的)

$add->query("INSERT INTO vars VALUES ('a','b','c')");

注意這里其實(shí)INSERT語(yǔ)句有很多寫(xiě)法,其中最多用的就是以下幾種:

(1).直接賦值:INSERT INTO 表名字 VALUES (值列表,用''號包含,用,號分隔);

例子:$add->query("INSERT INTO vars VALUES ('a','b','c')");

(2).指定插入字段:INSERT INTO 表名字 (指定字段名字列表) VALUES (對應字段值);

例子:$add->query("INSERT INTO vars (name,mail) VALUES ('kk','kk@k')");

兩者差別在于第一種必須給所有字段賦值,無(wú)論是空還是非空都要賦值,如果數據表 有很多字段 而你開(kāi)始只需要插入很少幾個(gè)字段,那么就會(huì )浪費很多人力了。第一種適合于字段少的情況。第二種就是為了處理第一種的缺陷的。但是不適合于數據表字段少的情 況。

刪除/兩步曲:

1.創(chuàng )建一個(gè)調用類(lèi) 的變量

$del = new slashDB;

2.查詢(xún)操作

$del->query("DELETE FROM user WHERE username='kk' AND passwd='kk'");

一般這是刪除某一條特定記錄。如果要刪除全 部?jì)热莞尤菀?。只需要DELETE FROM 數據庫表名字可以了。

c.數據庫內容更新

更新/兩步曲:

1.創(chuàng )建一個(gè)調用類(lèi)的變量

$update = new slashDB;

2.查詢(xún)操作

$q = "UPDATE user SET username='$username',passwd='$pwd',email='$mail' ";
$q .= "WHERE ID='$id' AND DATE='$date'";
$update->query($q);

這里UPAATE就沒(méi)有什么 特殊的格式,基本上都是UPDATE 數據庫表 SET 字段名='字段值' 判斷條件(WHERE語(yǔ)句)。這個(gè)加入了WHERE語(yǔ)句是為了更新某一條特定的記錄。




七.如何使用phplib的Session功能

基本的Session使用方法

【ChinaByte 教程】以下就是一個(gè)以用戶(hù)登陸和注銷(xiāo)為例子的Session使用例子,通過(guò)它你就會(huì )明白如何使用session以及Session是如何起作用的。你也會(huì ) 體會(huì )到使用了Phplib/Zsulib的好處和帶來(lái)的便利。

a.建立一個(gè)Session的類(lèi)

class slashSess extends Session
{
var $classname = "slashSess"; // 和定義DB_Sql的道理一樣
var $magic = "fkIsNotEqualToIK"; // 隨機化Session的字符串,建議用函數生成唯一串
var $mode = "cookie"; // 在GET模式時(shí)使用cookie
var $lifetime = 86400; // session cookie的生存時(shí)間(單位:秒)
var $that_class = "slash_sql"; // 要使用的目標數據庫名字(一般情況并沒(méi)用上)
var $allowcache = "no"; // 是否使用緩沖?有3個(gè)選項:no/public/private
}

注意:其中slashSess這個(gè)名字可隨便修改的,但是和定義 DB_Sql的extends一樣要保證和$classname名字一樣就可以了。其中這個(gè)定義了類(lèi)slashSess的式子中,$magic的字串建議 使用隨機函數產(chǎn)生獨立的字串以避免重復。以下我給出一個(gè)小函數,以生成一個(gè)指定字長(cháng)的獨立隨機串:

/*******************************************************************
function: unimagic() 版本:1.0 日期:2000/8/9 編寫(xiě)地:北京
parameter: $length 需要產(chǎn)生的隨機串的長(cháng)度,默認是8位,最長(cháng)32位 *******************************************************************/

function unimagic($length="8")
{
srand((double)microtime()*1000000);
$ran = rand();
$md5 = md5($ran);
$magic = substr($md5,0,$length);
return $magic;
}

b.使用Session功能

本 部分配合例子Login.php來(lái)說(shuō)明如何運用Phplib/Zsulib中session.inc文件中相關(guān)函數/類(lèi),這里分幾個(gè)部分:

利用page_open函數打開(kāi)一個(gè)類(lèi)對應方法的數組;
注冊提交的一些參數;
利用page_close函數關(guān)閉頁(yè)面同時(shí)保存注冊的信息;
釋放注冊的參數。結束一個(gè)Session會(huì )話(huà)。
這個(gè)小程序的流程(為了突出重點(diǎn),這里盡量簡(jiǎn)化程序,多余的部分全部刪除) 初始化頁(yè)面--->page_open調用Session(開(kāi)始)--->$op=login,注冊提交參數 $op=logout,釋放參數。

1.初始化頁(yè)面

這里需要用到兩個(gè)類(lèi)slashDB和slashSess;其中這兩個(gè)類(lèi)都在前面文檔中提到。這兩個(gè)類(lèi)假定存放在config.php 文件里。因此首先必須包含這個(gè)文件以便可以調用這兩個(gè)類(lèi)。

//////////////////////////////////
//范例頁(yè)面 ver 0.1 2000/8/24 //
//$ID:Login.php By hzqbbc in hp$//
//////////////////////////////////
require "config.php";

 //開(kāi)始定義函數
function display_login() { 內容 }
function error_msg() { 內容 }
//結束定義函數

2.page_open調用Session開(kāi)始

//調用page_open函數,其中slashSess是在config.php定義好的類(lèi)

page_open(array("sess"=>"slashSess"));

注 意:盡量不要在page_open前require一些會(huì )產(chǎn)生html代碼或者進(jìn)行輸出html代碼的操作。否則會(huì )出現提示說(shuō)已經(jīng)發(fā)送了Header信息 而不能再次發(fā)送的錯誤。 3.如果$op=login,進(jìn)行登陸操作并注冊信息:

if ($op=="login")
{

if (isset($passwd) && isset($username)) //判斷用戶(hù)名和密碼是否空?否就繼續
{
$sl_q = new slashDB;//調用類(lèi)
$q = "SELECT seclev FROM user WHERE username='$username' AND passwd='$passwd'";
$sl_q->query($q);//查詢(xún)結果

//如果結果非空 (意味著(zhù)用戶(hù)密碼名字都正確)就繼續

if ($sl_q->next_record())
{
$seclev = $sl_q->Record["seclev"];//給$seclev賦值
//調用register函數,將所有需要記錄的變量全部注冊
$sess->register("username");
$sess->register("seclev");
$sess->register("passwd");
}
}
}

4.如果$op=logout,進(jìn)行注銷(xiāo)信息操作

if ($op=="logout")
{
//調用delete函數刪除注冊的變量
$sess->delete();
//刪除后,對變量進(jìn)行重新賦值并初始化成原始狀態(tài)
$seclev = "0";
$passwd = "";
$username = "";
exit;
echo "你已經(jīng)注銷(xiāo)了!";
}

5.結束本程序

在結束前必須調 用page_close();這樣就完成了一個(gè)完整的Session會(huì )話(huà)。 如果已經(jīng)執行了logout操作就不要執行了。所以完整語(yǔ)句是:

if ($op!="logout") page_close();

結束: 一定要注意程序編寫(xiě)順序,否則會(huì )產(chǎn)生邏輯錯誤。本例子就是一個(gè)最簡(jiǎn)單的用戶(hù)登陸的模型所有采用Phplib的用戶(hù)管理模式都和這個(gè)差不多。




八.使用phplib編程具體例子

1.一些聲明

  關(guān)于本例子,本例子原來(lái)是為本協(xié)會(huì )(中山大學(xué)GNU/Linux協(xié)會(huì ))內部會(huì )員編寫(xiě)的,因此從比較長(cháng)遠的角度考慮 來(lái)編寫(xiě),考慮比較多的是代碼編寫(xiě)規范和習慣與算法??紤]到這些因素對編程也是很重要的,因此相關(guān)的章節與內容我并沒(méi)有刪除,如果讀者覺(jué)得這部分沒(méi)必要的話(huà) 請email通知筆者,謝謝。

2.代碼的編寫(xiě)風(fēng)格

  這里講的 不是如何寫(xiě)注釋或者是如何寫(xiě)版權信息,而是提出若干比較有代表性和比較優(yōu)美的編程習慣(這里稱(chēng)做風(fēng)格)。一般來(lái)說(shuō),php和perl等web腳本程序,都 不可避免地和html等扯上關(guān)系。而相當多的程序員并沒(méi)有很好地注意自己的php/perl代碼和html代碼的關(guān)系,造成了程序行艱澀難懂,結構混亂最 后連自己都懶得看的結局。

  本人從開(kāi)發(fā)ZSU-Slash-Pro的這一個(gè)月里發(fā)現,優(yōu)秀的程序不僅僅有優(yōu) 秀的算法,還有優(yōu)美而易懂的程序結構。尤其對于大型程序來(lái)說(shuō),如果代碼含糊,結構混亂的話(huà),即使是程序開(kāi)發(fā)者本人,看起代碼也會(huì )覺(jué)得格外費力,其他人看起 來(lái)就更加辛苦了。

  因此很有必要摸索并制訂出一套合適的編寫(xiě)代碼的規范,用這套規范來(lái)約束和統 一程序開(kāi)發(fā)人員開(kāi)發(fā)的代碼風(fēng)格。使之易于閱讀和修改,方便日后維護和進(jìn)一步開(kāi)發(fā)的人員,使調試程序簡(jiǎn)單化成為可能。

這里,我主要參考了PHPSlash和phplib和FreeTrade等幾個(gè)中大型程序,結合自己的一點(diǎn)小經(jīng)驗,總結出了以下幾點(diǎn):

(1).通用內容做成包含文件

  這個(gè)方法是將每個(gè)生成的頁(yè)面都會(huì )包含的通用內 容做成包含文件,這樣減少了程序的長(cháng)度。便于統一修改例如phpslash中它每個(gè)頁(yè)面都要使用一個(gè)統一的Header/Footer,因此只需要創(chuàng )建兩 個(gè)包含文件slashhead.inc和slashfoot.inc文件,然后在每個(gè)php程序中使用require語(yǔ)句包含它們進(jìn)入代碼內部就可以了。

  注意:并不是只規定使用header和footer,如果你愿意,你可以添 加任意多個(gè)require的部分。

(2).公共函數庫

  對于那 些經(jīng)常使用的函數和變量,沒(méi)必要在每個(gè)程序內都定義和聲明,而只需要將它們放到一個(gè)公共的函數/配置文件內就行了。

  例如PHPSlash中有幾十個(gè)函數,這些函數都統一地存放到functions.inc中,并被包含在了配置文件config.php3 中。這樣所有頁(yè)面調用到里面的函數時(shí)候就不需要定義而只需要直接調用就可以了。

(3).html代碼生成函數(庫)

對于一些經(jīng)常需要編寫(xiě)的html代碼,可以用一個(gè)專(zhuān)門(mén)的函數生成這些html代碼。

  例如一個(gè)顯示登陸的 對話(huà)框,你就可以將這個(gè)對話(huà)框的內容編寫(xiě)一個(gè)函數叫dsp_login()。這樣每次你需要顯示的時(shí)候只需要直接調用這個(gè)函數就可以了。同樣道理,你可以 將生成頁(yè)面的頭部和尾部都做成一個(gè)函數,例如叫put_header()和put_footer()等。這樣就很輕松地將html代碼和php代碼分離 了。

(4).封裝過(guò)程

  盡量隱藏具體操作的過(guò)程,取代的是面 向對象的類(lèi)或者某個(gè)操作函數。這樣的好處就是將過(guò)程封裝起來(lái),使主程序簡(jiǎn)潔明快、層次清楚。

  例如某個(gè)注冊 程序,它需要完成顯示注冊窗口、檢索用戶(hù)、顯示出錯、插入用戶(hù)、發(fā)送電子郵件等5個(gè)功能。如果把這5個(gè)功能都全部用一般的過(guò)程設計的話(huà),代碼相對難懂。如 果換成5個(gè)操作函數(或者說(shuō)把具體分析操作過(guò)程封裝起來(lái)的話(huà))那么就非常簡(jiǎn)潔而易懂。

  以下是程序主體:

dsp_reg();
check_user();
if ($return=="true")
{
insert_user();
mail_user();
}
else dsp_error();

  可見(jiàn)這樣的程序即使是初學(xué)者都很 容易看懂。

(5).功能分塊化

  盡量將程序需要執行的功能分 化成對應的操作/動(dòng)作,也就是分塊化,好處是易于程序調試,條理清楚。

  一個(gè)最好的例子就是 PHPSlash的admin.php3。它將所有的功能都歸納成了一個(gè)op值。 例如要刪除一個(gè)用戶(hù)-->$op="userdelete"。其實(shí)它這里還有一個(gè)小技巧:就是不是直接調用某個(gè)op而是在表單發(fā)送的時(shí)候發(fā)的是另外 一個(gè)值user_ops,這個(gè)值有幾個(gè)可能:刪除/添加/更新。那么它在程序內有一個(gè)判斷陣列,判斷出這個(gè)user_ops應該對應什么op,因此方便設 計程序。這里假設一個(gè)發(fā)布新聞的簡(jiǎn)單系統,所需要的功能就是發(fā)布新聞,刪除新聞,更新新聞。

  那么歸納成以下3個(gè)op:post/delete/update,以下是結 構流程(用swich語(yǔ)句):

swich($op) {
case "post":
postnews();
break;
case "delete":
delete();
break;
case "update":
update();
break;
default:
dsp_news();
}

  由以上幾點(diǎn)可以看出,如果是能夠按照上面提到的幾點(diǎn)設計程序的話(huà), 那么你設計的就會(huì )是個(gè)結構良好,代碼優(yōu)美易懂的好程序。不過(guò),這還必須取決于良好的程序設計構思。以下給出一個(gè)注冊程序的例子,它體現了本文和本編程規范 提到的大部分內容。整個(gè)程序從設計到完工的時(shí)間僅僅用了5個(gè)小時(shí)。

  雖然并不快,但是基本上是一寫(xiě)好就運轉 正常,沒(méi)有什么邏輯錯誤,結構也比較清楚。

接下來(lái)讀者將看到如何利用以上技巧和原則編寫(xiě)一個(gè)具體的程 序。



九.使用phplib編程具體例子(二)

3.具體程序設計

(1).功能要求:

這里需要做的是一個(gè)注冊程序,它的功能要求是:能夠 自動(dòng)注冊一個(gè)合法用戶(hù),并且將自動(dòng)為用戶(hù)生成一個(gè)8位的密碼并發(fā)送到用戶(hù)的郵箱。其中標識用戶(hù)的是唯一的用戶(hù)名字和唯一且真實(shí)的電子郵箱。

申請的流程是:先輸入用戶(hù)想注冊的用戶(hù)名字和他的真實(shí)電子郵箱。

------> 然后系統查詢(xún)這個(gè)用戶(hù)的名字和郵箱是否存在于數據庫中
------> 如果其中一者存在,則顯示錯誤并返回重新輸入
------> 如果兩者都在系統數據庫中沒(méi)有記錄,說(shuō)明用戶(hù)可以注冊,顯示歡迎畫(huà)面
------> 顯示確認畫(huà)面并注冊用戶(hù)信息
------> 自動(dòng)生成密碼并發(fā)送到用戶(hù)郵箱。

(2).程序流 程:

基本上都和申請流程類(lèi)似。根據每個(gè)功能的不同設計不同的函數進(jìn)行操作:

a.顯示查詢(xún)頁(yè)面

dsp_query();//空白模式
輸入查詢(xún)數據,下一步

b.執行查詢(xún)函數query();

如果成功,則下一步
如果不成功則顯示錯誤并返回

c.顯示確認頁(yè)面

confirm_reg();
dsp_reg();//保存模式 發(fā)送表單

d.插入用戶(hù)

reg();
加入判斷:是否多次刷新頁(yè)面,如果是就不顯示“恭喜”字樣。
insert();
mail_user();
success();

(3).功能函數:

這里動(dòng)用到10個(gè)函數。各個(gè)函數的功能如下:

dsp_query();//顯示查詢(xún)畫(huà)面和確認畫(huà)面 并自動(dòng)根據不同畫(huà)面選擇不同op
查詢(xún): op=check 確認: op=insert
query();//查詢(xún)函數,查詢(xún)輸入的用戶(hù)和郵箱是否存在
confirm_reg();//確認要注冊的函數
reg();插入用戶(hù)的主函數,完成主要的動(dòng)作
make_passwd();//生成8位隨機密碼
insert();//插入用戶(hù)信息的函數
mail_user();發(fā)送注冊信息和用戶(hù)密碼到用戶(hù)信箱的函數
success();//注冊成功函數,顯示成功信息
error_msg();//擁有各種模式的錯誤提示函數
current_time();//提示當前系統時(shí)間的函數

(4).頁(yè)面 結構:

采用了header和footer包含的技術(shù)。并且所有和數據庫連接的類(lèi)和配置都定義在 config.php3中并且使用Zsulib。其中調用到Zsulib中的面向對象的數據庫連接技術(shù)。

主體結構是:

Header.inc
register.php3 -------> require "config.php3";
Footer.inc




十.使用phplib編程具體例子(三)

(5).開(kāi)始具體編寫(xiě)

編寫(xiě)Header.inc,Footer.inc(略)
編寫(xiě)具體函數和相關(guān)接口

(6).解決關(guān)鍵的技術(shù)問(wèn)題

a.如何編寫(xiě)query()呢?

這個(gè)函數需要的功能就是查詢(xún)發(fā)送過(guò)來(lái)的用戶(hù)名和郵箱 是否已經(jīng)給注冊,如果其中之一或者全部都給注冊了后就返回錯誤信息,否則進(jìn)入confim_reg()函數。

設 計思路:先向數據庫查詢(xún)發(fā)送過(guò)來(lái)的$username和$email看是否返回空值。然后判斷兩個(gè)字段的查詢(xún)值是否==""。這就完成了基本的查詢(xún)功能 了。

以下是query();的完整代碼:

function query($username,$email)
{
$sl_q = new userDB;
$sl_q->query("SELECT username,email FROM user WHERE username='$username' or email='$email'");
$sl_q->next_record(); $tusername = $sl_q->Record["username"];
$temail = $sl_q->Record["email"];
if ($username==$tusername && $tusername!="") error_msg("user_exist");
elseif ($email==$temail && $temail!="") error_msg("mail_exist");
elseif ($tusername=="" && $tmail=="" && $username!="" && $email!="")
confirm_reg($username,$email);
else error_msg("unknown");
}

b.如何編寫(xiě)make_passwd()呢?

此函數負責生成隨機的8位密碼。 設計思路:可以利用unix系統的random守護進(jìn)程產(chǎn)生的隨機因子,也可以利用php的隨機函數rand同時(shí)為了獲得指定的8為密碼必須采用一個(gè)能夠 從字符串中切取到給定長(cháng)度字符串的函數。這里我們采用substr。

以下是make_passwd();基本 代碼

function make_passwd()
{
$ran = rand();
$passwd = substr($ran,0,8);
return $passwd;
}

c.如何編寫(xiě)confim_reg()?

要達到能夠提示你確認這個(gè)功能并不容易。因為必須兩次調用dsp_query()而兩次dsp_query()卻需要完成不同的功能。因此 必須讓confim_reg()傳送若干參數給dsp_query()讓它知道應該如何操作。

設計思路:讓 confim_reg()傳一個(gè)$msg給dsp_query(),讓它知道這是確認的信息以轉換功能。

以下 是confim_reg()完整代碼:

function confirm_reg($un,$em)
{$time = current_time();
$msg ="<center>恭喜你!在<font color=red>$time</font>這一刻你的用戶(hù)名和郵箱還沒(méi)有給注冊!<br>
如果你確實(shí)想成為本站會(huì )員,請按<font color=red><b>注冊</b></font>按鈕。
<p></center>";
dsp_query($un,$em,"我要注冊","$msg");
}

d.如何編寫(xiě)dsp_query()呢?

該函數功能稍微要復雜點(diǎn),就是需要根據$msg來(lái)決定它自己要實(shí)現什么任務(wù)。

設計思路:由于 查詢(xún)和確認注冊?xún)烧呤遣煌?,因此查?xún)按鈕應該自動(dòng)換成注冊按鈕。這個(gè)利用參數$botton實(shí)現。判斷到底是處于查詢(xún)還是確認,可以利用$msg是否空 來(lái)判斷(因為確認函數會(huì )發(fā)一個(gè)$msg過(guò)來(lái))。另外要區分兩者的話(huà),必須在發(fā)標單的時(shí)候自動(dòng)選擇$op=?因此也可以通過(guò)$msg是否空來(lái)給$op賦值。 查詢(xún)是:check,確認是insert。

以下是dsp_query()的基本代碼:

function dsp_query($un,$em,$botton,$msg)
{
$head = "<tr>";
if ($botton == "" ) $botton="查詢(xún)";
if ($msg !="") $action="insert";//如果有確認信息就insert
else $action="check";//否則就只是一般查詢(xún)
$cation = "歡迎到本站注冊。一旦賬號生效你就可以享受到本站提供給會(huì )員第一流的服務(wù)";

$post ="<td align=left width=40%><form method=\"POST\" action=\"$PHP_SELF\">
<input type=\"hidden\" name=op value=$action>
<p>用戶(hù)名:<input type=text name=\"un\" size=20 value=$un></p>
<p>信箱名:<p><input type=text name=\"em\" size=20 value=$em></p>
<p> <input type=submit value=\"$botton\" name=submit> 
<input type=reset value=\"復原\"></p>
</form></td>";

$foot = "</tr>";
if ($msg =="") fancybox("100%","查詢(xún)",$head.$post."
<td width=60%>". $cation ."</td>".$foot,"r");
else {
fancybox("100%","確認",$head.$post."<td width=60%>".$msg."</td>".$foot,"r");
}
}

e.最后的判斷語(yǔ)句:

判 斷程序的操作流程和函數調用。這里僅僅給出代碼(非常簡(jiǎn)單的代碼):

switch ($op) {
case "check":
query($un,$em);
break;
case "insert":
reg($un,$em);
case "null":
break;
default:
dsp_query();
}


(7).結束編寫(xiě)




---------
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
9.1 通過(guò)PHP操作MySQL數據庫 - 《PHP數據庫系統開(kāi)發(fā)完全手冊》 - 免費試讀...
PHP安全性漫談
PHP簡(jiǎn)單學(xué)習 保證入門(mén)學(xué)會(huì )
分離美工 杜絕重復
怎樣才能成為PHP高手?
十天學(xué)會(huì )php
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久