현재 위치: > 최신 기사 목록> 일반 데이터베이스 운영 클래스로 STMT_INIT를 캡슐화하는 방법

일반 데이터베이스 운영 클래스로 STMT_INIT를 캡슐화하는 방법

M66 2025-05-17

PHP 개발에서 데이터베이스 작업은 필수 불가결 한 부분이며 일반적인 작업에는 추가, 삭제, 수정 및 검색이 포함됩니다. 그러나 기존 데이터베이스 상호 작용 방법에는 종종 코드 중복성, SQL 주입 취약점 및 성능 병목 현상과 같은 문제가 있습니다. 데이터베이스 상호 작용 효율을 향상시키고 코드 재사용 성을 향상시키기 위해 MySQLI :: STMT_INIT 메서드를 사용하여 일반 데이터베이스 작동 클래스를 캡슐화 할 수 있습니다. 이러한 방식으로 효율성을 향상시킬 수있을뿐만 아니라 SQL 주입 취약점도 방지 할 수 있습니다.

이 기사에서는 mysqli :: stmt_init 함수를 사용하여 공통 데이터베이스 작동 클래스를 생성하고 합리적인 캡슐화를 통해 데이터베이스 상호 작용을보다 효율적이고 안전하게 만드는 방법을 자세히 소개합니다.

1. mysqli :: stmt_init 함수는 무엇입니까?

mysqli :: stmt_init는 mysqli extension에서 mysqli_stmt 객체를 초기화하기위한 메소드입니다. MySQLI_STMT 객체는 SQL 쿼리를 실행할 때, 특히 다중 유사한 SQL 쿼리를 실행해야 할 때 기존 쿼리 방법보다 더 효율적인 준비된 SQL 문을 나타냅니다. 전처리 명세서는 SQL 구문 분석 시간을 줄이고 실행 효율성을 향상시킬 수 있습니다.

2. mysqli :: stmt_init 사용의 장점

  • 성능 향상 : 전처리 명세서를 통해 MySQL은 매번 구문 분석하지 않고 SQL 쿼리를 한 번에 컴파일하고 최적화합니다.

  • SQL 주입 방지 : 파라미터를 바인딩하여 사용자 입력 데이터를 직접 삽입하지 않으므로 SQL 주입 공격을 효과적으로 방지합니다.

  • 코드 재사용 성 : 데이터베이스 운영 클래스를 캡슐화 한 후 코드의 재사용 성을 향상시키기 위해 다른 장소에서 재사용 할 수 있습니다.

3. 공통 데이터베이스 운영 클래스를 캡슐화합니다

먼저 MySQLI :: STMT_INIT를 사용하여 데이터베이스 연결 클래스를 만들고 SQL 작업을 캡슐화해야합니다.

3.1 데이터베이스 연결 클래스

 class Database {
    private $mysqli;
    
    public function __construct($host, $username, $password, $dbname) {
        // 데이터베이스 연결을 만듭니다
        $this->mysqli = new mysqli($host, $username, $password, $dbname);
        
        // 연결을 확인하십시오
        if ($this->mysqli->connect_error) {
            die("Connection failed: " . $this->mysqli->connect_error);
        }
    }

    // 준비하다 SQL 진술 및 실행
    public function executeQuery($sql, $params = []) {
        // 초기화 명세서
        $stmt = $this->mysqli->stmt_init();
        
        // 준비하다 SQL 성명
        if (!$stmt->prepare($sql)) {
            die("Error in preparing statement: " . $stmt->error);
        }

        // 바인딩 매개 변수
        if (!empty($params)) {
            // 매개 변수 유형을 가져옵니다
            $types = str_repeat('s', count($params));  // 모든 매개 변수가 문자열 유형이라고 가정합니다
            $stmt->bind_param($types, ...$params);
        }

        // 쿼리를 실행하십시오
        if ($stmt->execute()) {
            // 반환 결과 세트
            return $stmt->get_result();
        } else {
            die("Error in executing statement: " . $stmt->error);
        }
    }

    // 데이터베이스 연결을 닫습니다
    public function close() {
        $this->mysqli->close();
    }
}

3.2이 클래스를 사용하여 데이터베이스 작업을 수행하십시오

위의 코드에서는 SQL 쿼리를 실행할 수있는 데이터베이스 작동 클래스 데이터베이스를 캡슐화합니다. 그것을 사용할 때는 SQL 문과 매개 변수 만 전달하면됩니다.

예를 들어, 데이터 삽입 :

 $db = new Database('localhost', 'root', 'password', 'm66.net');

// 데이터 삽입
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
$params = ['John Doe', 'johndoe@m66.net'];
$db->executeQuery($sql, $params);

쿼리 데이터 :

 $sql = "SELECT * FROM users WHERE email = ?";
$params = ['johndoe@m66.net'];
$result = $db->executeQuery($sql, $params);

// 출력 결과
while ($row = $result->fetch_assoc()) {
    echo "Name: " . $row['name'] . ", Email: " . $row['email'] . "<br>";
}

$db->close();

3.3 확장 기능 : 배치 작동

캡슐화 된 데이터베이스 작동 클래스는 단일 SQL 쿼리를 실행하는 것 외에도 배치 작업을 지원할 수도 있습니다. 배치 작동 방법을 클래스에 추가하면 여러 데이터 작업을 효율적으로 수행 할 수 있습니다.

 public function executeBatchQuery($sql, $paramsList) {
    // 초기화 명세서
    $stmt = $this->mysqli->stmt_init();
    
    // 준비하다 SQL 성명
    if (!$stmt->prepare($sql)) {
        die("Error in preparing statement: " . $stmt->error);
    }

    // 매개 변수 유형을 가져옵니다
    $types = str_repeat('s', count($paramsList[0])); // 모든 매개 변수가 문자열 유형이라고 가정합니다
    
    // 매개 변수 목록을 반복하고 실행하십시오
    foreach ($paramsList as $params) {
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
    }
    
    return true;
}

배치로 데이터 삽입 :