PDO는 데이터베이스 개발에 PHP를 사용할 때 매우 인기있는 데이터베이스 추상화 계층 인터페이스입니다. pdostatement :: FetchObject 메소드를 사용하면 결과를 가져올 때 데이터 데이터를 클래스 인스턴스에 직접 매핑 할 수 있습니다. 이것은 일반적으로 단일 테이블에서 쿼리 할 때 매우 매끄럽지 만 다중 테이블 조인트 검색 (조인 쿼리)과 관련하여 종종 두통이 발생합니다. 아래에서는 이러한 일반적인 오류와 해당 솔루션을 자세히 분석합니다.
문제 설명 :
여러 테이블을 검색 할 때 이름이 같은 필드가 다른 테이블에 존재할 수 있습니다 (예 : ID , Name ). FetchObject를 사용하는 경우, 구별이 없으면 결과에서 이러한 필드의 값이 덮어 쓰여서 데이터의 불완전하거나 오류가 발생합니다.
샘플 코드 :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$sql = "SELECT users.id, users.name, orders.id, orders.amount FROM users
INNER JOIN orders ON users.id = orders.user_id";
$stmt = $pdo->query($sql);
while ($obj = $stmt->fetchObject()) {
var_dump($obj);
}
?>
문제 표현 :
여기서 users.id 및 orders.id는 충돌이 발생하여 ID 필드가 끝나면 끝에 테이블 중 하나의 값 만 저장됩니다.
해결책:
필드 별명을 사용하여 쿼리 시점을 구별하십시오.
수정 된 버전 코드 :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$sql = "SELECT users.id AS user_id, users.name AS user_name,
orders.id AS order_id, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id";
$stmt = $pdo->query($sql);
while ($obj = $stmt->fetchObject()) {
echo "사용자ID: {$obj->user_id}, 사용자名: {$obj->user_name}, 주문하다ID: {$obj->order_id}, 양: {$obj->amount}<br>";
}
?>
필드에 대한 다른 별칭을 설정하면 속성 덮어 쓰기를 피할 수 있습니다.
문제 설명 :
FetchObject는 클래스 이름 매개 변수를 전달하고 데이터를이 클래스의 인스턴스에 직접 매핑하는 것을 지원합니다. 그러나 클래스 속성이 쿼리 결과의 필드 이름과 일치하지 않으면 매핑이 성공하지 않아 일부 속성이 NULL이 됩니다.
샘플 클래스 및 쿼리 :
<?php
class UserOrder {
public $user_id;
public $user_name;
public $order_id;
public $amount;
}
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$sql = "SELECT users.id AS user_id, users.name AS user_name,
orders.id AS order_id, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id";
$stmt = $pdo->query($sql);
while ($order = $stmt->fetchObject('UserOrder')) {
var_dump($order);
}
?>
참고 :
클래스의 속성 이름은 발견 된 필드 이름과 일치해야합니다.
PHP는 사례에 민감하며 데이터베이스 필드 이름 및 클래스 속성 사례가 일치하지 않으면 할당 실패를 유발할 수도 있습니다.
문제 설명 :
사용자가 여러 주문이 있으면 공동 검사 중에 여러 레코드가 반환됩니다. FetchObject를 직접 사용하여 하나씩 이동하면 데이터의 분류 및 정렬을 쉽게 무시할 수 있습니다.
해결책:
비즈니스 요구에 따르면 먼저 필요한 중첩 구조로 그룹화하거나 수동으로 구성해야합니다.
Brief example:
<?php
$orders = [];
while ($row = $stmt->fetchObject('UserOrder')) {
$userId = $row->user_id;
if (!isset($orders[$userId])) {
$orders[$userId] = [
'user_name' => $row->user_name,
'orders' => [],
];
}
$orders[$userId]['orders'][] = [
'order_id' => $row->order_id,
'amount' => $row->amount,
];
}
?>
이를 통해 동일한 사용자의 여러 주문을 함께 정렬 할 수 있으므로 이후에 처리하거나 출력 할 수 있습니다.
실제 개발에서는 데이터베이스에 연결하고 예외를 처리 할 때 완전한 연결 문자열을 사용하는 것이 좋습니다. 예를 들어:
<?php
try {
$pdo = new PDO('mysql:host=gitbox.net;dbname=testdb;charset=utf8mb4', 'user', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
} catch (PDOException $e) {
echo "연결이 실패했습니다: " . $e->getMessage();
}
?>
여기서 도메인 이름을 Gitbox.net 으로 대체하여 요구 사항을 충족했습니다.
다중 테이블 조인트 검색 결과를 처리하기 위해 pdostatement :: fetchObject를 사용할 때 다음과 같은 점에주의를 기울여야합니다.
현장 충돌 시점을 구별하기 위해 별칭을 사용하십시오 .
클래스 속성은 쿼리 필드 이름에 정확히 일치해야합니다 .
다중 관련 데이터의 구조화 된 처리 .
예외 처리 및 연결 보안에주의하십시오 .
이 세부 사항에주의를 기울이고 FetchObject를 사용하여 코드를보다 우아하고 읽을 수 있도록하십시오.