>  기사  >  백엔드 개발  >  ThinkPHP에서 다중 데이터베이스 연결 문제를 해결하는 방법

ThinkPHP에서 다중 데이터베이스 연결 문제를 해결하는 방법

不言
不言원래의
2018-07-03 17:27:563142검색

이 글에서는 다중 데이터베이스 연결을 구현하는 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" ); 현재 기본 데이터베이스에 사용자 테이블이 없으면 오류가 보고됩니다. 그래서 우리는 빈 모델을 만들 것입니다. 빈 모델은 테이블을 선택하지 않습니다.
빈 모델을 만드는 방법에는 두 가지가 있습니다. $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 부동 소수점 문자열을 반올림하지 않고 가로채는 부동 방법

위 내용은 ThinkPHP에서 다중 데이터베이스 연결 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.