質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

851閲覧

php sql ページング機能 取得内容が重複してしまう

h_r

総合スコア18

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/10/14 16:03

現在、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
こちらのサイトを参考にさせて頂きましたが、全体的にあまり理解できておりません。
ご教示頂ければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ざっくり直すだけなら、
$stmt->bindParam(':start', getCurrentPage(), PDO::PARAM_INT);

PHP

1$start = getCurrentPage() * 10; 2$stmt->bindParam(':start', $start, PDO::PARAM_INT);

みたいな感じすればOKなはず。

理由はLIMIT句の文法(参考)と今のコードのstartがどうなっているかを確認して見比べればわかると思います。


参考にしているサンプルの方では
$start = getCurrentPage() * $limit;
という感じでもう少し使いやすくなっているので、もう一度サンプルをじっくり読んで理解を試みることをお勧めします。

投稿2018/10/14 16:51

編集2018/10/14 17:05
tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_r

2018/10/15 00:06

ご回答ありがとうございます。取り急ぎ、ご指摘頂いた内容に変更したところ上手くいきましたのでベストアンサーにさせて頂きます。理由がなぜかは、またゆっくり時間のあるときに確認します。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問