現在、ECサイトの作成をしております。ユーザーごとに購入履歴を表示する履歴ページにてページング機能を実装したいのですがうまくいきません。
下記コードだと1ページあたり10件になりますが、各ページにて履歴内容が重複してしまいます。
(1ページ目(21-12件)、2ページ目(20-11件)のような表示になっている。
1ページ目(21-12件)、2ページ目(11-2件)にしたい)
関数部分
php
1// 履歴テーブルから取得 2function get_history($dbh, $user_id) { 3 try { 4 // SQL生成 5 $sql = 'SELECT sake_master.sake_id, 6 sake_master.name, 7 sake_master.price, 8 sake_master.img, 9 users_history.user_id, 10 users_history.amount, 11 users_history.buy_datetime 12 FROM sake_master 13 INNER JOIN users_history 14 ON sake_master.sake_id = users_history.sake_id 15 WHERE users_history.user_id = :user_id 16 ORDER BY buy_datetime DESC 17 LIMIT :start, :limit'; 18 // SQL文を実行する準備 19 $stmt = $dbh->prepare($sql); 20 $stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT); 21 $stmt->bindParam(':start', getCurrentPage(), PDO::PARAM_INT); 22 $stmt->bindValue(':limit', 10, PDO::PARAM_INT); 23 // SQLを実行 24 $stmt->execute(); 25 // レコードの取得 26 $rows = $stmt->fetchAll(); 27} catch (PDOException $e) { 28 throw $e; 29 } 30 return $rows; 31} 32 33// 履歴テーブルの件数を取得 34function get_historyCount($dbh, $user_id) { 35 try { 36 // SQL生成 37 $sql = 'SELECT COUNT(*) 38 FROM users_history 39 WHERE user_id = :user_id'; 40 // SQL文を実行する準備 41 $stmt = $dbh->prepare($sql); 42 $stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT); 43 // SQLを実行 44 $stmt->execute(); 45 // レコードの取得 46 $count = $stmt->fetchColumn(); 47 } catch (PDOException $e) { 48 throw $e; 49 } 50 return $count; 51} 52 53// 現在のページ番号を取得する 54function getCurrentPage() { 55 return (int) filter_input(INPUT_GET, 'page'); 56} 57 58function pagination($count) { 59 $limit = 10; 60 61 //レコード総数がゼロのときは何も出力しない 62 if (0 === $count) { 63 return ''; 64 } 65 66 //現在表示中のページ番号(ゼロスタート) 67 $intCurrentPage = getCurrentPage(); 68 69 //ページの最大数 70 $intMaxpage = ceil($count / $limit); 71 72 //現在ページの前後3ページを出力 73 $intStartpage = (2 < $intCurrentPage) ? $intCurrentPage - 3 : 0; 74 var_dump($intCurrentPage); 75 $intEndpage = (($intStartpage + 7) < $intMaxpage) ? $intStartpage + 7 : $intMaxpage; 76 var_dump($count); 77 78 //url組み立て 79 $urlparams = filter_input_array(INPUT_GET); 80 81 $items = array(); 82 83 //最初 84 $urlparams['page'] = 0; 85 $items[] = sprintf('<span><a href="?%s">%s</a></span>' 86 , http_build_query($urlparams) 87 , '最初' 88 ); 89 90 //表示中のページが先頭ではない時 91 if (0 < $intCurrentPage) { 92 $urlparams['page'] = $intCurrentPage - 1; 93 $items[] = sprintf('<span><a href="?%s">%s</a></span>' 94 , http_build_query($urlparams) 95 , '前へ' 96 ); 97 } 98 99 for ($i = $intStartpage; $i < $intEndpage; $i++) { 100 $urlparams['page'] = $i; 101 $items[] = sprintf('<span%s><a href="?%s">%s</a></span>' 102 , ($intCurrentPage == $i) ? ' class="current"' : '' 103 , http_build_query($urlparams) 104 , $i + 1 105 ); 106 } 107 108 //表示中のページが最後ではない時 109 if ($intCurrentPage < $intMaxpage) { 110 $urlparams['page'] = $intCurrentPage + 1; 111 $items[] = sprintf('<span><a href="?%s">%s</a></span>' 112 , http_build_query($urlparams) 113 , '次へ' 114 ); 115 } 116 117 //最後 118 $urlparams['page'] = $intMaxpage - 1; 119 $items[] = sprintf('<span><a href="?%s">%s</a></span>' 120 , http_build_query($urlparams) 121 , '最後' 122 ); 123 124 return sprintf('<div class="pagination">%s</div>', implode(PHP_EOL, $items)); 125} 126
表示部分
html
1<?php foreach($rows as $value) { ?> 2 <?php if (count($rows) !== 0) { ?> 3 <div class="layout"> 4 <div class="i"> 5 <img src="<?php print $img_dir . $value['img']; ?>" class="itemlist"> 6 </div> 7 <div class="n"> 8 <div class="nameprice"> 9 <p class="list"><?php print $value['name']; ?></p> 10 <p class="list">価格¥<?php print $value['price']; ?></p> 11 </div> 12 <p class="list">数量<?php print $value['amount']; ?>個</p> 13 <p class="history">購入日<?php print $value['buy_datetime']; ?></p> 14 </div> 15 </div> 16 <?php } ?> 17 <?php } ?> 18 </div> 19 <?php print pagination($count); ?>
https://qiita.com/ShibuyaKosuke/items/0c5c6df1fac218fbca38
こちらのサイトを参考にさせて頂きましたが、全体的にあまり理解できておりません。
ご教示頂ければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/15 00:06