如何解決ThinkPHP實作多資料庫連線的方法

不言
發布: 2023-04-02 09:52:02
原創
3190 人瀏覽過

這篇文章主要介紹了ThinkPHP實作多資料庫連線的解決方法,需要的朋友可以參考下

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

class MembersModel extends Model{
protected $trueTableName = 'members.members'; //数据库名.表名(包含了前缀)
}
登入後複製

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

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

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

<?php
$config= array(
&#39;DEBUG_MODE&#39;=>true,
&#39;default_module&#39;=>&#39;Index&#39;,
&#39;ROUTER_ON&#39;=>TRUE,
&#39;DATA_RESULT_TYPE&#39;=>1,
&#39;SHOW_RUN_TIME&#39;=>true,   // 运行时间显示
&#39;SHOW_ADV_TIME&#39;=>true,   // 显示详细的运行时间
&#39;SHOW_DB_TIMES&#39;=>true,   // 显示数据库查询和写入次数
&#39;SHOW_CACHE_TIMES&#39;=>true,  // 显示缓存操作次数
&#39;SHOW_USE_MEM&#39;=>true,   // 显示内存开销
&#39;HTML_FILE_SUFFIX&#39;=>&#39;.shtml&#39;,  // 默认静态文件后缀
&#39;HTML_CACHE_ON&#39; =>false,   // 默认关闭静态缓存
&#39;HTML_CACHE_TIME&#39;=>60,   // 静态缓存有效期
&#39;HTML_READ_TYPE&#39;=>1,   // 静态缓存读取方式 0 readfile 1 redirect
&#39;HTML_URL_SUFFIX&#39;=>&#39;.shtml&#39;, // 伪静态后缀设置
//默认数据库链接
&#39;DB_TYPE&#39;=>&#39;mysql&#39;,
&#39;DB_HOST&#39;=>&#39;localhost&#39;,
&#39;DB_NAME&#39;=>&#39;news&#39;,
&#39;DB_USER&#39;=>&#39;root&#39;,
&#39;DB_PWD&#39;=>&#39;123&#39;,
&#39;DB_PORT&#39;=>&#39;3306&#39;,
&#39;DB_PREFIX&#39;=>&#39;news_&#39;,
//我的第一个数据库连接
&#39;DB_BBS&#39;=>array(
&#39;dbms&#39; => &#39;mysql&#39;,
&#39;username&#39; => &#39;discuz&#39;,
&#39;password&#39; => &#39;123&#39;,
&#39;hostname&#39; => &#39;localhost&#39;,
&#39;hostport&#39; => &#39;3306&#39;,
&#39;database&#39; => &#39;discuz&#39;
),
//第二个数据库链接,
&#39;DB_NEWS&#39;=>array(
&#39;dbms&#39;=>&#39;mysql&#39;,
&#39;username&#39;=>&#39;root&#39;,
&#39;password&#39;=>&#39;123&#39;,
&#39;hostname&#39;=>&#39;localhost&#39;,
&#39;hostport&#39;=>&#39;3306&#39;,
&#39;database&#39;=>&#39;news&#39;
)
);
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使用者可以根據版本的不同酌情進行相應的調整。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

ThinkPHP實作ajax仿官網搜尋的功能

php float不四捨五入截取浮點型字符字串的方法

#

以上是如何解決ThinkPHP實作多資料庫連線的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板