亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHPLIB 和多個數據庫連

2019-09-08 23:11:06
字體:
來源:轉載
供稿:網友
你可能有一個站點,有些頁面要處理數據庫。你可能想使用PHPLIB,但是不想為了適應它而改變現存的數據庫。這兒給出實現你的夢想的答案。PHPLIB和多個數據庫。

實現它需要對PHPLIB進行擴充。本文解釋了如何創建擴充。你會發現,這篇文章會幫助你在其它方面對PHPLIB進行擴充。閱讀完這篇文章后,思考一下PHPLIB可以完成你想要的98%的情況吧。

這篇文章所提及的PHPLIB的擴充的建議已經提交給了PHPLIB的開發組。因此,在未來的版本中,可能會出現這些擴充。在你的網頁中的其它的代碼將幫助你組織你的數據庫管理。

數據庫管理

你可以將每一個表放在一個巨大的數據庫中。然而,總有一天會刺傷你。對數據庫進行管理將會使創傷減小到最小。當你的數據庫對一個服務器來說太大時會出現什么情況?當一個服務器不能處理IO吞吐量或者沒有足夠的內存進行處理又會怎么樣?將現有的數據庫進行拆分很難,但是從分離的數據庫開始則容易多了,并且好的數據庫管理會很有幫助。

如果你經營一家書店,你可能有作者列表,帶有價格的書目列表,當前庫存列表和訂單列表。隨著你的業務的發展,訂單列表會增加,并且每一個訂單會占用很多的磁盤空間。一種可能性就是有一天你會將訂單直接放進財務系統。

現在開始將訂單放在分離的數據庫中。因為庫存的數量是隨著訂單而變化的,所以將庫存數據放在同一個數據庫中。

作者列表和書目列表為一些靜態信息,它們會經常被讀到,但是很少改變。實際上,唯一的改變可能就是對于作者記錄會每5年一次,這可能是當這個作者寫了一本新書(或死亡了)。這些數據可能使用與訂單數據庫完全不同的配置。

包含PHPLIB

PHPLIB通過一個名為DB_Sql的類來操作SQL數據庫。在你的代碼中包含適合你的數據庫的版本。在這個例子中,我使用MySQL版本。

為了在你的代碼中得到DB_Sql,在PHPLIB要求的目錄下安裝PHPLIB文件。然后,找到你的cgi-bin目錄,然后在cgi-bin目錄下創建phplib目錄。接著,拷貝所有的PHPLIB中的.inc文件到phplib目錄下。最后,將phplib目錄放在php.ini文件中include_path = 的那行上。

include_path是PHP引用在include()或require()中文件名的地方。在我的NT工作站上,包含路徑是

include_path = ".;i:/project52/includes;i:/project52/phplib";

在Linux機器上,則為

include_path = ".;/home/httpd/includes;/home/httpd/phplib";

在每一個PHP頁面的頂端為




require(common.php3);



?>



common.php3在包含目錄中,包含對每一頁都通用的所有的數據和函數。在common.php3中,為


require(db_mysql.inc);

require(ct_sql.inc);

require(session.inc);

require(auth.inc);

require(perm.inc);

require(user.inc);

require(page.inc);



?>



