| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> php >> 使用PHPLIB訪問多個數據庫
 

使用PHPLIB訪問多個數據庫

2008-12-23 08:12:56  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  PHPLIB是PHP的一些擴展庫,使用它我們可以很方便地對數據庫進行各種操作,不過,如果你要使用多個數據庫的話,它就顯得力不從心了,本文介紹了通過擴展PHPLIB,讓你魚和熊掌兼得,在使用PHPLIB的同時可以使用多個數據庫,而且從中你也可以了解到面向對象編程和如何擴展庫的知識,值得一讀。

  數據庫管理

  你可以在一個大型的數據庫中放入任何表。不過時間長了,將會令數據庫變得越來越大,服務器可能會跟不上IO的工作,或者沒有足夠的內存應付所有的訪問?要分開現有的數據又非常難。明智的辦法是開始時就使用分開的數據庫,並且進行有效的數據庫管理。 如果你有一個賣書的網站,你可能有作者的列表,書價的列表,還有當前的庫存和訂單的列表。當你的業務不斷增長時,訂單將會不斷地增長,而且處理每個訂單都需要進行很多的磁盤訪問。很可能你將在某一天將所有的訂單都放到一個會計系統中。

  現在就將訂單放到一個獨立的數據庫吧。由于庫存也是通過訂單更新的,因此庫存量也放到同樣的數據庫中。

  作者的列表和書的列表都是一些靜態的信息,要經常讀取,但很少更新。實際上,更新一個作者的記錄可能只需要每5年一次,只在作者寫了一本新書(或者去世)時進行。放這些數據的服務器的配置可與放訂單數據庫的服務器完全不同。

  包含PHPLIB

  PHPLIB通過一個稱爲DB_Sql的類訪問SQL數據庫。根據你需要使用的數據庫類型,將不同的inc文件包含在你的代碼中。在這個例子中,我使用MySQL的版本。

  爲了在你的代碼中使用DB_Sql,要將PHPLIB文件安裝在它們自己的目錄中。然後,找到你的cgi-bin目錄,並且在cgi-bin的目錄旁創建phplib目錄。下一步,拷貝所有的PHPLIB .inc文件到phplib目錄。最後,修改php.inc文件,只要將「include_path=」的行改爲該phplib目錄就可以了。

  include_path是PHP使用include()或者require()時查找的目錄,在我的NT workstation中,include的路徑是:

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

  在Linux的系統上

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

  在每個PHP頁面的頂部加入

  <?php

  require(common.php);

  ?>

  common.php3放在includes目錄中,包含了每個頁面要用到的所有數據和函數。在這個例子中的common.php是:

  <?php

  require(db_mysql.inc);

  require(ct_sql.inc);

  require(session.inc);

  require(auth.inc);

  require(perm.inc);

  require(user.inc);

  require(page.inc);

  ?>

  如果你想知道每個inc文件的用處,可閱讀http://phplib.netuse.de上的PHPLIB文檔。Db_mysql.inc包含了所有DB_SQL類的定義。如果你想使用PostGreSQL代替MySQL,只要用db_pgsql.inc代替db_mysql.inc就可以了。還有10個其它的.inc文件,可以使用MS SQL、Oracle、Sybase或者其它的數據庫。

  要注意的是,在這個例子中,require()和include()是完全一樣的。不過,如果放在代碼中,或者在if語句中使用時,Require()和include的使用是完全不同的,並且有不同的運行結果。

  擴展PHPLIB

  PHPLIB通過一個DB_Sql類産生的對象來訪問數據庫。Db_mysql.inc包含了爲MySQL修改過的DB_Sql類。我們將通過在common.php中加入代碼來擴展DB_sql,這些代碼將加在包含db_mysql.inc的行後。

  DB_Sql包含了很多用作查詢的函數,我們要作修改的是:

  <?php

  /* 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 (Database,$this-]Link_ID"!@mysql_select_db($Database,$this->Link_ID)) {

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

  return 0;

  }

  }

  return $this->Link_ID;

  }

  ?>

  在你的db_mysql.inc(或者其它數據庫的相關.inc文件)中找到connect()函數,然後將它拷貝到common.php,放到包含db_mysql.inc代碼的後面,在後面,還要將它封裝爲一個類的定義。

  我發現這些代碼有些難讀,因此,首先令拷貝來的代碼的可讀性更好:

  <?php

  /* 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 (Database,$this-]Link_ID"!@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和數據庫的名字。只要在common.php加入:

  <?php

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

  $db_database = ""; // 當前數據庫的狀態

  ?>

  下一步,我們要對PHPLIB作修改,以便在這些變量中存儲連接id和數據庫的名字。在其它的代碼中,你可以設置和使用同樣的變量名。在分析問題時,如果你需要知道現在使用哪個數據庫,只要在頁面中插入以下的代碼:

  <?php

  Print(" db_database: " . $db_database . "");

  ?>

  我們怎樣才能讓connect()使用這些新變量呢?我們可以在頂部加入一行:

  <?php

  {

  globals $db_connect, $db_database;

  /* Handle defaults */

  ?>

  通過這些代碼,新變量就可被connect()訪問到

  在定義了$db_database後,加入:

  <?php

  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);

  }

  ?>

  只要定義這些公共的函數一次,你就可以在不同的地方使用這些公共的變量,而不需要加入global申明。以下就是使用上面db函數的公共函數:

  <?php

  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外,這樣你就可以在PHP代碼的任何地方使用同樣的數據庫選擇函數。

  不過,現在的處理有一個限制,這裏我們是假定對于所有的數據庫,都使用同樣的主機、用戶和密碼。如果你的數據庫對于不同的用戶有不同的權限,你必須建立一個特別的連接來訪問它。怎樣做?只要定義以下變量就可以了:

  <?php

  $db_host = "";

  $db_user = "";

  $db_pass = "";

  ?>

  通過擴展db_database()函數,將當前的用戶和主機和某個用戶和主機作對比就行。你還可以加入:

  <?php

  $db_type = "";

  ?>

  這個變量用來存儲數據庫的類型,mysql或者Oracle等。這樣你就可以訪問多個數據庫。

  不過要改變代碼來處理多個不同類型的數據庫是頗複雜的。你必須還要改變查詢函數,以及連接和選擇函數。你或許可通過PHP的ODBC來連接,然後使用PHPLIB的ODBC選項來處理。ODBC通過一個通用的方式來處理多種數據庫,因此將會慢一點。ODBC雖然可讓你使用同樣的代碼來處理多個不同類型的數據庫。但是在需要用到不同處理格式的日期時,將會有問題,而且在數據庫間也會存在一些奇怪的差異。ODBC只是簡化了連接,但是並沒有修改數據庫解釋數據和SQL的方式。

  現在來學習一下如何重新定義一個對象類。connect()函數被封裝到一個類的定義中:

  <?php

  class DB_Sql {

  }

  ?>

  我們將該函數拷貝到common.php時,我們必須重新定義DB_Sql類,我們可以這樣封裝connect():

  <?php

  class db_DB_Sql extends DB_Sql {

  }

  ?>

  要詳細了解"extends"的工作,我們可以看看PHP文檔中關于對象和類的部分。簡單說來:擴展部分的任何定義替換和覆蓋了以前的所有定義。

  現在可以使用db_DB_Sql。在你配置PHPLIB時,你要做以下聲明:

  <?php

  $x = new DB_Sql;

  ?> Change it to: <?php

  $x = new db_DB_Sql;

  ?>

  這樣你就可以使用修改的類,而不是以前的類。

  在連接數據庫出錯的時候,你可以在外部的函數中輸出目前的連接狀態。如果SQL語句出錯,你也可以將DB_Sql中的query()函數拷貝到common.PHP的db_DB_Sql中,然後插入一個輸出語句,看看當前的SQL語句是什麽。

  你也可以將錯誤或者診斷的信息寫到一個磁盤文件中。通過定義

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

  或者一個類似的文本文件。如果使用Windows,你要確保該目錄存在,否則你會得到一個錯誤的信息。

  然後定義一個函數:

  <?php

  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);

  }

  ?>

  在你需要記錄信息的地方,加入以下代碼:

  <?php

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

  ?>

  其實你可以使用內置的或者系統的日志文件。不過這樣你就要在一大堆的文件中查找一小段信息。因此這個獨立的記錄文件可幫助你進行測試。我建議在記錄前後寫以下的代碼:

  <?php

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

  db_database("bookcatalogue");

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

  ?>

  在數據訪問時,要記得使用正確的數據庫,而不是PHPLIB中定義的數據庫。你可以爲該數據庫創建一個封裝的函數,或者改變你使用的函數。如果你使用mysql_query(),你可以先用db_database(),你可以用

  <?php

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

  db_connect());

  ?> which suggests the function: <?php

  function db_query($db_query_database, $db_query_sql) {

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

  db_connect());

  }

  ?>

  來代替

  <?php

  db_database("bookcatalogue");

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

  ?>

  現在你可以做到

  .使用PHPLIB(或者類似的軟件)來訪問多個數據庫

  .擴展類/對象

  .插入診斷檢查

  .建立日志文件
 
 
 
