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

不言
Freigeben: 2023-04-02 09:52:02
Original
3152 Leute haben es durchsucht

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'; //数据库名.表名(包含了前缀)
}
Nach dem Login kopieren

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;
?>
Nach dem Login kopieren

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 dem Login kopieren

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);
Nach dem Login kopieren

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])
Nach dem Login kopieren

Der Prototyp in 1.0.4 ist:

boolean addConnect (mixed $config, mixed $linkNum)
Nach dem Login kopieren

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);
Nach dem Login kopieren
Nach dem Login kopieren

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");
Nach dem Login kopieren

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);
Nach dem Login kopieren

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

dump($res);
Nach dem Login kopieren

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

$dao->switchConnect(2);
Nach dem Login kopieren
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!