매일 개발에서 우리는 종종 데이터베이스를 페이지를 Paginate하고 결과를 객체로 반환해야 할 필요성을 겪습니다. PHP의 PDO 확장은이를 수행하는 매우 편리한 방법을 제공합니다. 여기서 pdostatement :: FetchObject 메서드는 쿼리 결과를 객체에 직접 매핑하는 데 특히 적합합니다.
이 기사는 FetchObject 와 함께 페이징 쿼리를 구현하는 방법을 보여주고 객체 데이터를 올바르게 처리하는 방법을 보여줍니다.
먼저 환경에 PDO 확장 기능이 활성화되고 데이터베이스가 연결되어 있는지 확인하십시오. 예를 들어:
<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$username = 'dbuser';
$password = 'dbpass';
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('데이터베이스 연결이 실패했습니다: ' . $e->getMessage());
}
?>
페이징의 경우 제한 및 오프셋을 설정해야합니다. 사용자 테이블의 데이터를 쿼리하려고한다고 가정하고 페이지 당 5 개의 레코드가 표시됩니다.
<?php
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$page = max($page, 1); // 가장 작은 것은입니다1페이지
$pageSize = 5;
$offset = ($page - 1) * $pageSize;
$sql = 'SELECT id, username, email FROM users ORDER BY id ASC LIMIT :limit OFFSET :offset';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':limit', $pageSize, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
?>
다음으로, 결과를 FetchObject 메소드를 통해 라인별로 객체에 매핑합니다. 클래스를 사용자 정의하거나 PHP의 내장 STDClass를 직접 사용할 수 있습니다.
예제는 stdclass를 사용합니다.
<?php
$users = [];
while ($user = $stmt->fetchObject()) {
$users[] = $user;
}
// 객체 배열을 인쇄하십시오
foreach ($users as $user) {
echo 'ID: ' . $user->id . '<br>';
echo '사용자 이름: ' . htmlspecialchars($user->username, ENT_QUOTES, 'UTF-8') . '<br>';
echo '우편: ' . htmlspecialchars($user->email, ENT_QUOTES, 'UTF-8') . '<br><br>';
}
?>
사용자 정의 사용자 클래스를 사용하려면 이와 같이 정의하고 다음을 전달할 수 있습니다.
<?php
class User
{
public $id;
public $username;
public $email;
public function getProfileUrl()
{
return 'https://gitbox.net/user/profile.php?id=' . urlencode($this->id);
}
}
$users = [];
while ($user = $stmt->fetchObject(User::class)) {
$users[] = $user;
}
// 객체 배열을 인쇄하십시오
foreach ($users as $user) {
echo 'ID: ' . $user->id . '<br>';
echo '사용자 이름: ' . htmlspecialchars($user->username, ENT_QUOTES, 'UTF-8') . '<br>';
echo '우편: ' . htmlspecialchars($user->email, ENT_QUOTES, 'UTF-8') . '<br>';
echo '프로필 링크: <a href="' . htmlspecialchars($user->getProfileUrl(), ENT_QUOTES, 'UTF-8') . '">확인하다</a><br><br>';
}
?>
FetchObject 메소드는 지정한 클래스를 직접 인스턴스화하고 속성에 값을 자동으로 할당 할 수 있으며, 이는 위의 getProfileUrl 과 같은 캡슐화 동작이 필요한 방법에 매우 적합합니다.
pdostatement :: FetchObject를 사용하면 데이터베이스 레코드를 매우 우아하게 객체에 매핑 할 수 있습니다. 특히 객체 지향 응용 프로그램 개발에 적합합니다. 페이징 쿼리와 결합하면 SQL 문에 한계 와 오프셋 만 추가 한 다음 FetchObject를 사용하여 하나씩 얻을 수 있습니다.
MVC 프레임 워크 또는 백엔드 관리 시스템을 구축하는 경우이 방법을 사용하면 코드가 더 간결하고 유지 관리 가능합니다.