cari
Rumahpembangunan bahagian belakangtutorial php如何解决ThinkPHP实现多数据库连接的方法

如何解决ThinkPHP实现多数据库连接的方法

Jul 03, 2018 pm 05:27 PM
thinkphpSambungan pangkalan data berbilangPenyelesaian

这篇文章主要介绍了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不四舍五入截取浮点型字符串的方法

Atas ialah kandungan terperinci 如何解决ThinkPHP实现多数据库连接的方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Bagaimanakah PHP mengenal pasti sesi pengguna?Bagaimanakah PHP mengenal pasti sesi pengguna?May 01, 2025 am 12:23 AM

Phpidentifierauser'sSessionusingSessionCookiesandSessionIds.1) whensession_start () ISCALLED, phpGeneratesAuniquesessionIdstoredinacookienamedPhpsessidontheUserer'sBrowser.2) ThisIdallowsPhptoretRievesSessionDataFromtheserver.

Apakah beberapa amalan terbaik untuk mendapatkan sesi PHP?Apakah beberapa amalan terbaik untuk mendapatkan sesi PHP?May 01, 2025 am 12:22 AM

Keselamatan sesi PHP boleh dicapai melalui langkah -langkah berikut: 1. Gunakan session_regenerate_id () untuk menjana semula ID sesi apabila pengguna log masuk atau merupakan operasi penting. 2. Sulitkan ID sesi penghantaran melalui protokol HTTPS. 3. Gunakan session_save_path () untuk menentukan direktori selamat untuk menyimpan data sesi dan menetapkan kebenaran dengan betul.

Di manakah fail sesi php disimpan secara lalai?Di manakah fail sesi php disimpan secara lalai?May 01, 2025 am 12:15 AM

PhpsessionFileSarestoredIntHedirectorySpecifiedBySession.save_path, biasanya/tmponunix-likesystemsorc: \ windows \ temponwindows.tocustomethis: 1) usession_save_path ()

Bagaimana anda mengambil data dari sesi PHP?Bagaimana anda mengambil data dari sesi PHP?May 01, 2025 am 12:11 AM

ToretrievedataFromaphpsession, startTheSessionWithSsion_start () andaccessVariablesInthe $ _SessionArray.Forexample: 1) startTheSession: session_start ()

Bagaimana anda boleh menggunakan sesi untuk melaksanakan keranjang belanja?Bagaimana anda boleh menggunakan sesi untuk melaksanakan keranjang belanja?May 01, 2025 am 12:10 AM

Langkah -langkah untuk membina sistem keranjang belanja yang cekap menggunakan sesi termasuk: 1) Memahami definisi dan fungsi sesi. Sesi ini adalah mekanisme penyimpanan sisi pelayan yang digunakan untuk mengekalkan status pengguna merentasi permintaan; 2) melaksanakan pengurusan sesi asas, seperti menambah produk ke keranjang belanja; 3) memperluas penggunaan lanjutan, menyokong pengurusan kuantiti produk dan penghapusan; 4) Mengoptimumkan prestasi dan keselamatan, dengan berterusan data sesi dan menggunakan pengecam sesi yang selamat.

Bagaimana anda membuat dan menggunakan antara muka dalam PHP?Bagaimana anda membuat dan menggunakan antara muka dalam PHP?Apr 30, 2025 pm 03:40 PM

Artikel ini menerangkan cara membuat, melaksanakan, dan menggunakan antara muka dalam PHP, memberi tumpuan kepada manfaat mereka untuk organisasi kod dan penyelenggaraan.

Apakah perbezaan antara crypt () dan password_hash ()?Apakah perbezaan antara crypt () dan password_hash ()?Apr 30, 2025 pm 03:39 PM

Artikel ini membincangkan perbezaan antara crypt () dan password_hash () dalam php untuk hashing kata laluan, memberi tumpuan kepada pelaksanaan, keselamatan, dan kesesuaian untuk aplikasi web moden.

Bagaimanakah anda dapat mencegah skrip lintas tapak (XSS) dalam PHP?Bagaimanakah anda dapat mencegah skrip lintas tapak (XSS) dalam PHP?Apr 30, 2025 pm 03:38 PM

Artikel membincangkan mencegah skrip lintas tapak (XSS) dalam PHP melalui pengesahan input, pengekodan output, dan menggunakan alat seperti OWASP ESAPI dan pembersih HTML.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa