PHP 4에서는 일반적으로 var를 사용하여 변수를 선언하지만, PHP 5에서는 객체 지향 프로그래밍(OOP) 기능을 사용하여 데이터의 가시성을 사용자 정의할 수 있습니다. 즉, 여기서의 가시성은 변수 범위와 매우 유사합니다. 이지만 더 나은 제어 메커니즘을 제공하므로 세 가지 유형의 가시성 수정자가 있습니다.
공용(기본값) - 전역 범위에서 변수에 액세스하거나 수정할 수 있습니다.
보호됨 - 변수는 클래스 자체 및 직접 파생된(extends 문을 사용하여) 클래스 내에서만 액세스하거나 수정할 수 있습니다.
비공개--변수는 클래스 내에서만 액세스하거나 수정할 수 있습니다.
인터페이스 구현과 마찬가지로 프로그램에서 이러한 규칙을 위반하면 심각한 오류가 발생하며 인터페이스와 마찬가지로 순전히 프로그래머의 편의를 위해 존재합니다. 그러나 이것이 무시할 수 있다는 의미는 아닙니다. 특정 클래스 멤버 변수의 가시성을 지정하면 외부 영향으로부터 객체 내의 데이터를 보호할 수 있습니다.
MySqlDB 클래스가 있고 그 안에 $link 변수가 비공개로 선언되어 있다고 가정합니다. 즉, 이 변수는 $this 변수를 사용하여 개체 내부에서만 액세스할 수 있습니다. 이는 클래스 외부의 다른 개체나 함수가 실수로 덮어쓰는 것을 방지합니다. , 가시성 속성을 사용하여 쿼리 객체를 생성하는 데 도움을 드리겠습니다.
쿼리를 실행하고 결과를 반환할 수 있는 별도의 엔터티로 생각할 수 있습니다. 일부 데이터베이스 시스템에도 저장 프로시저가 있는데, 저장 프로시저는 쿼리문을 저장하고 호출 시 해당 매개변수를 허용합니다. 그러나 MySQL은 버전 5.1 이전에는 유사한 기능을 제공하지 않았으며 일부 다른 유형의 데이터베이스 관리 시스템도 마찬가지입니다.
이 기사에서는 위의 두 가지 기능을 예제의 쿼리 개체에 결합하여 기본 저장 프로시저를 시뮬레이션하고 결과 포인터를 내부적으로 저장합니다. 지금은 MySqlDB 개체의 query() 함수를 호출할 수 있는 개체에서 쿼리를 실행하는 데 중점을 둡니다.
다음 공용 함수는 쿼리 개체에 정의될 수 있습니다.
__construct() - 생성자는 DB 인터페이스를 구현하는 개체에 대한 인스턴스 참조가 포함된 매개 변수를 받아들입니다.
prepare()--prepare() 함수는 쿼리의 저장 프로시저를 초기화합니다. 여기에는 하나 이상의 제한된 자리 표시자가 포함될 수 있으며, 이는 Execute() 함수에 매개 변수로 전달됩니다. 자리 표시자는 매개변수 수와 관련된 콜론, 그 뒤에 매개변수 유형과 관련된 정수 및 문자로 정의됩니다.
자리 표시자를 포함하는 간단한 쿼리는 다음과 같습니다.
SELECT col1,col2 FROM table_name WHERE col1=:1I
Execute()--execute() 함수가 쿼리를 실행합니다. prepare() 함수에 의해 저장 프로시저로 조기에 초기화된 경우 전달된 모든 매개변수는 저장 프로시저의 실행 매개변수로 사용됩니다. 그렇지 않으면 첫 번째 매개변수는 쿼리 텍스트로만 사용됩니다. Execute() 함수는 쿼리를 실행한 후 결과를 반환합니다.
compile()--compile() 함수는 실행() 함수와 유사합니다. 실제로 쿼리는 실행되지 않지만 쿼리 문자열의 모든 자리 표시자를 바꾸고 저장 프로시저의 매개 변수를 받아들이고 컴파일된 버전을 반환합니다. 쿼리의.
보호된 멤버
위에서 언급한 것처럼 가시성의 개념은 개체의 내부 작업을 숨기고 내부 작업에 필요한 데이터 무결성을 보호하는 데 사용될 수 있습니다. 앞에서 설명한 대로 쿼리에서 반환된 결과 포인터는 쿼리 개체에서 파생된 특정 데이터베이스 쿼리 개체가 일부 핵심 기능에 과부하를 줄 수 있으므로 여기서는 보호된 속성으로 저장됩니다.
코드 이론에
대해 충분히
알아보고 이제 코드 작성을 시작하겠습니다. 예제 1:예제 1: 데이터베이스 쿼리 클래스의 템플릿
클래스 DBQuery
{
/**
*DB 인터페이스를 구현하는 객체에 대한 참조를 저장합니다.
*/
보호된 $db
;
*저장 프로시저인 경우 true로 설정합니다.
*/
protected $stored_procedure = 거짓
/**
*모든 문자열이 삭제된 쿼리를 저장합니다.
*/
비공개 $쿼리
/**
*는 SQL에서 따옴표를 일치시키는 데 사용됩니다.
*/
개인 정적 $QUOTE_MATCH = "/(".*(?db = $db;
}
공개 함수 준비($query)
{
$this->stored_procedure = true;
}
공개 함수 컴파일($args)
{}
공개 함수 실행($query)
{}
}
prepare 함수는
예제 1의 템플릿입니다. 가장 먼저 해야 할 일은 prepare() 함수를 구성하는 것입니다. 인용되지 않은 문자가 실수로 자리 표시자로 구문 분석되도록 하려면 함수가 쿼리 문자열에서 모든 문자를 제거해야 합니다. 일시적으로 배열에 저장합니다. 문자열 자체도 일반적으로 SQL 문에 나타나지 않아야 하는 문자열 시퀀스로 인식되는 자리 표시자로 대체됩니다. 쿼리를 컴파일하는 동안 프로시저 자리 표시자가 먼저 교체된 다음 문자열이 다시 쿼리에 삽입됩니다. 이는 preg_replace() 함수와 preg_replace() 함수로 사용되는 또 다른 도우미 콜백 함수를 통해 수행됩니다.
예시 2: prepare() 함수
/**
* 쿼리를 저장 프로시저로 준비합니다.
* @param string $query 준비된 쿼리 텍스트
* @return 무효
*/
공개 함수 준비($query)
{
$this->stored_procedure = true;
$this->quote_store = array(); //따옴표 지우기 $this->query = preg_replace(self::$QUOTE_MATCH, '$this->sql_quote_replace("1"?"1":'2')', $ 질문);
}
비공개 함수 sql_quote_replace($match)
{
$번호 = 개수($this->query_strings);
$this->query_strings[] = $match;
"$||$$number"를 반환합니다.
}
여기서는 quote_store 속성 및 sql_quote_replace() 함수뿐만 아니라 정적 QUOTE_MATCH 속성 private의 사용을 참고하세요. protected와 비교하여 여기에서 private으로 정의하면 쿼리 클래스의 prepare() 메서드를 재정의하는 모든 하위 클래스가 자체 메커니즘을 사용하여 따옴표를 제거합니다.
함수 compile
다음 단계는 compile() 및 excute() 함수를 빌드하는 것입니다.
예제 3에 표시된 대로 compile() 함수에는 다음과 같은 기능이 있습니다.
· 허용되는 매개변수의 수는 쿼리의 자리 표시자와 일치하는 변수(즉, 가변 매개변수)입니다.
· 자리 표시자가 올바른 데이터 유형인지 확인하고 이를 매개변수의 값으로 바꾸십시오.
·쿼리를 문자열로 반환하지만 실행하지는 않습니다.
·prepare() 함수를 사용하여 질의 객체를 저장 프로시저로 초기화하지 않으면 예외가 발생한다.
예시 3: compile() 함수
/**
* 컴파일된 쿼리를 반환하지만 실행하지는 않습니다.
* @param $args 혼합,... 쿼리 매개변수
* @return string 컴파일된 쿼리
*/
공용 함수 컴파일($params)
{
if (! $this->stored_procedure) {
throw new Exception("저장 프로시저가 초기화되지 않았습니다!");
}
/* 대체 매개변수*/
$params = func_get_args(); // 함수 매개변수 가져오기 $query = preg_replace("/(?query);
return $this->add_strings($query); // 문자열을 쿼리에 다시 넣습니다.
}
/**
* prepare() 함수에 의해 제거된 문자열을 다시 삽입합니다.
*/
개인 함수 add_strings($string)
{
$numbers = array_keys($this->query_strings);
$count = 개수($숫자);
$검색 = 배열();
for($x = 0; $x < $count; $x++) {
$searches[$x] = "$||${$numbers[$x]}";
}
return str_replace($searches, $this->query_strings, $string);
}
/**
* 실행될 때마다 저장 프로시저의 자리 표시자가 교체됩니다.
*/
보호된 함수 compile_callback($params, $index, $type)
{
--$index;
/* 예외 발생 */
if (!isset($params[$index])) {
throw new Exception("저장 프로시저가 필요한 수의 매개변수를 받지 못했습니다!");
}
/* 여기에 날짜 및 시간과 같은 다른 유형을 추가할 수 있습니다. */
스위치($type) {
사례 'S':
return '"' . $this->db->escape_string($params[$index]) . '"';
부서지다;
'나'의 경우:
return (int) $params[$index];
부서지다;
사례 'N':
반환(부동) $params[$index];
기본:
throw new Exception("저장 프로시저에 지정된 '$type' 데이터 유형을 인식할 수 없습니다.");
}
}
compile() 함수에는 두 개의 추가 함수가 사용됩니다. compile_callback() 함수는 preg_replace() 함수 호출에서 콜백 함수로 사용됩니다. 쿼리에서 자리 표시자를 찾을 때마다 전달된 값으로 대체됩니다. 함수의 값을 컴파일하면 실행됩니다.
실행 함수
마지막으로 실행() 함수를 구성해야 합니다. 실행() 함수는 여기서 DBQuery 개체를 초기화하는 데 사용되는 DB 개체를 사용하여 쿼리를 컴파일하고 실행합니다. 예제 4에서 call_user_func_array() 함수를 사용하여 컴파일된 쿼리를 얻는 방법을 참고하세요. 그 이유는 Execution() 함수가 런타임까지 전달된 인수 수를 결정할 수 없기 때문입니다.
예제 4: 실행() 함수
/**
*
* 현재 쿼리를 실행하고 자리 표시자를 제공된 매개변수로 바꿉니다.
*
* @param 혼합 $queryParams,... 쿼리 매개변수
* @return 리소스 실행된 쿼리를 나타내는 리소스에 대한 참조입니다.
*/
공용 함수 실행($queryParams = '')
{
//예: SELECT * FROM table WHERE name=:1S AND type=:2I AND level=:3N
$args = func_get_args();
if ($this->stored_procedure) {
/* 쿼리를 얻기 위해 함수 컴파일을 호출합니다 */
$query = call_user_func_array(array($this, 'compile'), $args);
} 또 다른 {
/* 저장 프로시저가 초기화되지 않은 경우 표준 쿼리로 실행합니다. */
$쿼리 = $queryParams;
}
$this->result = $this->db->query($query);
return $this->result;
}
을
보여주기 위해 아래에 DBQuery 개체를 저장 프로시저로 사용하고 올바른 사용자 이름과 암호가 입력되었는지 확인하는 작은 예가 구성되어 있습니다. 예 5:
예를
참조하세요.5:
'mysql_db.php5'가 필요합니다.
require_once 'query2.php5';
$db = 새로운 MySqlDb;
$db->connect('호스트', '사용자 이름', '패스');
$db->query('content_management_system 사용');
$query = new DBQuery($db);
$query->prepare('SELECT fname,sname FROM 사용자 WHERE 사용자 이름=:1S AND pword=:2S AND 만료_시간<:3I ');
if ($result = $query->execute("visualad", "앞치마", time())) {
if ($db->num_rows($result) == 1) {
echo('인증정보가 정확합니다.');
} 또 다른 {
echo('자격 증명이 올바르지 않으며 세션이 만료되었습니다.');
}
} 또 다른 {
echo('쿼리 실행 중 오류가 발생했습니다:' . $db->error());
}
이 기사에서는 클래스 변수를 선언할 때 접근 한정자 private, protected 및 public을 사용하여 데이터를 보호하고 데이터 객체의 가시성을 제한하는 방법을 살펴보았습니다. 동시에 이러한 개념은 PHP 5에서도 사용할 수 있습니다. 중요한 내부 데이터를 보호하기 위한 다른 Data 클래스입니다.