多个php 链接数据库,ThinkPHP实现多数据库连接的解决方法
1.ThinkPHP實(shí)現(xiàn)連接多個(gè)數(shù)據(jù)的時(shí)候,如果數(shù)據(jù)庫在同一個(gè)服務(wù)器里的話只需要這樣定義模型:
Model:
namespace Shebao\Model;
use Common\Model\CommonModel;
class CeshiModel extends CommonModel{
protected $trueTableName = 'shebao.sb_person'; //數(shù)據(jù)庫名.表名(包含了前綴)
public function index()
{
}
}
Controller:
public function index(){
$ceshi = D('Shebao/Ceshi');
$data = $ceshi->where(['id'=>'86368'])->find();
dump($data);die;
}
然后就可以像D('Shebao/Ceshi');這樣實(shí)例化模型,像普通模型那樣操作了。
2.數(shù)據(jù)庫在兩個(gè)不同的服務(wù)器,這樣上面的方法就不行了:
這時(shí)候就需要使用TP的多數(shù)據(jù)連接特性了。
對(duì)此,查閱官方文檔進(jìn)行測(cè)試并修正之后得出了如下的解決方法:
要建立多數(shù)據(jù)連接,
首先要構(gòu)造數(shù)據(jù)庫配置參數(shù)。
但是如果每次都在建立多數(shù)據(jù)庫連接的時(shí)候都建立數(shù)據(jù)庫配置數(shù)組,這樣就會(huì)很麻煩,還不如寫在配置文件里。
這里怎么寫還是需要有點(diǎn)技巧的。
$config= array(
'DEBUG_MODE'=>true,
'default_module'=>'Index',
'ROUTER_ON'=>TRUE,
'DATA_RESULT_TYPE'=>1,
'SHOW_RUN_TIME'=>true, // 運(yùn)行時(shí)間顯示
'SHOW_ADV_TIME'=>true, // 顯示詳細(xì)的運(yùn)行時(shí)間
'SHOW_DB_TIMES'=>true, // 顯示數(shù)據(jù)庫查詢和寫入次數(shù)
'SHOW_CACHE_TIMES'=>true, // 顯示緩存操作次數(shù)
'SHOW_USE_MEM'=>true, // 顯示內(nèi)存開銷
'HTML_FILE_SUFFIX'=>'.shtml', // 默認(rèn)靜態(tài)文件后綴
'HTML_CACHE_ON' =>false, // 默認(rèn)關(guān)閉靜態(tài)緩存
'HTML_CACHE_TIME'=>60, // 靜態(tài)緩存有效期
'HTML_READ_TYPE'=>1, // 靜態(tài)緩存讀取方式 0 readfile 1 redirect
'HTML_URL_SUFFIX'=>'.shtml', // 偽靜態(tài)后綴設(shè)置
//主要看這里就可以了:
//默認(rèn)數(shù)據(jù)庫鏈接
'DB_TYPE'=>'mysql',
'DB_HOST'=>'localhost',
'DB_NAME'=>'news',
'DB_USER'=>'root',
'DB_PWD'=>'123',
'DB_PORT'=>'3306',
'DB_PREFIX'=>'news_',
//我的第一個(gè)數(shù)據(jù)庫連接
'DB_BBS'=>array(
'dbms' => 'mysql',
'username' => 'discuz',
'password' => '123',
'hostname' => 'localhost',
'hostport' => '3306',
'database' => 'discuz'
),
//第二個(gè)數(shù)據(jù)庫鏈接,
'DB_NEWS'=>array(
'dbms'=>'mysql',
'username'=>'root',
'password'=>'123',
'hostname'=>'localhost',
'hostport'=>'3306',
'database'=>'news'
)
);
return $config;
?>
至此我們就可以用C("DB_BBS")和C("DB_NEWS")來得到數(shù)據(jù)庫的配置數(shù)組。
配置好了,現(xiàn)在需要實(shí)例化模型。
因?yàn)槲覀冞@個(gè)模型需使用兩個(gè)不同的數(shù)據(jù)庫的連接,項(xiàng)目的配置文件里默認(rèn)了個(gè)數(shù)據(jù)庫配置,如果你建立了某個(gè)表的模型比如UserModel.class.php,
如果你用D("User");但假如當(dāng)前默認(rèn)的數(shù)據(jù)庫里沒User個(gè)表的話就會(huì)報(bào)錯(cuò)。
所以我們要建立個(gè)空模型。空模型是不會(huì)選表的。
有兩種方法建立空模型。 $dao=D();和$dao=new Model(); 都可以。
實(shí)例化模型后,我們需要增加數(shù)據(jù)庫模型:
$dao->addConnect(C("DB_BBS"),1,true);
$dao->addConnect(C("DB_NEWS"),2,true);
說一下這個(gè)addConnect();這個(gè)函數(shù)的原型在1.0.3和1.0.4是有區(qū)別的。
在1.0.3的原型是:
boolean addConnect (mixed $config``, mixed $linkNum``, [boolean $eqType = true])
在1.0.4的原型是:
boolean addConnect (mixed $config``, mixed $linkNum``)
少了第三個(gè)參數(shù)。
第一個(gè)參數(shù)是數(shù)據(jù)庫的配置數(shù)組,第二個(gè)參數(shù)是添加的連接的編號(hào),這個(gè)編號(hào)在切換數(shù)據(jù)庫連接的時(shí)候需要給出是那個(gè)序號(hào)的連接。
注意 :
內(nèi)置的數(shù)據(jù)庫連接序號(hào)是0,所以額外的數(shù)據(jù)庫連接序號(hào)應(yīng)該從1開始.第三個(gè)參數(shù)是 如果兩個(gè)數(shù)據(jù)庫是否是相同的連接,是就是true;
添加完數(shù)據(jù)庫連接后,就可以隨時(shí)切換數(shù)據(jù)庫連接了。比如我們這要用DB_NEWS這個(gè)數(shù)據(jù)庫,就這么寫:
$dao->switchConnect(2);
因?yàn)檫@里只是建立了數(shù)據(jù)庫的連接,并沒有選表,所以接下來需要選表。
注意這里的表名是全名,即表的前綴加表名。因?yàn)槲覀冊(cè)谶B接數(shù)據(jù)庫的配置數(shù)組里沒前綴。我覺得應(yīng)該可以定義,但我不知道。現(xiàn)在就這樣了。
$dao->table("cdb_members");
之后就可以像普通模型一樣的用這個(gè)模型了。
比如我要查詢傳遞過來的ID的用戶的所有信息 :
$map=array("id"=>$_GET["id"]);
$res=$dao->find($map);
可以看看查詢是否成功了。
dump($res);
如果你現(xiàn)在要用DB_BBS的數(shù)據(jù)庫的表,只需再切換一次連接;
$dao->switchConnect(1);
然后再選表查詢。記住,切換模型后一定要再選一次表,不然會(huì)出錯(cuò)。
之后又可以像普通模型那樣操作了。
下面針對(duì)手冊(cè)指出里面存在的幾處問題:
1.實(shí)例化多數(shù)據(jù)庫連接的時(shí)候建立了個(gè)非空的模型。(好像還寫錯(cuò)了。)這樣可能會(huì)出錯(cuò)。建議建立空模型;
2.addConnect()的參數(shù)在不同的版本是不同的,手冊(cè)中沒寫出來;
3.建立了空模型后需要選表,這個(gè)手冊(cè)里沒有。
針對(duì)以上幾點(diǎn),ThinkPHP使用者可以根據(jù)版本的不同酌情進(jìn)行相應(yīng)的調(diào)整。
總結(jié)
以上是生活随笔為你收集整理的多个php 链接数据库,ThinkPHP实现多数据库连接的解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USTC 2011 homework l
- 下一篇: 敏捷软件开发宣言ndash;Manife