電子書籍の厳選無料作品が豊富!

私はPHPの初心者ですが、ステップアップを兼ねてサイト内検索を作ろうかと思っています。
今回こちらのサイト様(​http://affiliate.aki-f.com/prog/cat/cat9.html​)を参考にさせて頂きました。

・絞込み検索(and検索)
・1ページを10件表示に制限する

上記のサンプルプログラムを組み合わせてみたのですが
表示結果に問題があり、なんとか修正できないかと思い投稿させて頂きました。

------------------------表示結果------------------------
2件見つかりました。全2件 | 次の10件
・JavaScriptハッカーズ・プログラミング
・コピーするだけですぐに使えるJavaScript
・<空白>
・<空白>
・<空白>
・<空白>
・<空白>
・<空白>
・<空白>
・<空白>
--------------------------------------------------------

2件表示のはずが、10件表示されてしまいます。
さらに、2件しか該当していないに「次の10件」まで表示されてしまいます。

なんとか、検索結果に基づいた表示にしたいのですが
どなたか知恵を貸していただければと思います。

宜しくお願い致します。


--------------------------ソース-------------------------
if($_GET["key"]==""){
print"キーワードを入力してください";
}else{
$KeyWord=$_GET["key"];
$KeyWord=htmlspecialchars($KeyWord);
$KeyWord=mb_convert_encoding($KeyWord,"EUC-JP","auto");
$KeyWord=mb_convert_kana($KeyWord,s);
$ArrKeyword=explode(" ",$KeyWord);

$Result=array();
$Data=file("item.csv");
for($i=0;$i<sizeof($Data);$i++){
$lines=strip_tags($Data[$i]);
$Match=true;
for($n=0;$n<sizeof($ArrKeyword);$n++){
if(!eregi($ArrKeyword[$n],$lines)){
$Match=false;
break;
}
}
if($Match==true){
array_push($Result,$Data[$i]);
}
}
?>

<?php
$n=sizeof($Result);
if($n==0){
print"見つかりませんでした";
}else{
print"{$n}件見つかりました";
?>

<?php
$P=$_GET["p"];
if($P>0){
$Prev=$P-1;
$PrevPage="<a href='allitem.php?p={$Prev}'>前の10件</a>";
}
$Size=sizeof($Result);
if($Size/10-1>$P){
$Next=$P+1;
$NextPage="<a href='allitem.php?p={$Next}'>次の10件</a>";
}
?>
全<?=$Size?>件 | <?=$PrevPage?> <?=$NextPage?>
<ul>
<?php
for($i=$P*10;$i<$P*10+10;$i++){
$line=explode(",",$Result[$i]);
$ID=$line[0];
$Title=strip_tags($line[3]);
print"<li><a href='item.php?id={$ID}'>{$Title}</a></li>";
}
?>
<?php
}
}
?>
</ul>
----------------------------------------------------------

A 回答 (2件)

こんにちは。

#1です。
さて お礼のコメントありがとうございました。

>「次の10件」の問題は、頭では理解しているつもりなのですがプログラムの具体的な修>正までたどり着けませんでした。。。

大丈夫大丈夫、もう一息ですって(笑)。

「次の10件」の表示の考え方…下に記載するのは
ひとつの例ですが…

まず

・その件数をすべて表示するには、何ページ必要か(A)
・現在表示されているページ数は何ページ目か(B)

を考えると、「次の10件」が表示されていいのは

   A>B

の時だけですね。A<B は そもそもあり得ないし、
A=Bなら最後のページということになりますからね。

そしてAは、

全件数($Size) A
--------------------------
 0~10 のとき  1
11~20      2
21~30      3


になるように、$Sizeを使って表現する。

Bは、$Pより1大きいだけですね。

これを、if 文の条件式に入れてやれば、うまく
動作すると思います。

もし追加でご質問等ありましたら、お気軽にどうぞ。
    • good
    • 0
この回答へのお礼

時間がかかってしまって誠に申し訳ありません。
アドバイスを元に試行錯誤しまして無事解決いたしました。

この度は本当に助かりました。

お礼日時:2008/07/03 17:19

こんにちは。


まず、

$Size = 表示すべきデータの総件数
$P  = 現在の表示ページ数(0=1ページ目)

という解釈でよろしいでしょうか?


まず「次の10件」という文字が表示される条件を考えてみると、

表示すべきデータの総件数が、$P*10+10、つまり現在ページの
最終行に表示されるべき「番目数(表示対象となるデータの
何番めにあたるか)」よりも大きい必要がありますね。
たとえば、総件数が22件で、現在のページ数が2($Pの値は1)
だったら、表示すべきですね。逆に、総件数が2件で、現在のページ
数が1($Pの値は0)ならば、「次のページ」がないのですから、
表示してはダメということになりますね。


次に、10件表示されてしまうケース。

ソース終わりのほうの
--------------------------------------
for($i=$P*10;$i<$P*10+10;$i++){
--------------------------------------
ですが、これだと $P の値がいくつであっても、無条件に10回
処理されてしまうことになりますね。
ですので、

「$i」の値が $Sizeを超えるようであれば そこで終了してループを抜ける

というようにプログラムすることが必要でしょう。

いちおう考え方だけカンタンに示してみました。追加でご質問あれば、気軽にどうぞ。
    • good
    • 0
この回答へのお礼

アドバイスを元にプログラムを修正致しましたら、10件表示される問題は解消いたしました。

有難う御座いました。

「次の10件」の問題は、頭では理解しているつもりなのですがプログラムの具体的な修正までたどり着けませんでした。。。

お礼日時:2008/06/17 10:20

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