如何解決ThinkPHP實現多資料庫連接的方法

來源:互聯網
上載者:User
這篇文章主要介紹了ThinkPHP實現多資料庫連接的解決方案,需要的朋友可以參考下

ThinkPHP實現串連多個資料的時候,如果資料庫在同一個伺服器裡的話只需要這樣定義模型:

class MembersModel extends Model{protected $trueTableName = 'members.members'; //資料庫名.表名(包含了首碼)}

然後就可以像D("Members");這樣執行個體化模型,像普通模型那樣操作了。
但後來發現他的資料庫在兩個不同的伺服器,這樣上面的方法就不行了。
這時候就需要使用TP的多資料連線特性了。

對此,查閱官方文檔進行測試並修正之後得出了如下的解決方案:

要建立多資料連線,首先要構造資料庫配置參數。但是如果每次都在建立多資料庫連接的時候都建立資料庫配置數組,這樣就會很麻煩,還不如寫在設定檔裡。這裡怎麼寫還是需要有點技巧的。

<?php$config= array('DEBUG_MODE'=>true,'default_module'=>'Index','ROUTER_ON'=>TRUE,'DATA_RESULT_TYPE'=>1,'SHOW_RUN_TIME'=>true,   // 已耗用時間顯示'SHOW_ADV_TIME'=>true,   // 顯示詳細的已耗用時間'SHOW_DB_TIMES'=>true,   // 顯示資料庫查詢和寫入次數'SHOW_CACHE_TIMES'=>true,  // 顯示快取作業次數'SHOW_USE_MEM'=>true,   // 顯示記憶體開銷'HTML_FILE_SUFFIX'=>'.shtml',  // 預設靜態檔案尾碼'HTML_CACHE_ON' =>false,   // 預設關閉靜態緩衝'HTML_CACHE_TIME'=>60,   // 靜態緩衝有效期間'HTML_READ_TYPE'=>1,   // 靜態緩衝讀取方式 0 readfile 1 redirect'HTML_URL_SUFFIX'=>'.shtml', // 偽靜態尾碼設定//預設資料庫連結'DB_TYPE'=>'mysql','DB_HOST'=>'localhost','DB_NAME'=>'news','DB_USER'=>'root','DB_PWD'=>'123','DB_PORT'=>'3306','DB_PREFIX'=>'news_',//我的第一個資料庫連接'DB_BBS'=>array('dbms' => 'mysql','username' => 'discuz','password' => '123','hostname' => 'localhost','hostport' => '3306','database' => 'discuz'),//第二個資料庫連結,'DB_NEWS'=>array('dbms'=>'mysql','username'=>'root','password'=>'123','hostname'=>'localhost','hostport'=>'3306','database'=>'news'));return $config;?>

至此我們就可以用C("DB_BBS")和C("DB_NEWS")來得到資料庫的配置數組。
配置好了,現在需要執行個體化模型。因為我們這個模型需使用兩個不同的資料庫的串連,項目的設定檔裡預設了個資料庫配置,如果你建立了某個表的模型比如UserModel.class.php,
如果你用D("User");但假如當前預設的資料庫裡沒User個表的話就會報錯。所以我們要建立個空模型。空模型是不會選表的。
有兩種方法建立空模型。$dao=D();和$dao=new Model();都可以。

$dao=D();

執行個體化模型後,我們需要增加資料庫模型;

$dao->addConnect(C("DB_BBS"),1,true);$dao->addConnect(C("DB_NEWS"),2,true);

說一下這個addConnect();這個函數的原型在1.0.3和1.0.4是有區別的。
在1.0.3的原型是:

boolean addConnect (mixed $config, mixed $linkNum, [boolean $eqType = true])

在1.0.4的原型是:

boolean addConnect (mixed $config, mixed $linkNum)

少了第三個參數。
第一個參數是資料庫的配置數組,第二個參數是添加的串連的編號,這個編號在切換資料庫連接的時候需要給出是那個序號的串連。注意內建的資料庫連接序號是0,所以額外的資料庫連接序號應該從1開始.第三個參數是 如果兩個資料庫是否是相同的串連,是就是true;

添加完資料庫連接後,就可以隨時切換資料庫連接了。比如我們這要用DB_NEWS這個資料庫,就這麼寫:

$dao->switchConnect(2);

因為這裡只是建立了資料庫的串連,並沒有選表,所以接下來需要選表。
注意這裡的表名是全名,即表的首碼加表名。因為我們在串連資料庫的配置數組裡沒首碼。我覺得應該可以定義,但我不知道。現在就這樣了。

$dao->table("cdb_members");

之後就可以像普通模型一樣的用這個模型了。
比如我要查詢傳遞過來的ID的使用者的所有資訊 :

$map=array("id"=>$_GET["id"]);$res=$dao->find($map);

可以看看查詢是否成功了。

dump($res);

如果你現在要用DB_BBS的資料庫的表,只需再切換一次串連;

$dao->switchConnect(2);

然後再選表查詢。記住,切換模型後一定要再選一次表,不然會出錯。
之後又可以像普通模型那樣操作了。
下面針對手冊指出裡面存在的幾處問題:

1.執行個體化多資料庫連接的時候建立了個非空的模型。(好像還寫錯了。)這樣可能會出錯。建議建立空模型;
2.addConnect()的參數在不同的版本是不同的,手冊中沒寫出來;
3.建立了空模型後需要選表,這個手冊裡沒有。

針對以上幾點,ThinkPHP使用者可以根據版本的不同酌情進行相應的調整。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.