현재 위치: > 최신 기사 목록> mysqli_result를 반복 가능한 객체로 캡슐화하는 방법

mysqli_result를 반복 가능한 객체로 캡슐화하는 방법

M66 2025-05-18

PHP 개발에서 우리는 종종 MySQLI 확장을 사용하여 MySQL 데이터베이스와 상호 작용합니다. 특히 쿼리 작업을 수행 할 때 일반적으로 MySQLI_Result 객체를 얻습니다. 그러나 MySQLI_RESULT 객체 자체는 배열 또는 다른 반복 가능한 객체와 같은 쿼리 결과 를옵니다. Query 결과를 처리 할 때 각 데이터 행을 얻으려면 Fetch_Assoc () 또는 기타 유사한 기능을 수동으로 호출해야합니다.

보다 편리하게 쿼리 결과를 처리하려면 MySQLI_Result를 반복 가능한 객체로 캡슐화하여 쿼리 결과를 처리 할 때보다 간결하고 직관적입니다. 다음으로, 우리는 이것을 달성하는 방법을 탐구 할 것입니다.

1 단계 : 반복자 클래스를 만듭니다

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 클래스를 통해 작동 배열 또는 다른 반복 가능한 객체와 같은 쿼리 결과를 직접 이동할 수 있습니다.

2 단계 : 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 () 메소드에 대한 수동 호출을 피하면서 코드가 더 간결하게됩니다.

3 단계 : 반복자 최적화 (선택 사항)

여러 데이터 형식 (협회 어레이, 숫자 배열 등)과 같은보다 유연한 기능이 필요한 경우 반복자를 더 확장하여 더 많은 옵션을 지원할 수 있습니다. 예를 들어, 매개 변수를 추가하여 연결 배열 또는 숫자 배열 형식으로 데이터를 반환할지 여부를 지정하십시오.

 <?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를 반복자 인터페이스를 구현하는 객체로 캡슐화함으로써 데이터베이스 쿼리 결과의 처리를보다 편리하고 우아하게 만들 수 있습니다. 이것은 코드를 간결 할뿐만 아니라 더 많은 유연성을 제공하고 다양한 유형의 쿼리 결과를 더 잘 처리 할 수 ​​있습니다.

이 캡슐화 방법은 특히 많은 양의 데이터가 필요한 시나리오에서 코드의 유지 관리 가능성과 가독성을 크게 향상시킬 수 있습니다.