dポイントプレゼントキャンペーン実施中!

データベース初心者で申し訳ないのですが、質問失礼いたします。

googleのような検索結果ページで、検索結果を3件ずつ表示し、改ページ(?)をさせたいと思っております。

【web表示例】
1ページ目

3件表示/20件中表示
+------+------+---+
| name | anime | age |
+------+------+---+
| サザエ | サザエさん | 24 |
| マスオ | サザエさん | 29 |
| タラオ | サザエさん | 3 |
+------+------+---+

1234567 //ページ数へのリンクですが、現在表示されている「1」にはリンクをさせません


※あらかじめLIMITで1~3件、4~6件を表示させるというページを作っているやり方でなく、
 検索結果を自動で1ページ、2ページと振り分けてくれるものと考えています。


現在作成しておりますPHP部を、抽出条件など省いてはおりますが下記に表記させていただきました。

<?php
//データベース接続
省略・・・
//検索ワードを取得
$keyword = $_POST['keyword'];

$sql = "SELECT * FROM TABLE1 WHERE '%".$keyword."%' ORDER BY age ";
$result = executeQuery($sql);

//結果セットの行数を取得する
$rows = mysql_num_rows($result);

if($rows){
while($row = mysql_fetch_array($result)) {
$tempHtml .= "<tr>";
$tempHtml .= "<td>".$row["name"]."</td><td>".$row["anime"]."</td><td>".$row["age"]."</td>";
$tempHtml .= "</tr>\n";
}
$msg = $rows."件のデータがあります。";
}else{
$msg = "データがありません。";
}

mysql_free_result($result);

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title></title>
</head>
<body>

<?= $msg ?>
<table>
<?= $tempHtml ?>
</table>

</body>
</html>



他HTMLで検索したあと、上記1ページで検索結果を表示しています。

○件ずつ表示・・・というのは、難しいと調べている時にありましたが、
もっと理解してからでないととは思ったのですが必要となり自分なりに調べて試したものだけでは解決にならず質問の方させていただきました。
が、やはり初心者には難しいでしょうか??

ちなみに、調べていて「CGIで・・・」というものも多かったのですが、
検索ページがPHP+MySQLで作られているので、同じものでと考えています。
今使用しているものがPHP+MySQLなので、こちらでできればと思っております。


何卒宜しくお願い致します。

A 回答 (2件)

> 各ページを作って次のページへのリンクを手作業で貼っていくみたいなのがあって、まさか全ページ分作るわけにもいかないので、PHPなら全件数を取得して1ページだけ作れば http://~?page=3 と、各ページが作れるのかなと思っておりまして



さすがにそんなことはしませんね。
# データの件数って変わるもんですし。

パラメータから offset 値を作れればいいので、直接offset値を渡してもいいですし、
ページ番号から生成してもいいと思います。

考え方は同じですのでやってみてください。
    • good
    • 0
この回答へのお礼

offset値がまだ使いこなせていませんが、丁寧なご回答をいただき、かなり理解が深まったと思います!!(自分の中でですが)
ありがとうございました!!

お礼日時:2011/03/07 16:19

> ※あらかじめLIMITで1~3件、4~6件を表示させるというページを作っているやり方でなく、


> 検索結果を自動で1ページ、2ページと振り分けてくれるものと考えています。

ここが、どういう意味なのかちょっと解らないのですが、普通に LIMIT(, とOFFSET)で作ってますね。

例えば 10 件のデータをページングする場合

1頁目: 1 ~ 3件目表示
2頁目: 4 ~ 6件目表示
3頁目: 7 ~ 9件目表示
4頁目: 10件目表示

と全部で4頁になりますよね。で、それぞれの頁で発行するSQLは

1頁目: SELECT * FROM TABLE1 WHERE anime LIKE '%検索語%' ORDER BY age LIMIT 0, 3;
2頁目: SELECT * FROM TABLE1 WHERE anime LIKE '%検索語%' ORDER BY age LIMIT 3, 3;
3頁目: SELECT * FROM TABLE1 WHERE anime LIKE '%検索語%' ORDER BY age LIMIT 6, 3;
4頁目: SELECT * FROM TABLE1 WHERE anime LIKE '%検索語%' ORDER BY age LIMIT 9, 3;


となりますよね、変わっているのは頁数と、LIMITの最初の数値(offset)ですね。
つまり頁のリンクに対して、offset値をパラメータで渡せば動的につくることができます。
(ページング時に同じ検索をしなければならないので、なんらかの方法で検索語を保持する必要もあります)

頁数は (データ件数 / 表示数) で割り切れなければ + 1です。
この場合は ( 10 / 3 ) + 1 = 4頁(検索条件がない場合)

mysql_num_rows は検索結果のレコード数を返しますが、上記SQLの場合は常に 3以下になってしまうので、別途SQLを投げる必要がありますね。
(MySQLではそうしない方法もあるのですが、まずは基本でしょうね)
これは普通に SELECT COUNT(*) ~ でもいいでしょう

SQLを2発投げることに抵抗があるかもしれませんが、1発で全件取得しても、1頁に10件表示としたら、1000件のデータがあったら 990件無駄になってしまいます。こちらの方が一定したコストなのでまだコントロールしやすいですね。

このロジックでプログラムをしていけば作れると思います。
ソースをカスタマイズしてみたのですが、文字数の都合で貼りつけできなかったので、考え方だけ回答します。

他にも方法はありますが、
- 1頁に表示する件数
- 全体の件数
- 頁数
- offset値
これらの要素で一緒かなと思います。

この回答への補足

>> 検索結果を自動で1ページ、2ページと振り分けてくれるものと考えています。
>ここが、どういう意味なのかちょっと解らないのですが、普通に LIMIT(, と
>OFFSET)で作ってますね。

すみません、
1ページ LIMIT 0, 3;
2ページ LIMIT 3, 3;
3ページ・・・・

と、各ページを作って次のページへのリンクを手作業で貼っていくみたいなのがあって、まさか全ページ分作るわけにもいかないので、PHPなら全件数を取得して1ページだけ作れば http://~?page=3 と、各ページが作れるのかなと思っておりまして
(すみません、ちょっと言葉にしづらいようですっ)
伝わりにくくて申し訳ございませんっ!!

ご回答を元に頑張ってみます!!

補足日時:2011/03/05 00:51
    • good
    • 0
この回答へのお礼

ありがとうございました!!

お礼日時:2011/03/07 16:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!