閱讀PHPLIB文檔(http://phplib.netuse.de),也可以在http://www.phpbuilder.com下查找一些好文章,來了解你需要包括些什么。Db_mysql.inc包含了DB_Sql類的定義。如果你想將MySQL改換成PostGreSQL數據庫,將db_mysql.inc改成對db_pgsql.inc的包含。那里有10個.inc文件,涵蓋了MS SQL,Oracle,Sybase和其它一些數據庫。

請注意,在這個例子中,require()和include()是完全一樣的。Require()和include()工作方式不同,當用在代碼中間或在if()語句中時,結果是不一樣的。

擴充PHPLIB

PHPLIB處理數據庫是通過從DB_Sql類創建的一個對象實現的。Db_mysql.inc包含了DB_Sql類,為MySQL 進行了修改。我們將通過向common.php3添加代碼來擴充DB_Sql,在包含db_mysql.inc的行的后面。

DB_Sql包含了很多進行查詢的函數。我們想改變的一個是:


/* public: 連接管理 */

function connect($Database = "", $Host = "", $User = "", $Password = "") {

/* 缺省處理 */

if ("" == $Database)

$Database = $this->Database;

if ("" == $Host)

$Host = $this->Host;

if ("" == $User)

$User = $this->User;

if ("" == $Password)

$Password = $this->Password;



/* 建立連接,選擇數據庫 */



if ( 0 == $this->Link_ID ) {

$this->Link_ID=mysql_pconnect($Host, $User, $Password);

if (!$this->Link_ID) {

$this->halt("pconnect($Host, $User, $Password) failed.");

return 0;

}

if (!@mysql_select_db($Database,$this->Link_ID)) {

$this->halt("cannot use database ".$this->Database);

return 0;

}

}

return $this->Link_ID;

}

?>

在你的db_mysql.inc中找到connnect()函數(或針對你的數據庫的.inc文件),然后將其拷貝到common.php3中,在db_mysql.inc包含之后的某個地方。你應該將其封裝在類的定義中,并按照本文最后所描述的那樣。

我發現那段代碼很難讀懂。因此,要做的第一件事就是讓拷貝的代碼可讀:


/* public: 連接管理 */

function connect($Database = "", $Host = "", $User = "", $Password = "") {

/* 缺省處理 */

if ("" == $Database) {

$Database = $this->Database;

}

if ("" == $Host) {

$Host = $this->Host;

}

if ("" == $User) {

$User = $this->User;

}

if ("" == $Password) {

$Password = $this->Password;

}

/* 建立連接選擇數據庫 */

if ( 0 == $this->Link_ID ) {

$this->Link_ID=mysql_pconnect($Host, $User, $Password);

if (!$this->Link_ID) {

$this->halt("pconnect($Host, $User, $Password) failed.");

return 0;

}

if (!@mysql_select_db($Database,$this->Link_ID)) {

$this->halt("cannot use database ".$this->Database);

return 0;

}

}

return $this->Link_ID;

}

?>

我將代碼進行縮近排列,這樣對于包括起來的代碼,層次關系可以讓我對括號(譯注:指大括號)進行匹配。這樣做可以避免象因為丟失括號而引起的錯誤。對于單獨的行我也增加了括號。PHP允許你當if語句后只有單一代碼行時不使用括號。一旦你添加了額外的代碼,這個簡寫就失敗了。我建議總是加上括號,以免在后面增加代碼時出現錯誤。


現在,該修改connect代碼了。注意connect()代碼是如何檢測一個連接的存在,并且當連接不存在時是如何創建連接的。這個connect()函數在每一個數據庫查詢之前被調用。不幸的是,當創建連接時它只選擇一次數據庫。如果PHP頁面使用一個以上的數據庫,connect()代碼將不會看到數據庫的變化。

有幾種方式可以修改代碼。我們正在尋找對PHPLIB影響最小的修改方法,并且可以在我們需要診斷一個 問題時,可以讓我們顯示活動數據庫的狀態。需要超出PHPLIB的兩個變量是連接id和數據庫名稱。因此,使這兩個變量對PHPLIB外部可見。在common.php3:


$db_connection = 0; // 普通數據庫連接id

$db_database = ""; // 當前數據庫名字

?>


接著,我們修改PHPLIB來保存連接id和數據庫名字在這些字段中。你的其它的代碼可以設置和使用同一字段。如果你需要在診斷問題時知道哪一個數據庫正在使用,在你的頁面中插入這些代碼:


Print("

db_database: " . $db_database . "

");

?>

(有一些更簡潔的方法來書寫打印語句。這個方法可以在彩色代碼編輯器中加亮變量名。這個方法對于數組和其它復合變量名工作也很穩定。)

我們如何讓connect()來使用新的變量呢?我們可在項部加入額外的行,所以你可以:


{

globals $db_connect, $db_database;

/* 缺省處理 */



?>

這行使我們的外部變量在connect()中有效。

下面是更傳統些的方法。在$db_database后面直接加入:


function db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {

globals $db_connect;

if(!empty($db_connect_host)) {

$db_connect = mysql_pconnect($db_connect_host,

$db_connect_user, $db_connect_pass);

}

return($db_connect);

}



function db_database($db_database_new="") {

globals $db_database;

if(!empty($db_database_new)) {

$db_database = @mysql_select_db($db_database_new, db_connect());

}

return($db_database);

}



?>


通過定義這些通用函數一次,你可以在各種地方得到通用變量,不需要在所有地方增加全局行。這兒就是使用了我們的db函數的通用函數:


function connect($Database = "", $Host = "", $User = "", $Password = "") {

/* 缺省處理 */

if ("" == $Database) {

$Database = $this->Database;

}

if ("" == $Host) {

$Host = $this->Host;

}

if ("" == $User) {

$User = $this->User;

}

if ("" == $Password) {

$Password = $this->Password;

}

/* 建立連接,選擇數據庫 */

if ( 0 == db_connect()) {

$this->Link_ID = db_connect($Host, $User, $Password);

if (!$this->Link_ID) {

$this->halt("pconnect($Host, $User, $Password) failed.");

return 0;

}

}

if (0 != db_connect()) {

if($Database != db_database()) {

$this->Database = db_database($Database))

if(empty($this->Database)) {

$this->halt("cannot use database " . $this->Database);

return 0;

}

}

}

return $this->Link_ID;

}



?>


請注意這些小地方的修改:



  對于數據庫的測試是在連接測試之外的,以便connect()可以檢測一個新的數據庫,甚至當已經存在一個當前連接的時候。這就是說,我們將db_connect()同0進行比較兩次。這樣的結果值得做一些小改動。



  我們將數據庫的連接與數據庫的選擇放在PHPLIB之外,這樣在代碼中需要進行數據庫選擇的地方我們可以使用相同的函數。



  在這種情況下只有一個不好的地方:我們假設相同的主機,用戶和口令,用于所有的數據庫操作。如果你使用一個用戶登錄,使用特別的權限處理指定的數據庫,你將不得不為這種處理創建一個特別的連接。怎么辦呢?定義變量:






$db_host = "";

$db_user = "";

$db_pass = "";



?>



  擴充db_database()函數,比較當前用戶和主機名同特殊的用戶和主機。你也可以加入:






$db_type = "";



?>



  然后用它來保存數據庫的類型,MySQL,Oracle,等等,這樣你就可以處理多個數據庫。



  修改代碼以便可以處理多個數據庫要復雜一點。你需要修改查詢函數,還包括連接與選擇函數。你也許想閱讀一下關于PHP的ODBC方式的連接,在PHPLIB中使用ODBC選項。ODBC可以以一種通用的方法處理很多的數據庫,但可能有些慢。ODBC可以允許你使用相同的代碼在多個類型的數據庫上。如果你確實使用了多個數據庫類型,可能會遇到對數據格式的要求不同的問題和不同數據庫之間的差異的問題。ODBC簡化了連接,但是沒有完善數據庫解釋數據和SQL的方法。



  現在開始關于派生對象類的簡短教學。connect()函數被封裝在類的定義中:






class DB_Sql {



}



?>



  當我們拷貝這個函數到common.php3中時,我們需要派生DB_Sql類。我們通過封裝connect()來實現:






class db_DB_Sql extends DB_Sql {



}



?>



  可以查閱PHP的文檔關于對象和類的內容,看一下"extends"做了些什么。用最少的話來說就是:在派生中定義的每個東西替換或覆蓋了原始定義的東西。



  現在可以使用db_DB_Sql了。當你安裝好PHPLIB時,你會有一條語句,寫為:






$x = new DB_Sql;



?>



  將其改成:






$x = new db_DB_Sql;



?>



  這樣就會使用修改后的類,代替了原始的類。



  你現在已經成了一個對象,類,OOP的專家了,可以要求每年薪水為,100了。(老外膽子夠大)



  我們做了一個有效的修改,而且對PHPLIB代碼的影響最小。記錄下修改的痕跡,這樣你可以將其重用于PHPLIB的新版本中。如果在數據庫處理中出現錯誤,你可以在外部的函數中插入print語句,看一看在連接時發生了什么?,F在你可以做更多的事情了,而沒有修改PHPLIB代碼。



  如果SQL看上去失敗了,你可以將qurey()函數從db_mysql.inc中的DB_Sql中拷貝到common.PHP3中的db_DB_Sql中去,然后插入print語句,查看SQL的使用情況。



  PHPLIB會記錄cookie。在PHPLIB中間的一條print語句可能會產生錯誤消息,是關于輸出HTTP頭信息的問題??梢院雎藻e誤,或者將診斷信息寫到一個磁盤文件中去。



  開始為:



$db_log_file = "t:/diag.txt";



  或相似的語句,用來指向一個在磁盤某個地方的文件。在Windows下,要確信使用了一個存在的目錄,否則你會得到一個奇怪的錯誤

現在定義:


function db_log($db_log_message) {

globals $db_log_file;

$db_log_f = fopen($db_log_file, "a");

fwrite($db_log_f, date("Y m d H:i:s")." ".$db_log_message."rn");

fclose($db_log_f);

}



?>

任何時候你需要查看發生了什么,象這樣加入日志信息:


db_log("current database: " . db_database());

?>

你可以使用一些內建的日志技術和系統日志。使用系統日志時,可能因為沒有處理正確的目錄,從而可能要搜索大量的文件,卻只為一點點信息。這種分離的日志可以在測試過程中向你提供一些控制。我建議在操作前后加入日志,象:


db_log("current database: " . db_database());

db_database("bookcatalogue");

db_log("current database: " . db_database());

?>

記住在你的數據庫處理中使用正確的數據庫,這樣你就不用查詢PHPLIB數據庫了。你可能喜歡為數據庫函數函數創建一個封裝函數,或者修改你使用的函數。如果你使用mysql_query(),你可以首先使用db_database()。你也可以替換:


db_database("bookcatalogue");

$result = mysql_query("select * from?", db_connect());



?>




$result = mysql_db_query(db_database("bookcatalogue"), "select * from?",

db_connect());



?>

建議做成函數:



function db_query($db_query_database, $db_query_sql) {

return(mysql_db_query(db_database($db_query_database), $db_query_sql,

db_connect());

}



?>

現在你可以實現

使用PHPLIB(和任何相似的軟件)處理多個數據庫

擴充類/對象

插入診斷檢查

將日志信息寫入文件中

以相反的次序實踐它們。在日志文件可工作后,然后是診斷檢查,然后是對類的擴充,然后是多個數據庫。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97免费中文视频在线观看| 92福利视频午夜1000合集在线观看| 国产精品久久久久久搜索| 国产精品精品国产| 曰本色欧美视频在线| 欧美午夜激情在线| 69**夜色精品国产69乱| 久久久电影免费观看完整版| 热99久久精品| 国产裸体写真av一区二区| 久久躁狠狠躁夜夜爽| 日韩精品高清在线| 欧美一级淫片丝袜脚交| 欧美日韩一区二区在线播放| 欧美性猛交xxxx久久久| 国产精品视频不卡| 欧美激情精品久久久久久大尺度| 亚洲日本欧美日韩高观看| 日韩精品视频在线| 精品久久久久久中文字幕一区奶水| 国产综合香蕉五月婷在线| 麻豆国产va免费精品高清在线| 久久不射电影网| 欧美肥臀大乳一区二区免费视频| 亚洲精品视频免费在线观看| 亚洲自拍偷拍一区| 亚洲国产毛片完整版| 日韩电影中文字幕一区| 中文字幕av一区中文字幕天堂| 亚洲第一精品自拍| 久久天堂av综合合色| 亚洲自拍偷拍区| 国产一区二区三区18| 精品亚洲一区二区| 国产一区玩具在线观看| 成人午夜一级二级三级| 国产精品精品视频| 亚洲日本aⅴ片在线观看香蕉| 亚洲最大成人网色| 欧美一级片久久久久久久| 精品福利在线视频| 欧美性猛交xxxx黑人| 亚洲免费视频观看| 国产色视频一区| 欧美日韩国产影院| 国产视频久久久久| 色樱桃影院亚洲精品影院| 国产亚洲综合久久| 久久综合国产精品台湾中文娱乐网| 国产精品久久久久久久久久久久久| 性欧美xxxx| 欧美性极品xxxx娇小| 欧美日韩亚洲精品一区二区三区| 久久国产精品电影| 久久精品中文字幕电影| 国产亚洲精品美女久久久久| 欧美精品videossex性护士| 亚洲色图激情小说| 欧美日韩xxx| 欧美性xxxxxxxxx| 国模精品视频一区二区三区| 这里只有精品丝袜| 亚洲欧美在线一区二区| 国产精品普通话| 国语自产精品视频在线看一大j8| 国产精品久久久久久五月尺| 亚洲成人教育av| 日韩欧美一区二区在线| 米奇精品一区二区三区在线观看| 自拍偷拍亚洲在线| 久久久久久国产精品| 日韩精品视频三区| 亚洲丝袜一区在线| 国产成人在线亚洲欧美| 91av在线播放视频| 亚洲一区二区少妇| 欧美中文在线免费| 久久91亚洲人成电影网站| 亚洲天堂一区二区三区| 一本一本久久a久久精品牛牛影视| 亚洲精品视频网上网址在线观看| 亚洲国语精品自产拍在线观看| 中文字幕在线日韩| 亚洲aⅴ日韩av电影在线观看| 欧美一级视频一区二区| 精品自在线视频| 97国产精品久久| 国产精品一区二区三区久久| 欧美有码在线观看视频| 日韩精品视频在线观看免费| 国内精品久久久久久| 亚洲国产美女精品久久久久∴| 九九精品视频在线观看| 亚洲深夜福利视频| 欧美性videos高清精品| 日韩av免费在线看| 中文字幕精品在线| 欧美性极品少妇精品网站| 日韩欧美成人区| 国产精品久久久久久久久久99| 欧美性jizz18性欧美| 国产成人自拍视频在线观看| 九九热这里只有精品6| 久久视频国产精品免费视频在线| 在线色欧美三级视频| 日本乱人伦a精品| 欧美成年人在线观看| 色综合久久中文字幕综合网小说| 精品伊人久久97| 亚洲国产小视频在线观看| 成人有码视频在线播放| 日韩中文在线观看| 中文在线资源观看视频网站免费不卡| 亚洲激情国产精品| 伊人久久久久久久久久久| 精品女同一区二区三区在线播放| 欧美壮男野外gaytube| 久久久久国产视频| 精品香蕉一区二区三区| 精品久久久久久久久久ntr影视| 国产欧美日韩中文| 亚洲欧洲在线观看| 午夜美女久久久久爽久久| 91麻豆国产语对白在线观看| 亚洲性69xxxbbb| 日韩精品中文字幕有码专区| 日本一区二区在线播放| 欧美国产日韩一区二区在线观看| 色婷婷av一区二区三区久久| 日韩视频在线一区| 97精品国产97久久久久久春色| 久久这里有精品| 亚洲一区二区三区视频播放| 久久免费少妇高潮久久精品99| 日韩av一区二区在线观看| 亚洲图片在区色| 91视频免费在线| 国语自产精品视频在线看| 国产在线视频91| 欧美整片在线观看| 久久久国产精品视频| 久久精品99久久香蕉国产色戒| 久久精品国产2020观看福利| 亚洲欧美日本伦理| 亚洲男女自偷自拍图片另类| 亚洲综合色激情五月| 国产日本欧美在线观看| 91在线免费看网站| 国产日韩在线观看av| 国产精品99蜜臀久久不卡二区| 欧美日韩国产成人高清视频| 俺去啦;欧美日韩| 久热在线中文字幕色999舞| 欧美国产在线电影| 九色精品免费永久在线| 亚洲精品久久久久久久久久久久久| 超薄丝袜一区二区| 青青草一区二区| 国产丝袜一区视频在线观看| 亚洲欧美日韩中文在线制服| 色吧影院999| 亚洲精品视频播放| 欧美福利视频在线| 欧美最猛性xxxxx亚洲精品|