PHP 개발에서 우리는 종종 MySQLI 확장을 사용하여 MySQL 데이터베이스와 상호 작용합니다. 특히 쿼리 작업을 수행 할 때 일반적으로 MySQLI_Result 객체를 얻습니다. 그러나 MySQLI_RESULT 객체 자체는 배열 또는 다른 반복 가능한 객체와 같은 쿼리 결과 를옵니다. Query 결과를 처리 할 때 각 데이터 행을 얻으려면 Fetch_Assoc () 또는 기타 유사한 기능을 수동으로 호출해야합니다.
보다 편리하게 쿼리 결과를 처리하려면 MySQLI_Result를 반복 가능한 객체로 캡슐화하여 쿼리 결과를 처리 할 때보다 간결하고 직관적입니다. 다음으로, 우리는 이것을 달성하는 방법을 탐구 할 것입니다.
MySQLI_RESULT를 반복 가능한 객체로 캡슐화 할 수 있도록 반복자 인터페이스를 구현하기위한 클래스를 만들 수 있습니다. 먼저, 클래스가 mysqli_result 객체를 수신하고 인터페이스 메소드를 구현하여 반복을 지원할 수 있는지 확인해야합니다.
<?php
class MysqliResultIterator implements Iterator {
private $result;
private $currentRow;
private $currentIndex;
public function __construct($mysqliResult) {
$this->result = $mysqliResult;
$this->currentIndex = 0;
}
public function rewind() {
$this->currentIndex = 0;
$this->currentRow = $this->result->fetch_assoc();
}
public function current() {
return $this->currentRow;
}
public function key() {
return $this->currentIndex;
}
public function next() {
$this->currentRow = $this->result->fetch_assoc();
$this->currentIndex++;
}
public function valid() {
return $this->currentRow !== null;
}
}
?>
이 클래스에서는 반복자 인터페이스의 5 가지 방법을 구현합니다.
Rewind () : 반복자를 첫 번째 요소로 재설정하십시오.
current () : 현재 요소를 반환합니다.
key () : 현재 요소의 인덱스를 반환합니다.
다음 () : 다음 요소로 이동합니다.
유효한 () : 현재 요소가 유효한지 확인하십시오.
이러한 방법을 통해 MySQlireSultiterator 클래스를 통해 작동 배열 또는 다른 반복 가능한 객체와 같은 쿼리 결과를 직접 이동할 수 있습니다.
이 반복자 클래스를 정의한 후에는 mysqli_result 객체를 MySQLIRESULTITERATOR 클래스에 전달하여 반복 가능한 객체를 만들 수 있습니다.
<?php
// 데이터베이스 연결을 설정하고 쿼리를 실행했다고 가정합니다.
$mysqli = new mysqli("localhost", "username", "password", "database");
$query = "SELECT id, name, email FROM users";
$result = $mysqli->query($query);
if ($result) {
// a MysqliResultIterator 물체
$iterator = new MysqliResultIterator($result);
// 통과하다 foreach 반복 쿼리 결과
foreach ($iterator as $index => $row) {
echo "Index: " . $index . "<br>";
echo "ID: " . $row['id'] . "<br>";
echo "Name: " . $row['name'] . "<br>";
echo "Email: " . $row['email'] . "<br><hr>";
}
// 쿼리 결과를 닫습니다
$result->free();
} else {
echo "Query failed: " . $mysqli->error;
}
$mysqli->close();
?>
위의 코드에서는 MySQlireSultiterator 객체를 생성하고 Foreach 문을 반복하여 결과를 쿼리합니다. 이 반복기를 사용하면 retch_assoc () 메소드에 대한 수동 호출을 피하면서 코드가 더 간결하게됩니다.
여러 데이터 형식 (협회 어레이, 숫자 배열 등)과 같은보다 유연한 기능이 필요한 경우 반복자를 더 확장하여 더 많은 옵션을 지원할 수 있습니다. 예를 들어, 매개 변수를 추가하여 연결 배열 또는 숫자 배열 형식으로 데이터를 반환할지 여부를 지정하십시오.
<?php
class MysqliResultIterator implements Iterator {
private $result;
private $currentRow;
private $currentIndex;
private $fetchType;
public function __construct($mysqliResult, $fetchType = MYSQLI_ASSOC) {
$this->result = $mysqliResult;
$this->currentIndex = 0;
$this->fetchType = $fetchType;
}
public function rewind() {
$this->currentIndex = 0;
$this->currentRow = $this->result->fetch_array($this->fetchType);
}
public function current() {
return $this->currentRow;
}
public function key() {
return $this->currentIndex;
}
public function next() {
$this->currentRow = $this->result->fetch_array($this->fetchType);
$this->currentIndex++;
}
public function valid() {
return $this->currentRow !== null;
}
}
?>
이 개선을 통해 MySQLI_ASSOC 또는 MySQLI_NUM을 사용하여 연관 배열 또는 숫자 배열을 반환하는 등 반복기를 생성 할 때 쿼리 결과의 형식을 지정할 수 있습니다.
mysqli_result를 반복자 인터페이스를 구현하는 객체로 캡슐화함으로써 데이터베이스 쿼리 결과의 처리를보다 편리하고 우아하게 만들 수 있습니다. 이것은 코드를 간결 할뿐만 아니라 더 많은 유연성을 제공하고 다양한 유형의 쿼리 결과를 더 잘 처리 할 수 있습니다.
이 캡슐화 방법은 특히 많은 양의 데이터가 필요한 시나리오에서 코드의 유지 관리 가능성과 가독성을 크게 향상시킬 수 있습니다.