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