現在の位置: ホーム> 最新記事一覧> pdostatement :: fetchObjectを使用して、ページネーションクエリのオブジェクトデータを取得します

pdostatement :: fetchObjectを使用して、ページネーションクエリのオブジェクトデータを取得します

gitbox 2025-05-12

毎日の開発では、データベースをページングして結果をオブジェクトとして返す必要性に遭遇することがよくあります。 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を使用してオブジェクトのリストを取得します

次に、結果を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を使用して1つずつ取得する必要があります。

MVCフレームワークまたはバックエンド管理システムを構築している場合、この方法によりコードがより簡潔に保守可能になります。