Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie das Problem der Multi-Datenbank-Verbindung in ThinkPHP

So lösen Sie das Problem der Multi-Datenbank-Verbindung in ThinkPHP

不言
不言Original
2018-07-03 17:27:563142Durchsuche

In diesem Artikel wird hauptsächlich die Lösung von ThinkPHP zur Realisierung einer Verbindung mit mehreren Datenbanken vorgestellt. Freunde, die sie benötigen, können darauf verweisen.

Wenn ThinkPHP die Verbindung mehrerer Daten realisiert und sich die Datenbank auf demselben Server befindet, Das ist alles, was Sie brauchen. Definieren Sie das Modell:

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

Dann können Sie das Modell wie D("Mitglieder"); instanziieren und wie ein normales Modell betreiben.
Aber später stellte sich heraus, dass sich seine Datenbanken auf zwei verschiedenen Servern befanden, sodass die oben beschriebene Methode nicht funktionierte.
Zu diesem Zeitpunkt müssen Sie die Multi-Datenverbindungsfunktion von TP verwenden.

In diesem Zusammenhang haben wir nach Konsultation der offiziellen Dokumentation zum Testen und Korrigieren die folgende Lösung gefunden:

Um eine Multidatenverbindung herzustellen, müssen Sie zunächst die Datenbankkonfigurationsparameter erstellen . Wenn Sie jedoch jedes Mal, wenn Sie eine Verbindung mit mehreren Datenbanken herstellen, ein Datenbankkonfigurationsarray erstellen, ist es sehr mühsam, es in die Konfigurationsdatei zu schreiben. Wie man hier schreibt, erfordert noch einige Fähigkeiten.

<?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;
?>

An dieser Stelle können wir C („DB_BBS“) und C („DB_NEWS“) verwenden, um das Konfigurationsarray der Datenbank abzurufen.
Nach der Konfiguration müssen Sie nun das Modell instanziieren. Da unser Modell zwei verschiedene Datenbankverbindungen verwenden muss, verwendet die Projektkonfigurationsdatei standardmäßig eine Datenbankkonfiguration. Wenn Sie ein Modell einer bestimmten Tabelle wie UserModel.class.php erstellen,
Wenn Sie D("Benutzer") verwenden. ; aber wenn in der aktuellen Standarddatenbank keine Benutzertabelle vorhanden ist, wird ein Fehler gemeldet. Wir werden also ein leeres Modell erstellen. Leere Modelle wählen keine Tabellen aus.
Es gibt zwei Möglichkeiten, ein leeres Modell zu erstellen. Sowohl $dao=D(); als auch $dao=new Model(); sind in Ordnung.

$dao=D();

Nach der Instanziierung des Modells müssen wir ein Datenbankmodell hinzufügen;

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

sagte: Schauen Sie sich addConnect() an. Der Prototyp dieser Funktion unterscheidet sich zwischen 1.0.3 und 1.0.4.
Der Prototyp in 1.0.3 ist:

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

Der Prototyp in 1.0.4 ist:

boolean addConnect (mixed $config, mixed $linkNum)

Der dritte Parameter fehlt.
Der erste Parameter ist das Konfigurationsarray der Datenbank und der zweite Parameter ist die Nummer der hinzugefügten Verbindung. Diese Nummer muss beim Umschalten der Datenbankverbindung als Seriennummer der Verbindung angegeben werden. Beachten Sie, dass die integrierte Datenbankverbindungssequenznummer 0 ist, daher sollte die zusätzliche Datenbankverbindungssequenznummer bei 1 beginnen. Der dritte Parameter lautet: Wenn die beiden Datenbanken dieselbe Verbindung haben, ist dies wahr ; >

Nachdem Sie die Datenbankverbindung hinzugefügt haben, können Sie die Datenbankverbindung jederzeit wechseln. Wenn wir zum Beispiel die Datenbank DB_NEWS nutzen wollen, können wir das so schreiben:

$dao->switchConnect(2);

Da die Verbindung zur Datenbank erst hier hergestellt wird und nein Die Tabelle ist ausgewählt, daher besteht der nächste Schritt darin, die Tabelle auszuwählen.

Beachten Sie, dass der Tabellenname hier der vollständige Name ist, der aus dem Tabellenpräfix und dem Tabellennamen besteht. Weil wir im Konfigurationsarray kein Präfix für die Verbindung zur Datenbank haben. Ich denke, es sollte definierbar sein, aber ich weiß es nicht. Das ist es für den Moment.

$dao->table("cdb_members");

Danach können Sie dieses Modell wie ein normales Modell verwenden.

Wenn ich beispielsweise alle Informationen des Benutzers mit der übergebenen ID abfragen möchte:

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

Sie können sehen, ob die Abfrage erfolgreich ist.

dump($res);

Wenn Sie jetzt die Datenbanktabelle von DB_BBS verwenden möchten, müssen Sie nur die Verbindung erneut wechseln

$dao->switchConnect(2);

Wählen Sie dann die Tabelle aus, die abgefragt werden soll. Denken Sie daran, dass Sie die Tabelle nach dem Modellwechsel erneut auswählen müssen, da sonst ein Fehler auftritt.

Danach können Sie es wie ein normales Modell bedienen.
Im Folgenden wird auf mehrere Probleme im Handbuch hingewiesen:

1. Beim Instanziieren einer Verbindung mit mehreren Datenbanken wird ein nicht leeres Modell erstellt. (Es scheint, dass ich es falsch geschrieben habe.) Dies kann zu Fehlern führen. Es wird empfohlen, ein leeres Modell zu erstellen.

2. Die Parameter von addConnect() sind in den verschiedenen Versionen unterschiedlich und werden nicht im Handbuch beschrieben.
3 , was nicht in diesem Handbuch enthalten ist.

Angesichts der oben genannten Punkte können ThinkPHP-Benutzer je nach Version entsprechende Anpassungen vornehmen.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

ThinkPHP implementiert eine Ajax-ähnliche offizielle Website-Suchfunktion

php float fängt Gleitkommazeichen ohne Rundung ab String-Methode

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der Multi-Datenbank-Verbindung in ThinkPHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn