ThinkPHP實(shí)現(xiàn)多數(shù)據(jù)庫(kù)連接的解決方法
ThinkPHP實(shí)現(xiàn)連接多個(gè)數(shù)據(jù)的時(shí)候,如果數(shù)據(jù)庫(kù)在同一個(gè)服務(wù)器里的話只需要這樣定義模型:
class MembersModel extends Model{ protected $trueTableName = 'members.members'; //數(shù)據(jù)庫(kù)名.表名(包含了前綴) }
然后就可以像D("Members");這樣實(shí)例化模型,像普通模型那樣操作了。
但后來(lái)發(fā)現(xiàn)他的數(shù)據(jù)庫(kù)在兩個(gè)不同的服務(wù)器,這樣上面的方法就不行了。
這時(shí)候就需要使用TP的多數(shù)據(jù)連接特性了。
對(duì)此,查閱官方文檔進(jìn)行測(cè)試并修正之后得出了如下的解決方法:
要建立多數(shù)據(jù)連接,首先要構(gòu)造數(shù)據(jù)庫(kù)配置參數(shù)。但是如果每次都在建立多數(shù)據(jù)庫(kù)連接的時(shí)候都建立數(shù)據(jù)庫(kù)配置數(shù)組,這樣就會(huì)很麻煩,還不如寫在配置文件里。這里怎么寫還是需要有點(diǎn)技巧的。
<?php $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ù)庫(kù)查詢和寫入次數(shù) 'SHOW_CACHE_TIMES'=>true, // 顯示緩存操作次數(shù) 'SHOW_USE_MEM'=>true, // 顯示內(nèi)存開(kā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ù)庫(kù)鏈接 'DB_TYPE'=>'mysql', 'DB_HOST'=>'localhost', 'DB_NAME'=>'news', 'DB_USER'=>'root', 'DB_PWD'=>'123', 'DB_PORT'=>'3306', 'DB_PREFIX'=>'news_', //我的第一個(gè)數(shù)據(jù)庫(kù)連接 'DB_BBS'=>array( 'dbms' => 'mysql', 'username' => 'discuz', 'password' => '123', 'hostname' => 'localhost', 'hostport' => '3306', 'database' => 'discuz' ), //第二個(gè)數(shù)據(jù)庫(kù)鏈接, 'DB_NEWS'=>array( 'dbms'=>'mysql', 'username'=>'root', 'password'=>'123', 'hostname'=>'localhost', 'hostport'=>'3306', 'database'=>'news' ) ); return $config; ?>
至此我們就可以用C("DB_BBS")和C("DB_NEWS")來(lái)得到數(shù)據(jù)庫(kù)的配置數(shù)組。
配置好了,現(xiàn)在需要實(shí)例化模型。因?yàn)槲覀冞@個(gè)模型需使用兩個(gè)不同的數(shù)據(jù)庫(kù)的連接,項(xiàng)目的配置文件里默認(rèn)了個(gè)數(shù)據(jù)庫(kù)配置,如果你建立了某個(gè)表的模型比如UserModel.class.php,
如果你用D("User");但假如當(dāng)前默認(rèn)的數(shù)據(jù)庫(kù)里沒(méi)User個(gè)表的話就會(huì)報(bào)錯(cuò)。所以我們要建立個(gè)空模型??漳P褪遣粫?huì)選表的。
有兩種方法建立空模型。$dao=D();和$dao=new Model();都可以。
$dao=D();
實(shí)例化模型后,我們需要增加數(shù)據(jù)庫(kù)模型;
$dao->addConnect(C("DB_BBS"),1,true); $dao->addConnect(C("DB_NEWS"),2,true);
說(shuō)一下這個(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ù)庫(kù)的配置數(shù)組,第二個(gè)參數(shù)是添加的連接的編號(hào),這個(gè)編號(hào)在切換數(shù)據(jù)庫(kù)連接的時(shí)候需要給出是那個(gè)序號(hào)的連接。注意內(nèi)置的數(shù)據(jù)庫(kù)連接序號(hào)是0,所以額外的數(shù)據(jù)庫(kù)連接序號(hào)應(yīng)該從1開(kāi)始.第三個(gè)參數(shù)是 如果兩個(gè)數(shù)據(jù)庫(kù)是否是相同的連接,是就是true;
添加完數(shù)據(jù)庫(kù)連接后,就可以隨時(shí)切換數(shù)據(jù)庫(kù)連接了。比如我們這要用DB_NEWS這個(gè)數(shù)據(jù)庫(kù),就這么寫:
$dao->switchConnect(2);
因?yàn)檫@里只是建立了數(shù)據(jù)庫(kù)的連接,并沒(méi)有選表,所以接下來(lái)需要選表。
注意這里的表名是全名,即表的前綴加表名。因?yàn)槲覀冊(cè)谶B接數(shù)據(jù)庫(kù)的配置數(shù)組里沒(méi)前綴。我覺(jué)得應(yīng)該可以定義,但我不知道?,F(xiàn)在就這樣了。
$dao->table("cdb_members");
之后就可以像普通模型一樣的用這個(gè)模型了。
比如我要查詢傳遞過(guò)來(lái)的ID的用戶的所有信息 :
$map=array("id"=>$_GET["id"]); $res=$dao->find($map);
可以看看查詢是否成功了。
dump($res);
如果你現(xiàn)在要用DB_BBS的數(shù)據(jù)庫(kù)的表,只需再切換一次連接;
$dao->switchConnect(2);
然后再選表查詢。記住,切換模型后一定要再選一次表,不然會(huì)出錯(cuò)。
之后又可以像普通模型那樣操作了。
下面針對(duì)手冊(cè)指出里面存在的幾處問(wèn)題:
1.實(shí)例化多數(shù)據(jù)庫(kù)連接的時(shí)候建立了個(gè)非空的模型。(好像還寫錯(cuò)了。)這樣可能會(huì)出錯(cuò)。建議建立空模型;
2.addConnect()的參數(shù)在不同的版本是不同的,手冊(cè)中沒(méi)寫出來(lái);
3.建立了空模型后需要選表,這個(gè)手冊(cè)里沒(méi)有。
針對(duì)以上幾點(diǎn),ThinkPHP使用者可以根據(jù)版本的不同酌情進(jìn)行相應(yīng)的調(diào)整。
更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《smarty模板入門基礎(chǔ)教程》及《PHP模板技術(shù)總結(jié)》。
希望本文所述對(duì)大家基于ThinkPHP框架的PHP程序設(shè)計(jì)有所幫助。
- tp5.1框架數(shù)據(jù)庫(kù)子查詢操作實(shí)例分析
- tp5.1 框架數(shù)據(jù)庫(kù)常見(jiàn)操作詳解【添加、刪除、更新、查詢】
- tp5.1 框架數(shù)據(jù)庫(kù)高級(jí)查詢技巧實(shí)例總結(jié)
- ThinkPHP5.1框架數(shù)據(jù)庫(kù)鏈接和增刪改查操作示例
- PHP利用pdo_odbc實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)示例【基于ThinkPHP5.1搭建的項(xiàng)目】
- PHP7使用ODBC連接SQL Server2008 R2數(shù)據(jù)庫(kù)示例【基于thinkPHP5.1框架】
- thinkPHP5實(shí)現(xiàn)的查詢數(shù)據(jù)庫(kù)并返回json數(shù)據(jù)實(shí)例
- tp5(thinkPHP5)框架數(shù)據(jù)庫(kù)Db增刪改查常見(jiàn)操作總結(jié)
- tp5(thinkPHP5)框架實(shí)現(xiàn)多數(shù)據(jù)庫(kù)查詢的方法
- tp5(thinkPHP5)操作mongoDB數(shù)據(jù)庫(kù)的方法
- thinkPHP5實(shí)現(xiàn)數(shù)據(jù)庫(kù)添加內(nèi)容的方法
- tp5.1 框架數(shù)據(jù)庫(kù)-數(shù)據(jù)集操作實(shí)例分析
相關(guān)文章
php微信公眾平臺(tái)開(kāi)發(fā)(四)回復(fù)功能開(kāi)發(fā)
這篇文章主要介紹了php微信公眾平臺(tái)開(kāi)發(fā)的第四篇,微信回復(fù)功能開(kāi)發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12PHP中數(shù)據(jù)庫(kù)單例模式的實(shí)現(xiàn)代碼分享
這篇文章主要介紹了PHP中數(shù)據(jù)庫(kù)單例模式的實(shí)現(xiàn)代碼分享,本文先是講解了單例模式的一些知識(shí),然后給出了數(shù)據(jù)庫(kù)單例模式實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-08-08thinkPHP框架中執(zhí)行原生SQL語(yǔ)句的方法
這篇文章主要介紹了thinkPHP框架中執(zhí)行原生SQL語(yǔ)句的方法,結(jié)合實(shí)例形式分析了thinkPHP中執(zhí)行原生SQL語(yǔ)句的相關(guān)操作技巧,并簡(jiǎn)單分析了query與execute方法的使用區(qū)別,需要的朋友可以參考下2017-10-10使用php批量刪除數(shù)據(jù)庫(kù)下所有前綴為prefix_的表
這篇文章主要介紹了php如何批量刪除數(shù)據(jù)庫(kù)下所有前綴為prefix_的表,需要的朋友可以參考下2014-06-06TP5(thinkPHP5框架)基于bootstrap實(shí)現(xiàn)的單圖上傳插件用法示例
這篇文章主要介紹了TP5(thinkPHP5框架)基于bootstrap實(shí)現(xiàn)的單圖上傳插件用法,結(jié)合實(shí)例形式分析了thinkPHP5框架結(jié)合bootstrap實(shí)現(xiàn)圖片上傳相關(guān)布局與控制器操作技巧,需要的朋友可以參考下2019-05-05ThinkPHP框架實(shí)現(xiàn)導(dǎo)出excel數(shù)據(jù)的方法示例【基于PHPExcel】
這篇文章主要介紹了ThinkPHP框架實(shí)現(xiàn)導(dǎo)出excel數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了thinkPHP添加org擴(kuò)展基于PHPExcel進(jìn)行Excel數(shù)據(jù)的導(dǎo)出操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-05-05php網(wǎng)上商城購(gòu)物車設(shè)計(jì)代碼分享
我們要做的是一個(gè)可以包含促銷活動(dòng)的購(gòu)物車,所以比較其他簡(jiǎn)單的購(gòu)物車,會(huì)稍微復(fù)雜一點(diǎn)。(用的是PHP的zend framework框架)2012-02-02