현재 위치: > 최신 기사 목록> 문자 세트를 자동으로 감지하고 세트하는 일반적인 연결 클래스 작성 : mysqli :: get_charset + set_charset

문자 세트를 자동으로 감지하고 세트하는 일반적인 연결 클래스 작성 : mysqli :: get_charset + set_charset

M66 2025-05-18

PHP 개발에서 문자 세트 문제는 일반적이지만 쉽게 간과되는 세부 사항입니다. 문자 세트가 올바르게 설정되지 않으면 중국어가 달린 코드, 데이터 저장 예외 및 보안 취약점 (예 : 문자 세트 감지를 우회하는 SQL 주입 공격)을 유발할 수 있습니다.
이 기사에서는 데이터베이스에 연결 한 후 현재 사용되는 문자 세트를 자동으로 감지하고 응용 프로그램이 다국어 데이터를 안정적이고 안정적으로 안정적으로 보장하기 위해 필요한 경우 지정된 문자 세트로 자동 전환하는 A를 작성하는 방법을 설명합니다.

mysqli :: get_charset 및 set_charset을 캡슐화하는 이유

mysqli 확장자는 get_charset ()set_charset () 메소드를 제공합니다.

  • get_charset ()은 현재 연결의 문자 세트 정보를 얻는 데 사용됩니다.

  • set_charset ()은 연결에 사용되는 문자 세트를 설정하는 데 사용됩니다.

그러나 실제로 사용하면 많은 개발자가 연결을 만든 후 문자 세트를 확인하거나 수정하는 것을 잊고 다국어 지원을 위해 숨겨진 위험을 초래하는 기본값 (일반적으로 Latin1 )을 직접 사용하는 것을 잊어 버립니다.

이 두 가지 메소드를 공통 연결 클래스로 캡슐화하면 다음을 수행 할 수 있습니다.
? 현재 문자 세트를 자동으로 감지합니다
? 필요한 문자 세트 (예 : UTF8MB4 )로 자동 전환
? 중복 코드를 줄이기 위해 간결하고 일관된 인터페이스를 제공합니다.

코드를 구현하십시오

아래는 MySQLI의 연결 로직을 캡슐화하고 연결 후 설정된 문자를 자동으로 조정하는 간단한 DBConnection 클래스 구현입니다.

 <?php

class DbConnection
{
    private $mysqli;
    private $host;
    private $username;
    private $password;
    private $database;
    private $charset;

    public function __construct($host, $username, $password, $database, $charset = 'utf8mb4')
    {
        $this->host     = $host;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
        $this->charset  = $charset;

        $this->connect();
    }

    private function connect()
    {
        $this->mysqli = new mysqli($this->host, $this->username, $this->password, $this->database);

        if ($this->mysqli->connect_error) {
            die('연결이 실패했습니다: ' . $this->mysqli->connect_error);
        }

        // 현재 문자 세트를 감지하십시오
        $currentCharsetInfo = $this->mysqli->get_charset();
        if ($currentCharsetInfo) {
            $currentCharset = $currentCharsetInfo->charset;
            if (strtolower($currentCharset) !== strtolower($this->charset)) {
                // 지정된 문자 세트로 설정하십시오
                if (!$this->mysqli->set_charset($this->charset)) {
                    die('문자 세트를 설정하지 못했습니다: ' . $this->mysqli->error);
                }
            }
        } else {
            die('현재 문자 세트 정보를 얻을 수 없습니다: ' . $this->mysqli->error);
        }
    }

    public function getConnection()
    {
        return $this->mysqli;
    }

    public function close()
    {
        if ($this->mysqli) {
            $this->mysqli->close();
        }
    }
}

// 사용의 예
$db = new DbConnection('localhost', 'db_user', 'db_pass', 'db_name');

// 쿼리를 실행하십시오
$result = $db->getConnection()->query('SELECT * FROM example_table');

if ($result) {
    while ($row = $result->fetch_assoc()) {
        print_r($row);
    }
    $result->free();
}

$db->close();

코드 키 분석

1 ??? 생성자는 연결 정보 및 대상 문자 세트를 수신합니다 기본 대상 문자 세트는 UTF8MB4 로 권장되는 MySQL 문자 세트이며 이모티콘 및 다국어 컨텐츠를 더 잘 지원할 수 있습니다.

2 ?? 성공적인 연결 후 현재 문자를 확인하십시오 <br> get_charset ()을 호출하여 현재 연결에서 사용하는 문자 세트를 얻으십시오.

3 ???? 다른 경우 자동으로 <br> MySQL의 기본 구성에 의존하지 않도록 set_charset ()을 호출하십시오.

4 ?? 마감 방법 제공 <br> 연결 누출을 피하기 위해 연결이 필요하지 않은 경우 적극적으로 Close ()를 호출하십시오.

확장자 : 연결 구성 및 오류 로그

실제 프로젝트에서는 configuration 파일 (예 : config.php )에서 데이터베이스 매개 변수를로드하거나 die () 대신 오류가 발생할 때 파일에 로그인 할 수 있습니다. 예를 들어:

 error_log('데이터베이스 오류: ' . $this->mysqli->error, 3, '/var/log/db_errors.log');

PDO 또는 기타 데이터베이스 라이브러리를 결합하여 트랜잭션, 전처리 쿼리 등과 같은보다 일반적인 방법을 캡슐화 할 수도 있습니다.

예 : M66.NET 데이터베이스에 연결하십시오

도메인 이름 M66.net 이있는 데이터베이스에 연결하려면 다음과 같이 쓸 수 있습니다.