특히 MVC (Model-View-Controller) 아키텍처에서 PHP를 사용하여 개발할 때 데이터베이스 작업을 관리하는 방법이 핵심 문제입니다. MySQLI Extension은 PHP에서 MySQL 데이터베이스에 액세스하는 일반적인 방법이며 MySQLI_Result 함수는 데이터베이스 쿼리에서 결과 세트를 가져 오는 데 사용됩니다. MVC 아키텍처에서 데이터베이스 쿼리 및 결과 세트가 컨트롤러에서 직접 처리되면 코드가 부풀어 오르고 유지하기가 어려우며 확장하기 어려울 수 있습니다. 따라서 코드의 유지 관리 가능성과 확장 성을 향상시키기 위해 MySQLI_RESULT 기능을 우아하게 캡슐화하는 방법은 개발자가 해결 해야하는 문제입니다.
이 기사는 MVC 모드에서 mysqli_result 사용을 우아하게 캡슐화하고 관련 코드 예제를 제공하는 방법을 소개합니다.
MVC 아키텍처에서 책임 부서는 매우 중요합니다.
모델 : 데이터 소스 (예 : 데이터베이스)와 상호 작용, 데이터 쿼리 캡슐화 및 업데이트 작업을 담당합니다.
보기 : 데이터 표시를 담당하는 경우 일반적으로 데이터베이스 작업이 포함되지 않습니다.
컨트롤러 : 사용자 입력을 수신하고 해당 모델을 호출하여 데이터를 처리하고 결과를보기에 전달합니다.
코드를 명확하고 응집력있게 유지하려면 모델 계층의 데이터베이스와 상호 작용하는 논리에 초점을 맞추어야하며 컨트롤러는 모델의 메소드를 호출하여 데이터를 가져옵니다.
mysqli_result 객체는 쿼리 문을 실행하여 리턴 된 결과 세트입니다. 코드의 유지 관리 가능성과 확장 성을 향상시키기 위해서는 컨트롤러에서 mysqli_result 객체를 직접 조작하지 않아야합니다. 이유가 포함됩니다.
코드 복제 : 쿼리를 처리하면 여러 위치가 발생하면 중복 코드가 쉽습니다.
테스트하기가 어렵습니다 : mysqli_result 객체의 직접 조작으로 인해 단위 테스트가 어렵습니다.
불량 확장 성 : 직접 MySQLI_RESULT를 직접 작동하면 나중에 데이터베이스 드라이버를 확장하기가 어렵습니다 (예 : MySQL에서 PostgreSQL로 전환).
따라서 MySQLI_RESULT 객체의 작동을 캡슐화하여 다른 시나리오에서 재사용 할 수 있고보다 쉽게 수정 및 확장 할 수있는 독립 모듈이되도록해야합니다.
먼저 데이터베이스 연결 및 쿼리 작업을 담당하는 데이터베이스 추상 클래스를 만들 수 있습니다. 이 클래스는 컨트롤러에서 mysqli_result 객체를 직접 조작하지 않도록 캡슐화 된 결과 세트를 반환합니다.
<?php
abstract class Database {
protected $connection;
public function __construct($host, $username, $password, $dbname) {
$this->connection = new mysqli($host, $username, $password, $dbname);
if ($this->connection->connect_error) {
die("Connection failed: " . $this->connection->connect_error);
}
}
abstract public function query($sql);
}
?>
그런 다음 데이터베이스 클래스에서 상속되는 특정 데이터베이스 클래스를 만듭니다. 이 클래스는 쿼리 작업 및 결과 세트를 얻는 것을 캡슐화합니다.
<?php
class MySQLDatabase extends Database {
public function query($sql) {
$result = $this->connection->query($sql);
if ($result === false) {
return false; // 쿼리가 실패하면 반환합니다 false
}
return new MySQLResult($result); // 캡슐화 된 결과 세트 객체를 반환합니다
}
}
?>
다음으로 MySQLRESULT 클래스를 만듭니다 . 이 클래스는 쿼리 결과의 작동을 단순화하기위한 몇 가지 편리한 방법을 제공합니다.
<?php
class MySQLResult {
private $result;
public function __construct(mysqli_result $result) {
$this->result = $result;
}
public function fetchAll() {
return $this->result->fetch_all(MYSQLI_ASSOC); // 모든 데이터를 얻으십시오
}
public function fetchRow() {
return $this->result->fetch_assoc(); // 데이터 라인을 얻으십시오
}
public function numRows() {
return $this->result->num_rows; // 결과 세트에서 행 수를 얻으십시오
}
public function free() {
$this->result->free(); // 결과 세트를 릴리스하십시오
}
}
?>
이 클래스에서는 모든 행 얻기, 단일 행 얻기, 결과 세트 번호 얻기 및 결과 세트를 출시하는 것과 같은 mysqli_result 의 공통 작업을 캡슐화합니다. 이로 인해 데이터베이스 쿼리 작업이보다 간결하고 유지 관리가 쉬워집니다.
컨트롤러에서는 MySQLI_RESULT 객체를 작동하는 방법에 대해 관심을 갖지 않고 모델에서 메소드를 호출하여 데이터를 얻을 수 있습니다.
<?php
class UserController {
private $db;
public function __construct() {
$this->db = new MySQLDatabase('localhost', 'root', '', 'my_database');
}
public function getUserList() {
$sql = "SELECT * FROM users";
$result = $this->db->query($sql);
if ($result === false) {
echo "Query failed.";
return;
}
$users = $result->fetchAll(); // 모든 사용자 데이터를 얻습니다
foreach ($users as $user) {
echo "User: " . $user['name'] . "<br>";
}
$result->free(); // 결과 세트를 릴리스하십시오
}
}
?>
컨트롤러에서 쿼리의 데이터베이스 모델의 쿼리 메소드를 호출합니다. 반환 된 mysqlresult 객체는 fetchall ()을 통해 모든 결과를 얻거나 fetchrow ()를 사용하여 단일 라인 데이터를 얻을 수 있습니다. 이러한 방식으로 컨트롤러의 코드는 매우 간결 해지고 논리는 데이터베이스 작업과 완전히 분리되어 유지 관리 및 확장이 쉽습니다.
MVC 아키텍처에서 mysqli_result 객체를 캡슐화함으로써 우리는 모델 계층에 데이터베이스 작업을 집중시킬뿐만 아니라 코드의 유지 관리 가능성과 확장 성을 향상시킵니다. 캡슐화 된 MySQLRESULT 클래스를 사용하면 쿼리 결과 처리를 단순화하여 컨트롤러가 기본 데이터베이스 구현에 관심을 갖지 않고 비즈니스 로직에 집중할 수 있습니다. 이 접근법은 팀 협업에 큰 장점이 있으며 나중에는 확장 기능이 있습니다.