上一篇《Pear的PHP_Compat包》
下一篇《使用PHP動態生成gif時遇到的問題和解決辦法》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
PHPLIB是PHP的一些擴展庫,使用它我們可以很方便地對數據庫進行各種操作,不過,如果你要使用多個數據庫的話,它就顯得力不從心了,本文介紹了通過擴展PHPLIB,讓你魚和熊掌兼得,在使用PHPLIB的同時可以使用多個數據庫,而且從中你也可以了解到面向對象編程和如何擴展庫的知識,值得一讀。 數據庫管理    你可以在一個大型的數據庫中放入任何表。不過時間長了,將會令數據庫變得越來越大,服務器可能會跟不上IO的工作,或者沒有足夠的內存應付所有的訪問?要分開現有的數據又非常難。明智的辦法是開始時就使用分開的數據庫,並且進行有效的數據庫管理。 如果你有一個賣書的網站,你可能有作者的列表,書價的列表,還有當前的庫存和訂單的列表。當你的業務不斷增長時,訂單將會不斷地增長,而且處理每個訂單都需要進行很多的磁盤訪問。很可能你將在某一天將所有的訂單都放到一個會計系統中。   現在就將訂單放到一個獨立的數據庫吧。由于庫存也是通過訂單更新的,因此庫存量也放到同樣的數據庫中。   作者的列表和書的列表都是一些靜態的信息,要經常讀取,但很少更新。實際上,更新一個作者的記錄可能只需要每5年一次,只在作者寫了一本新書(或者去世)時進行。放這些數據的服務器的配置可與放訂單數據庫的服務器完全不同。 包含PHPLIB   PHPLIB通過一個稱爲DB_Sql的類訪問SQL數據庫。根據你需要使用的數據庫類型,將不同的inc文件包含在你的代碼中。在這個例子中,我使用MySQL的版本。   爲了在你的代碼中使用DB_Sql,要將PHPLIB文件安裝在它們自己的目錄中。然後,找到你的cgi-bin目錄,並且在cgi-bin的目錄旁創建phplib目錄。下一步,拷貝所有的PHPLIB .inc文件到phplib目錄。最後,修改php.inc文件,只要將「include_path=」的行改爲該phplib目錄就可以了。 include_path是PHP使用include()或者require()時查找的目錄,在我的NT workstation中,include的路徑是: include_path = ".;i:/project52/includes;i:/project52/phplib"; 在Linux的系統上 include_path = ".;/home/httpd/includes;/home/httpd/phplib"; 在每個PHP頁面的頂部加入 <?php require(common.php); ?> common.php3放在includes目錄中,包含了每個頁面要用到的所有數據和函數。在這個例子中的common.php是: <?php require(db_mysql.inc); require(ct_sql.inc); require(session.inc); require(auth.inc); require(perm.inc); require(user.inc); require(page.inc); ?>   如果你想知道每個inc文件的用處,可閱讀[url=http://phplib.netuse.de]http://phplib.netuse.de[/url]上的PHPLIB文檔。Db_mysql.inc包含了所有DB_SQL類的定義。如果你想使用PostGreSQL代替MySQL,只要用db_pgsql.inc代替db_mysql.inc就可以了。還有10個其它的.inc文件,可以使用MS SQL、Oracle、Sybase或者其它的數據庫。   要注意的是,在這個例子中,require()和include()是完全一樣的。不過,如果放在代碼中,或者在if語句中使用時,Require()和include的使用是完全不同的,並且有不同的運行結果。 擴展PHPLIB   PHPLIB通過一個DB_Sql類産生的對象來訪問數據庫。Db_mysql.inc包含了爲MySQL修改過的DB_Sql類。我們將通過在common.php中加入代碼來擴展DB_sql,這些代碼將加在包含db_mysql.inc的行後。 DB_Sql包含了很多用作查詢的函數,我們要作修改的是: <?php /* 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 ([url=mailto:!@mysql_select_db($Database,$this-]Link_ID"!@mysql_select_db($Database,$this->Link_ID[/url])) { $this->halt("cannot use database ".$this->Database); return 0; } } return $this->Link_ID; } ?>   在你的db_mysql.inc(或者其它數據庫的相關.inc文件)中找到connect()函數,然後將它拷貝到common.php,放到包含db_mysql.inc代碼的後面,在後面,還要將它封裝爲一個類的定義。 我發現這些代碼有些難讀,因此,首先令拷貝來的代碼的可讀性更好: <?php /* 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 ([url=mailto:!@mysql_select_db($Database,$this-]Link_ID"!@mysql_select_db($Database,$this->Link_ID[/url])) { $this->halt("cannot use database ".$this->Database); return 0; } } return $this->Link_ID; } ?>   我調整了一下括號的位置,並且在單行的前後也加入了一個大括號。在PHP的if語句中,如果只有一句代碼的話你可以不用括號,但是,如果你增加多一行代碼,就會馬上出錯。因此我建議你加入一個括號,以免後來加入代碼時出錯。   在改變connect的代碼之前,先要了解一下connect()是如何工作的,它檢查當前是否存在一個連接,如果不存在連接的話,就創建一個連接。在每次的數據庫查詢之前,首先運行這個connect()函數。可惜的是,它只在首次連接的時候選擇數據庫,如果你的PHP頁面使用超過一個數據庫,connect()並不會選擇另外的數據庫。   要改變代碼的話,有幾種不同的方法。我們要選擇一種對PHPLIB的影響最小,而且可讓我們在需要分析問題的時候,能夠顯示數據庫連接狀態的方法。我們需要在PHPLIB外保存連接id和數據庫的名字。只要在common.php加入: <?php $db_connection = 0; // 數據庫連接的id $db_database = ""; // 當前數據庫的狀態 ?>   下一步,我們要對PHPLIB作修改,以便在這些變量中存儲連接id和數據庫的名字。在其它的代碼中,你可以設置和使用同樣的變量名。在分析問題時,如果你需要知道現在使用哪個數據庫,只要在頁面中插入以下的代碼: <?php Print(" db_database: " . $db_database . ""); ?> 我們怎樣才能讓connect()使用這些新變量呢?我們可以在頂部加入一行: <?php { globals $db_connect, $db_database; /* Handle defaults */ ?> 通過這些代碼,新變量就可被connect()訪問到 在定義了$db_database後,加入: <?php 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); } ?>   只要定義這些公共的函數一次,你就可以在不同的地方使用這些公共的變量,而不需要加入global申明。以下就是使用上面db函數的公共函數: <?php 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外,這樣你就可以在PHP代碼的任何地方使用同樣的數據庫選擇函數。   不過,現在的處理有一個限制,這裏我們是假定對于所有的數據庫,都使用同樣的主機、用戶和密碼。如果你的數據庫對于不同的用戶有不同的權限,你必須建立一個特別的連接來訪問它。怎樣做?只要定義以下變量就可以了: <?php $db_host = ""; $db_user = ""; $db_pass = ""; ?>   通過擴展db_database()函數,將當前的用戶和主機和某個用戶和主機作對比就行。你還可以加入: <?php $db_type = ""; ?>   這個變量用來存儲數據庫的類型,mysql或者Oracle等。這樣你就可以訪問多個數據庫。   不過要改變代碼來處理多個不同類型的數據庫是頗複雜的。你必須還要改變查詢函數,以及連接和選擇函數。你或許可通過PHP的ODBC來連接,然後使用PHPLIB的ODBC選項來處理。ODBC通過一個通用的方式來處理多種數據庫,因此將會慢一點。ODBC雖然可讓你使用同樣的代碼來處理多個不同類型的數據庫。但是在需要用到不同處理格式的日期時,將會有問題,而且在數據庫間也會存在一些奇怪的差異。ODBC只是簡化了連接,但是並沒有修改數據庫解釋數據和SQL的方式。   現在來學習一下如何重新定義一個對象類。connect()函數被封裝到一個類的定義中: <?php class DB_Sql { } ?> 我們將該函數拷貝到common.php時,我們必須重新定義DB_Sql類,我們可以這樣封裝connect(): <?php class db_DB_Sql extends DB_Sql { } ?>   要詳細了解"extends"的工作,我們可以看看PHP文檔中關于對象和類的部分。簡單說來:擴展部分的任何定義替換和覆蓋了以前的所有定義。 現在可以使用db_DB_Sql。在你配置PHPLIB時,你要做以下聲明: <?php $x = new DB_Sql; ?> Change it to: <?php $x = new db_DB_Sql; ?> 這樣你就可以使用修改的類,而不是以前的類。   在連接數據庫出錯的時候,你可以在外部的函數中輸出目前的連接狀態。如果SQL語句出錯,你也可以將DB_Sql中的query()函數拷貝到common.PHP的db_DB_Sql中,然後插入一個輸出語句,看看當前的SQL語句是什麽。 你也可以將錯誤或者診斷的信息寫到一個磁盤文件中。通過定義 $db_log_file = "t:/diag.txt"; 或者一個類似的文本文件。如果使用Windows,你要確保該目錄存在,否則你會得到一個錯誤的信息。 然後定義一個函數: <?php 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); } ?> 在你需要記錄信息的地方,加入以下代碼: <?php db_log("current database: " . db_database()); ?>   其實你可以使用內置的或者系統的日志文件。不過這樣你就要在一大堆的文件中查找一小段信息。因此這個獨立的記錄文件可幫助你進行測試。我建議在記錄前後寫以下的代碼: <?php db_log("current database: " . db_database()); db_database("bookcatalogue"); db_log("current database: " . db_database()); ?>   在數據訪問時,要記得使用正確的數據庫,而不是PHPLIB中定義的數據庫。你可以爲該數據庫創建一個封裝的函數,或者改變你使用的函數。如果你使用mysql_query(),你可以先用db_database(),你可以用 <?php $result = mysql_db_query(db_database("bookcatalogue"), "select * from?", db_connect()); ?> which suggests the function: <?php function db_query($db_query_database, $db_query_sql) { return(mysql_db_query(db_database($db_query_database), $db_query_sql, db_connect()); } ?> 來代替 <?php db_database("bookcatalogue"); $result = mysql_query("select * from?", db_connect()); ?> 現在你可以做到 .使用PHPLIB(或者類似的軟件)來訪問多個數據庫 .擴展類/對象 .插入診斷檢查 .建立日志文件
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
美得讓人陶醉
杭州美女模特米萊
清純迷人唐小妹
氣質一流的上海女生
夢醉克孜加爾湖畔
珠江公園(二)
魔域桃源
南嶺森林公園親水谷
 
>>返回首頁<<
 
 
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有