PHPLIB는 PHP의 일부 확장 라이브러리입니다. 이를 사용하여 데이터베이스에서 다양한 작업을 쉽게 수행할 수 있습니다. 그러나 여러 데이터베이스를 사용하려는 경우 이 기사에서는 PHPLIB를 확장하여 사용할 수 있는 방법을 소개합니다. PHPLIB를 사용하는 동안 여러 데이터베이스를 사용할 수 있으며, 객체 지향 프로그래밍과 라이브러리 확장 방법도 배울 수 있습니다.
데이터베이스 관리
대규모 데이터베이스에 어떤 테이블이라도 넣을 수 있습니다. 그러나 시간이 지남에 따라 데이터베이스는 점점 더 커질 것입니다. 서버가 IO 작업을 따라잡지 못하거나 모든 액세스를 처리할 메모리가 부족할 수 있습니다. 기존 데이터를 분리하는 것은 매우 어렵습니다. 별도의 데이터베이스로 시작하여 효율적인 데이터베이스 관리를 구현하는 것이 현명합니다. 책을 판매하는 웹사이트가 있다면 아마도 저자 목록, 책 가격 목록, 현재 재고 및 주문 목록이 있을 것입니다. 비즈니스가 성장함에 따라 주문도 계속 증가할 것이며 각 주문을 처리하려면 많은 디스크 액세스가 필요합니다. 어느 시점에서는 모든 주문을 회계 시스템에 입력하게 될 가능성이 높습니다.
이제 주문을 별도의 데이터베이스에 넣으십시오. 재고는 주문을 통해서도 업데이트되므로 재고 수량도 동일한 데이터베이스에 저장됩니다.
저자 목록과 도서 목록은 자주 읽어야 하지만 거의 업데이트되지 않는 정적인 정보입니다. 실제로 저자 기록 업데이트는 저자가 새 책을 쓸 때(또는 사망할 때)에 한해 5년에 한 번만 수행하면 됩니다. 이 데이터를 호스팅하는 서버는 주문 데이터베이스를 호스팅하는 서버와 완전히 다르게 구성될 수 있습니다.
PHPLIB 포함
PHPLIB는 DB_Sql이라는 클래스를 통해 SQL 데이터베이스에 액세스합니다. 사용해야 하는 데이터베이스 유형에 따라 코드에 다른 inc 파일을 포함하십시오. 이 예에서는 MySQL 버전을 사용하고 있습니다.
코드에서 DB_Sql을 사용하려면 PHPLIB 파일을 해당 디렉터리에 설치하세요. 그런 다음 cgi-bin 디렉터리를 찾아 cgi-bin 디렉터리 옆에 phplib 디렉터리를 만듭니다. 다음으로 모든 PHPLIB .inc 파일을 phplib 디렉토리에 복사합니다. 마지막으로 php.inc 파일을 수정하고 "include_path=" 줄을 phplib 디렉토리로 변경하세요.
include_path는 include() 또는 require()를 사용할 때 PHP가 검색하는 디렉토리입니다. 내 NT 워크스테이션에서 포함 경로는
Linux에서
include_path = ".;i:/project52/includes;i:/project52/phplib"입니다.
시스템에서
각 PHP 페이지 상단에
include_path = ".;/home/httpd/includes;/home/httpd/phplib";
를 추가하세요.
<? PHP
요구(common.php);
? >
common.php3은 include 디렉토리에 위치하며 각 페이지에서 사용되는 모든 데이터와 기능을 포함합니다. 이 예에서 common.php는 다음과 같습니다.
<? PHP
요구(db_mysql.inc);
require(ct_sql.inc);
require(session.inc);
요구(auth.inc);
요구(perm.inc);
요구(user.inc);
요구(page.inc);
? >
각 inc 파일의 목적을 알고 싶다면 http://phplib.netuse.de 에서 PHPLIB 문서를 읽어보세요. Db_mysql.inc에는 모든 DB_SQL 클래스의 정의가 포함되어 있습니다. MySQL 대신 PostGreSQL을 사용하려면 db_mysql.inc 대신 db_pgsql.inc를 사용하면 됩니다. MS SQL, Oracle, Sybase 또는 기타 데이터베이스와 함께 사용할 수 있는 10개의 다른 .inc 파일이 있습니다.
이 예에서 require()와 include()는 정확히 동일합니다. 그러나 코드에 배치하거나 if 문에서 사용하는 경우 Require() 및 포함 사용은 완전히 다르며 실행 결과도 다릅니다.
PHPLIB 확장
PHPLIB는 DB_Sql 클래스에서 생성된 개체를 통해 데이터베이스에 액세스합니다. Db_mysql.inc에는 MySQL용으로 수정된 DB_Sql 클래스가 포함되어 있습니다. db_mysql.inc가 포함된 줄 뒤의 common.php에 코드를 추가하여 DB_sql을 확장하겠습니다.
DB_Sql에는 쿼리를 위한 많은 함수가 포함되어 있습니다. 우리가 수정해야 할 것은
<? PHP
/* 공개: 연결 관리*/
함수 연결($Database = "", $Host = "", $User = "", $Password = "") {
/* 기본 연결 처리 */
if ("" == $Database)
$Database = $this->데이터베이스;
if ("" == $Host)
$Host = $this->호스트;
if ("" == $사용자)
$User = $this->사용자;
if ("" == $Password)
$Password = $this->Password;
/* 연결 설정 및 데이터베이스 선택*/
if ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password)가 실패했습니다.");
0을 반환합니다.
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("데이터베이스를 사용할 수 없습니다. ".$this->Database);
0을 반환합니다.
}
}
$this->Link_ID를 반환합니다.
}
? >
db_mysql.inc(또는 기타 데이터베이스 관련 .inc 파일)에서 connect() 함수를 찾은 다음 이를 common.php에 복사하고 마지막에 db_mysql.inc가 포함된 코드 뒤에 추가해야 합니다. 클래스 정의로 캡슐화됩니다.
코드가 약간 읽기 어렵다는 것을 알았기 때문에 먼저 복사한 코드를 더 읽기 쉽게 만들었습니다.
<? PHP
/* 공개: 연결 관리*/
함수 연결($Database = "", $Host = "", $User = "", $Password = "") {
/* 기본 연결 처리 */
if ("" == $Database) {
$Database = $this->데이터베이스;
}
if ("" == $Host) {
$Host = $this->호스트;
}
if ("" == $User) {
$User = $this->사용자;
}
if ("" == $Password) {
$Password = $this->비밀번호;
}
/* 연결 설정 및 데이터베이스 선택 */
if ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password)가 실패했습니다.");
0을 반환합니다.
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("데이터베이스를 사용할 수 없습니다. ".$this->Database);
0을 반환합니다.
}
}
$this->Link_ID를 반환합니다.
}
? >
괄호 위치를 조정하고 한 줄 앞뒤에 괄호를 추가했습니다. PHP의 if 문에서 코드가 한줄이면 괄호가 필요없지만 한줄만 더 추가하면 바로 에러가 발생합니다. 따라서 나중에 코드를 추가할 때 오류가 발생하지 않도록 괄호를 추가하는 것이 좋습니다.
연결 코드를 변경하기 전에 먼저 connect()가 어떻게 작동하는지 이해해야 합니다. 현재 연결이 존재하는지 확인합니다. 연결이 없으면 연결을 만듭니다. 각 데이터베이스 쿼리를 수행하기 전에 먼저 이 connect() 함수를 실행하십시오. 안타깝게도 처음 연결할 때만 데이터베이스를 선택합니다. PHP 페이지가 둘 이상의 데이터베이스를 사용하는 경우 connect()는 다른 데이터베이스를 선택하지 않습니다.
코드를 변경하는 방법에는 몇 가지가 있습니다. PHPLIB에 최소한의 영향을 미치고 문제를 분석해야 할 때 데이터베이스 연결 상태를 표시할 수 있는 방법을 선택해야 합니다. PHPLIB 외부에 연결 ID와 데이터베이스 이름을 저장해야 합니다. 그냥 common.php에 추가하세요:
<? PHP
$db_connection = 0; // 데이터베이스 연결 ID
$db_database = ""; // 현재 데이터베이스 상태? >
다음으로, 연결 ID와 데이터베이스 이름을 이러한 변수에 저장하도록 PHPLIB를 수정하겠습니다. 다른 코드에서도 동일한 변수명을 설정하여 사용할 수 있습니다. 문제를 분석할 때 어떤 데이터베이스가 사용되고 있는지 알아야 하는 경우 페이지에 다음 코드를 삽입하기만 하면 됩니다.
<? PHP
Print(" db_database: " . $db_database . "");
? >
connect()가 이러한 새로운 변수를 사용하도록 하려면 어떻게 해야 합니까? 상단에 다음 줄을 추가할 수 있습니다:
<? PHP
{
전역 $db_connect, $db_database;
/* 기본값 처리 */
? >
이 코드를 통해 connect()를 통해 새 변수에 액세스할 수 있습니다.
$db_database를 정의한 후 다음을 추가합니다.
<? PHP
함수 db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {
전역 $db_connect;
if(!empty($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user, $db_connect_pass);
}
return($db_connect);
}
함수 db_database($db_database_new="") {
전역 $db_database;
if(!empty($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
}
return($db_database);
}
? >
이러한 공용 함수를 한 번 정의하면 전역 선언을 추가하지 않고도 이러한 공용 변수를 다른 위치에서 사용할 수 있습니다. 위의 db 함수를 사용한 공용 함수는 다음과 같습니다.
<? PHP
함수 연결($Database = "", $Host = "", $User = "", $Password = "") {
/* 기본 연결 처리 */
if ("" == $Database) {
$Database = $this->데이터베이스;
}
if ("" == $Host) {
$Host = $this->호스트;
}
if ("" == $User) {
$User = $this->사용자;
}
if ("" == $Password) {
$Password = $this->비밀번호;
}
/* 연결 설정 및 데이터베이스 선택 */
if (0 == db_connect()) {
$this->Link_ID = db_connect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password)가 실패했습니다.");
0을 반환합니다.
}
}
if (0 != db_connect()) {
if($Database != db_database()) {
$this->데이터베이스 = db_database($Database))
if(empty($this->Database)) {
$this->halt("데이터베이스를 사용할 수 없습니다. " . $this->Database);
0을 반환합니다.
}
}
}
$this->Link_ID를 반환합니다.
}
? >
다음 변경 사항에 주의하세요.
데이터베이스 테스트와 연결 테스트가 분리되어 있으므로 connect()가 현재 연결이 되어 있어도 다른 데이터베이스로 변경할지 여부를 계속 확인할 수 있습니다. 이는 db_connect()가 이전보다 두 배 더 자주 0과 비교되지만 이 추가 처리가 필요하다는 것을 의미합니다.
PHPLIB 외부에서 데이터베이스 연결 및 데이터베이스 선택을 유지하므로 PHP 코드 어디에서나 동일한 데이터베이스 선택 기능을 사용할 수 있습니다.
그러나 현재 처리에는 제한이 있습니다. 여기서는 모든 데이터베이스에 동일한 호스트, 사용자 및 비밀번호가 사용된다고 가정합니다. 데이터베이스에 사용자마다 다른 권한이 있는 경우 데이터베이스에 액세스하려면 특별한 연결을 설정해야 합니다. 어떻게? 다음 변수를 정의하면 됩니다.
<? PHP
$db_host = "";
$db_user = "";
$db_pass = "";
? >
db_database() 함수를 확장하여 현재 사용자 및 호스트를 특정 사용자 및 호스트와 비교합니다. 다음을 추가할 수도 있습니다.
<? PHP
$db_type = "";
? >
이 변수는 데이터베이스의 종류(mysql, Oracle 등)를 저장하는 데 사용됩니다. 이렇게 하면 여러 데이터베이스에 액세스할 수 있습니다.
그러나 여러 다른 유형의 데이터베이스를 처리하기 위해 코드를 변경하는 것은 매우 복잡합니다. 쿼리 기능은 물론 조인 및 선택 기능도 변경해야 합니다. PHP의 ODBC를 통해 연결한 다음 PHPLIB의 ODBC 옵션을 사용하여 이를 처리할 수도 있습니다. ODBC는 여러 데이터베이스를 공통된 방식으로 처리하므로 속도가 느려집니다. ODBC를 사용하면 동일한 코드를 사용하여 다양한 유형의 데이터베이스를 처리할 수 있습니다. 그러나 서로 다른 처리 형식의 날짜를 사용해야 하는 경우 문제가 있을 수 있으며 데이터베이스 간에도 이상한 차이가 있을 수 있습니다. ODBC는 연결을 단순화할 뿐 데이터베이스가 데이터와 SQL을 해석하는 방식을 수정하지는 않습니다.
이제 객체 클래스를 재정의하는 방법을 알아봅시다. connect() 함수는 클래스 정의로 캡슐화됩니다.
<? PHP
클래스 DB_Sql {
}
? >
이 함수를 common.php에 복사할 때 DB_Sql 클래스를 다음과 같이 캡슐화할 수 있습니다.
<? PHP
db_DB_Sql 클래스는 DB_Sql을 확장합니다.
}
? >
"확장" 작업에 대해 자세히 알아보려면 PHP 문서의 개체 및 클래스 섹션을 살펴보세요. 간단히 말해서 확장의 모든 정의는 이전의 모든 정의를 대체하고 재정의합니다.
이제 db_DB_Sql을 사용할 수 있습니다. PHPLIB를 구성할 때 다음 문을 작성합니다.
<? PHP
$x = 새로운 DB_Sql;
? > 다음으로 변경: <? PHP
$x = 새로운 db_DB_Sql;
? >
이 방법을 사용하면 이전 클래스 대신 수정된 클래스를 사용할 수 있습니다.
데이터베이스 연결 시 오류가 발생하는 경우, 현재 연결 상태를 외부 함수로 출력할 수 있습니다. SQL 문에 오류가 발생하면 DB_Sql의 query() 함수를 common.PHP의 db_DB_Sql에 복사한 후 출력 문을 삽입하여 현재 SQL 문이 무엇인지 확인할 수도 있습니다.
오류 또는 진단 정보를 디스크 파일에 쓸 수도 있습니다.
$db_log_file = "t:/diag.txt"
또는 유사한 텍스트 파일을
정의합니다
.Windows를 사용하는 경우 디렉터리가 존재하는지 확인해야 합니다. 그렇지 않으면 오류 메시지가 표시됩니다.
그런 다음 함수를 정의합니다.
<? PHP
함수 db_log($db_log_message) {
전역 $db_log_file;
$db_log_f = fopen($db_log_file, "a");
fwrite($db_log_f, date("Y md H:i:s")." ".$db_log_message."rn");
fclose($db_log_f);
}
? >
정보를 기록해야 하는 곳에 다음 코드를 추가합니다.
<? PHP
db_log("현재 데이터베이스: " . db_database());
? >
실제로 내장된 로그 파일이나 시스템 로그 파일을 사용할 수 있습니다. 하지만 그러면 많은 파일에서 작은 정보 조각을 찾아야 합니다. 따라서 이 별도의 로그 파일은 테스트에 도움이 됩니다. 녹음 전후에 다음 코드를 작성하는 것이 좋습니다.
<? PHP
db_log("현재 데이터베이스: " . db_database());
db_database("책 카탈로그");
db_log("현재 데이터베이스: " . db_database());
? >
데이터에 접근할 때 PHPLIB에 정의된 데이터베이스가 아닌 올바른 데이터베이스를 사용해야 한다는 점을 기억하세요. 데이터베이스에 대한 래퍼 함수를 생성하거나 사용하는 함수를 변경할 수 있습니다. mysql_query()를 사용한다면 db_database()를 먼저 사용하고,
<? PHP
$result = mysql_db_query(db_database("bookcatalogue"), "select * from?",
db_connect());
? > 다음은 함수를 제안합니다: <? PHP
함수 db_query($db_query_database, $db_query_sql) {
return(mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
? >
대신
<? PHP
db_database("책 카탈로그");
$result = mysql_query("select * from?", db_connect());
? 이제
PHPLIB(또는 유사한 소프트웨어)를 사용하여 여러 데이터베이스에 액세스
할 수
있습니다.
.extend 클래스/객체
.진단 테스트 삽입
.로그 파일 생성