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

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

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

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

Q&A

解決済

4回答

5696閲覧

データベースのレコード抽出を10件ずつページ区切りにする。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2016/04/14 06:52

以下の様なコーディングをしたのですが
ここから、10レコード区切りでページ分けしていきたいのですが
どうしてもうまくいきません。
どうすればページ区切りが可能になるのでしょうか。
お知恵をお借りできれば幸いです。

<?php class db{ //接続情報 function dbinfo(){ $conn = array( 'db' => "mysql:dbname=crane_test;host=localhost", 'usr' => "root", 'pass' => "" ); return($conn); } //データ抽出処理 function select(){ //接続情報読み込み $conn = $this::dbinfo(); try{ //PDOオブジェクト生成 $pdo = new pdo($conn['db'],$conn['usr'],$conn['pass']); $sql = 'select * from manetest_table where id between 1 and 20'; //Query発行 foreach ($pdo->query($sql) as $key) { echo'<tr>'; print('<td>'.$key['id'].'</td>'); print('<td>'.$key['test1'].'</td>'); print('<td>'.$key['test2'].'</td>'); print('<td>'.$key['test3'].'</td>'); print('<td>'.$key['test4'].'</td>'); print('<td>'.$key['test5'].'</td>'); print('<td>'.$key['test6'].'</td>'); print('<td>'.$key['test7'].'</td>'); print('<td>'.$key['test8'].'</td>'); print('<td>'.$key['test9'].'</td>'); print('<td>'.$key['test10'].'</td>'); echo'</tr>'; } echo'<a href="index.php">前へ</a>'; echo'<a href="index.php">次へ</a>'; }catch(PDOException $e){ die('DB接続エラー'. $e->getMessage()); return false; } //pdo接続解除 $pdo = null; } } ?>

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

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

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

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

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

guest

回答4

0

これは丸投げに近いですね。

まず $page で現在ページをどこかから持ってくる必要があります。
また、1ページに何個のアイテムを含めるか、も重要です。($rowsとします)

$page, $rows があると仮定すると

select * from table offset ($page - 1 ) * $rows limit $rows

のSQLで指定ページ部分を取得できます。

offset は どこから取得するか
limit はいくつまで取得するか、です。

投稿2016/04/14 06:56

編集2016/04/14 10:53
sokha

総合スコア216

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

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

mpyw

2016/04/14 10:13

betweenによる絞り込みとlimit+offsetによる絞り込みが矛盾しているように思います…(前者は不要?)
sokha

2016/04/14 10:54

おっと、そのとおりですね。修正いたしました。 下の方が言われているとおり、betweenでいけるならそれがいいかもしれません。 index忘れずに。
guest

0

ベストアンサー

  • 主キー以外でソートしたい
  • 絞り込み後の全体件数を取得したい
  • 全体レコード数が最大で30000件程度であって,速度をそれほど気にする必要がない
  • 全体件数は多いが,それほど奥までページネーションを行うことがない

これらに該当する場合を除き,LIMIT+OFFSETは速度低下を招くので,進んで使うべきものではありません.この調整は以下のどちらかにしたほうが望ましいです.

  • 開始IDと終了IDを指定する
  • 開始IDとLIMITを指定する

このようにした方が計算コストが n / log_2(n) 倍軽く,これはオフセットnが大きくなるにつれて差が顕著になります.全体が100万件で最終ページを取得しようとした場合,理論上は約50000倍の速度差があります.

OFFSETを使わない高速なページネーションの実現

「ページ番号」を受け取るのではなく,「左端または右端のID」を受け取るようにしましょう.
(この記事ではサンプル紹介していませんが,今回はidが連続なのでページ番号からBETWEENの両端のidを得ることも一応可能です.WHERE句による絞り込みが一切使えなくなる縛りがつき,拡張性が大きく落ちるのであまりおすすめはできませんが…)

投稿2016/04/14 08:27

編集2016/04/14 10:30
mpyw

総合スコア5223

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

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

0

limit 10,10 のようにして1ページの上限件数とそのページの開始位置を指定するのはダメですか?
(limit 開始位置,行数)

php

1// $pageに表示したいページ数(1~)が入っていると仮定して 2$beg = 10 * ($page - 1); 3$sql = "select * from manetest_table where id between 1 and 20 limit $beg,10;"; 4

投稿2016/04/14 08:07

HiroshiWatanabe

総合スコア2160

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

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

0

php

1 foreach ($pdo->query($sql) as $key) { 2 echo'<tr>'; 3 print('<td>'.$key['id'].'</td>'); 4 print('<td>'.$key['test1'].'</td>'); 5 print('<td>'.$key['test2'].'</td>'); 6 print('<td>'.$key['test3'].'</td>'); 7 print('<td>'.$key['test4'].'</td>'); 8 print('<td>'.$key['test5'].'</td>'); 9 print('<td>'.$key['test6'].'</td>'); 10 print('<td>'.$key['test7'].'</td>'); 11 print('<td>'.$key['test8'].'</td>'); 12 print('<td>'.$key['test9'].'</td>'); 13 print('<td>'.$key['test10'].'</td>'); 14 echo'</tr>'; 15 }

php

1while ($key= $sql ->fetch(PDO::FETCH_ASSOC)) { 2 echo'<tr>'; 3 print('<td>'.$key['id'].'</td>'); 4 print('<td>'.$key['test1'].'</td>'); 5 print('<td>'.$key['test2'].'</td>'); 6 print('<td>'.$key['test3'].'</td>'); 7 print('<td>'.$key['test4'].'</td>'); 8 print('<td>'.$key['test5'].'</td>'); 9 print('<td>'.$key['test6'].'</td>'); 10 print('<td>'.$key['test7'].'</td>'); 11 print('<td>'.$key['test8'].'</td>'); 12 print('<td>'.$key['test9'].'</td>'); 13 print('<td>'.$key['test10'].'</td>'); 14 echo'</tr>'; 15 } 16 17}

として見て下さい

投稿2016/04/14 07:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/04/14 07:05 編集

このままだと全部吐き出されてしまいますけどね^^; とんちんかんで すみませんm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問