현재 위치: > 최신 기사 목록> pdostatement의 결과를 얻을 때 유형 불일치 문제 해결 :: fetchObject

pdostatement의 결과를 얻을 때 유형 불일치 문제 해결 :: fetchObject

gitbox 2025-05-11

데이터베이스 작업에 PDO를 사용하는 경우 PDostatement :: FetchObject는 쿼리 결과를 객체에 직접 매핑 할 수있는 매우 편리한 방법입니다. 그러나 때로는 데이터베이스의 정수 ( int ) 인 필드와 같은 유형 불일치 문제가 발생합니다. 이 상황은 많은 양의 데이터를 다루거나 엄격한 유형의 데이터 구조를 요구할 때 특히 번거 롭습니다.

이유와 솔루션을 살펴 보겠습니다.

문제의 원인

pdostatement :: fetchObject 자체는 데이터베이스 필드의 유형에 따라 PHP 유형을 자동으로 추론하지 않습니다. 단순히 데이터를 객체 속성으로 채우는 경우가 많으므로 여러 번 숫자는 문자열로 처리됩니다. PDO는 기본적으로 모든 데이터를 문자열로 반환하기 때문입니다.

예를 살펴 보겠습니다.

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$user = $stmt->fetchObject();

var_dump($user);
?>

출력은 다음과 같습니다.

 object(stdClass)#1 (2) {
  ["id"]=>
  string(1) "1"
  ["name"]=>
  string(4) "John"
}

보시다시피, ID가 데이터베이스에서 int 유형이더라도 결과는 PHP의 문자열 입니다.

해결책

이 문제를 해결하는 몇 가지 일반적인 방법이 있습니다.

1. pdo :: attr_stringify_fetches 옵션을 사용하십시오 (권장되지 않음).

PDO에는 pdo :: attr_stringify_fetches 라는 설정이있어 숫자를 문자열로 자동 변환할지 여부를 제어 할 수 있습니다. 그러나이 옵션은 Fetch () 시리즈 기능에만 효과적 일 수 있으며 FetchObject 에 직접적인 영향을 미치지 않으므로 권장되지 않습니다.

2. 수동 유형 변환 (권장)

가장 실용적인 방법은 클래스를 정의하고 생성자 또는 마술 방법 __s 에서 수동으로 유형 변환을 수행하는 것입니다.

예를 들어:

 <?php
class User {
    public int $id;
    public string $name;

    public function __construct() {
        // 유형 강요는 여기에서 수행 할 수 있습니다
    }

    public function __set($name, $value) {
        if ($name === 'id') {
            $this->id = (int) $value;
        } elseif ($name === 'name') {
            $this->name = (string) $value;
        }
    }
}

$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$user = $stmt->fetchObject(User::class);

var_dump($user);
?>

이렇게하면 데이터베이스에서 데이터를 가져 오면 유형이 올바른지 확인할 수 있습니다.

3. 쿼리 문에서 필드 유형을 명시 적으로 변환 (선택 사항)

SQL 문서에서 필드를 필요한 유형으로 직접 강제로 강제합니다.

 SELECT id + 0 AS id, name FROM users

이런 식으로, ID는 데이터베이스가 반환 될 때 이미 정수이지만,이 방법은 특히 우아하지 않으며 유지 보수가 좋지 않으므로 임시 비상 구조에만 적합합니다.

4. 사용자 정의 매핑 기능 사용 (대규모 프로젝트에 적합)

프로젝트에 객체 매핑이 필요한 장소가 많으면 일반 매퍼 도구를 작성하는 것이 좋습니다. 예를 들어:

 <?php
function mapUser($data) {
    $user = new User();
    $user->id = (int) $data->id;
    $user->name = (string) $data->name;
    return $user;
}

$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$rawUser = $stmt->fetchObject();
$user = mapUser($rawUser);

var_dump($user);
?>

이 방법은보다 제어 가능하며 이후 단계에서 검증 로직을 추가하는 것과 같이 관리 및 확장이 쉽습니다.

다른 예방 조치

  • 데이터 테이블 필드 유형은 합리적으로 설계되었습니다 . 데이터베이스 테이블의 필드를 가능한 한 많이 제거하십시오. 예를 들어, ID는 int 이고 금액은 소수 여야합니다. 숫자 필드 대신 문자열을 사용하지 마십시오.

  • 강력한 유형 선언 사용 : PHP 7.4+에서 유형 힌트 및 속성 유형 선언을 사용하면 오류를 일찍 감지 할 수 있습니다.

  • Unified Data Access Layer (DAL) 캡슐화 : 프로젝트가 큰 경우 반복적 인 노동을 피하기 위해 데이터베이스 액세스 및 객체 매핑을 캡슐화하는 것이 가장 좋습니다.

요약

FetchObject를 사용하는 것이 매우 편리하지만 올바른 데이터 유형을 보장하기 위해 일반적으로 클래스를 직접 정의하거나 수동 변환과 협력하거나 매핑 함수를 사용하는 것이 좋습니다. 이로 인해 코드가 더욱 강력 해지고 후속 디버깅 문제를 줄일 수 있습니다.

자세한 PDO 사용 및 객체 매핑을 알고 싶다면 https://gitbox.net/docs/pdo-tutorial을 참조하십시오.