データベースで“前の?件”をつくるには?

[上に] [前に] [次に]
ミワ [E-Mail] 2000/03/09(木) 13:04:10
CGIでデータベースを作ろうと思い、いろいろサンプルを探していて
レスキューさんのところの“簡易データベース”というものを見つけました。
でも、このサンプルには“前の?件を表示”というのがありません。

そもそも、いろんなサーチエンジンにある同様のボタンはどのようなアルゴリズム?で
動いているんでしょうか?(2ページ分検索してそれぞれをわたしてるの??)

お分かりになる方、ご教授お願いします。

瀬良 [E-Mail] 2000/03/09(木) 14:41:48
データベース内のデータに index として利用する要素があるとします。
記事でいうところの「記事番号」とかです。
それを用い、「記事番号○番からX件を表示」とかする方法があります。

たとえば 1 HTML あたり 15 件づつ表示しているとしましょう。
現在 91 番から 105 番を見ているとします。

番号の若い 15件を表示→86番から15件
番号の多い 15件を表示→106番から15件

なんていう風にできるはずです。

これはあくまで方法の 1 つなので、
各検索エンジンがどのような仕組みでか・・は知りません。

瀬良 [E-Mail] 2000/03/09(木) 14:43:01
>番号の若い 15件を表示→86番から15件
番号の若い 15件を表示→76番から15件

の間違いでした。

びーだま [E-Mail] 2000/03/09(木) 15:08:44
レスキューさんの“簡易データベース”をつかったことはないんですが、
いま見にいって、ソースだけのぞかせてもらいました。
実際に動かしていないんですが、ちょっと見てわかった範囲でできそうな
即席対応案です。

print "<h3>↓<a href=\"search.cgi?$buf&FF=$next_num\">次の$page件</a></h3>\n";

の周辺ににちょっと工夫をしてあげるだけで、なんとなくうまく行きそう
です。実際にうまくゆくかどうかは、動かしてみないとわからないですが、
動かすのは面倒くさいので、(^^;

動作確認もしていないので、誤動作したら、ごめんなさい。
変更をするまえに、オリジナルを取っておいてね。

$prev_num = $next_num - ($page * 2);
if ($prev_num < 0) {
$prev_page = $page + $prev_num;
$prev_num = 0;
}

if ($prev_page > 0) {
print "↑<a href=\"search.cgi?$buf&FF=$prev_num\">前の$prev_page件</a><BR>\n";
}

print "↓<a href=\"search.cgi?$buf&FF=$next_num\">次の$page件</a>\n";

こんな感じで、どうでしょうね?

考え方は search.cgi に対してスタート点 FF を与えてやれば、あと
はプロクラムが対応してくれるみたいでしたので、スタート点の定義
をどう与えてやるかだけで、あとはプログラム任せでどうにかなるん
だろうな。と思いました。

というわけで、

前の○○件のスタート点は、次のページのスタート点から、次に表示
される件数と、いま表示されている件数を足したもの、つまり、プロ
グラム内では、$page を2つ掛けた数字を次のページとして既にわかっ
ているスタート点から、引いたところになります。

つぎに、前のスタート点がマイナスになってしまうと良くなさそうなの
で、その場合は、0 にしてあげなくてはならないのですが、この場合は、
前にあと何件あるかということも変更しなくれはなりませんから、これ
をあらかじめわかっている表示するべき、件数から、計算上のスタート
点を引きます。すなわち、マイナスになる場合にこれを考えるわけです
から、実際には、マイナス値を足します。要するに実質引き算です。

で、あとは親切に、前の0件なんてのは変ですから、1件もないなら
「前の○○件」は表示する必要がありません。

ミワ [E-Mail] 2000/03/09(木) 15:12:12
瀬良さん、ご教授ありがとうございます。

>たとえば 1 HTML あたり 15 件づつ表示しているとしましょう。
>現在 91 番から 105 番を見ているとします。
>番号の若い 15件を表示→86番から15件
>番号の多い 15件を表示→106番から15件
>なんていう風にできるはずです。

たしかにそうなんですが、データベースの場合だと検索があるので、
15件づつ表示で、“あ”を含む項目を表示するとした場合などは、
順番どうりいかないですよね?
(106〜120番に“あ”を含む項目が15件分ないかもしれないから)

そこが問題なんですよね。う〜ん。
何かいい方法ないですかね?

ミワ [E-Mail] 2000/03/09(木) 15:39:31
びーだまさん、ご教授ありがとうございます。

レスキューさんのサンプルの$FFは、“あ”を含む項目を15件づつ表示する場合、

データ1から順番に“あ”を含む項目を検索して、ヒットした数が15件になった時の
データ番号(データ$FF)というような値だと思われます。($pageは、表示件数)
#こんな感じ 1、2、・・・・・・・・・$FF(15とは限らない)

なので、単純に$pageを引いた値をわたしても、検索条件が15件に満たない場合も
でてきますよね??

う〜む、ムズカシイ。

瀬良 2000/03/09(木) 16:05:07
検索関連のことを書きませんでした。すいません。
「あ」で検索し、ひっかかるのをリストアップします。(配列に格納します)
そしてそのリストから15件づつ拾えばいいかと思います。

追伸:ミワさんは、いろんなサーチエンジンのプログラムについて知りたいのでしょうか?
それとも自分でそういう機能のある検索プログラムをつくりたいのでしょうか?

瀬良 2000/03/09(木) 16:06:06
すいません(^-^;)「CGIでデータベースを作ろう」と書いてありましたね・・
ほんとすいません・・とほほ・・

[上に] [前に] [次に]