ホームページ  >  記事  >  バックエンド開発  >  ThinkPHP での複数データベース接続の問題を解決する方法

ThinkPHP での複数データベース接続の問題を解決する方法

不言
不言オリジナル
2018-07-03 17:27:563142ブラウズ

この記事では、主に複数データベース接続を実現するための ThinkPHP のソリューションを紹介します。必要な友人は参考にしてください。

ThinkPHP が複数データの接続を実現するとき、データベースが同じサーバーにある場合、必要なのはこれだけです モデルを定義します:

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

その後、D("Members"); のようにモデルをインスタンス化し、通常のモデルのように動作させることができます。
しかし、後で彼のデータベースが 2 つの異なるサーバー上にあることが判明したため、上記の方法は機能しません。
現時点では、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") を使用してデータベース構成配列を取得できます。
構成後、モデルをインスタンス化する必要があります。私たちのモデルは 2 つの異なるデータベース接続を使用する必要があるため、プロジェクト構成ファイルはデフォルトでデータベース構成になります。UserModel.class.php などの特定のテーブルのモデルを作成する場合、
If you use D(" User") ; ただし、現在のデフォルト データベースに User テーブルがない場合は、エラーが報告されます。そこで、空のモデルを構築します。空のモデルはテーブルを選択しません。
空のモデルを作成するには 2 つの方法があります。 $dao=D(); と $dao=new Model(); は両方とも OK です。

#

$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)

3 番目のパラメータがありません。

最初のパラメータはデータベースの構成配列、2 番目のパラメータは追加された接続の番号です。この番号は、データベース接続を切り替えるときに接続のシリアル番号として指定する必要があります。注

組み込みのデータベース接続のシリアル番号は 0 であるため、追加のデータベース接続のシリアル番号は 1 から開始する必要があります。3 番目のパラメーターは、2 つのデータベースが同じ接続である場合、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 中国語 Web サイトをご覧ください。

関連する推奨事項:

ThinkPHP は、ajax のような公式 Web サイト検索機能を実装します。


php float は、浮動小数点文字をインターセプトします。丸め文字列メソッド


以上がThinkPHP での複数データベース接続の問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。