毎日の開発では、データベースをページングして結果をオブジェクトとして返す必要性に遭遇することがよくあります。 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を使用して1つずつ取得する必要があります。
MVCフレームワークまたはバックエンド管理システムを構築している場合、この方法によりコードがより簡潔に保守可能になります。