検索プログラムの10件表示について

このQ&Aのポイント
  • PHPの初心者が、サイト内検索を作ろうとしています。
  • 絞り込み検索(AND検索)と1ページを10件表示に制限するプログラムを組み合わせています。
  • 表示結果に問題があり、どう修正すれば良いかわかりません。
回答を見る
  • ベストアンサー

検索プログラムの10件表示について

私は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> ----------------------------------------------------------

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • hkd9001
  • ベストアンサー率48% (99/204)
回答No.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 文の条件式に入れてやれば、うまく 動作すると思います。 もし追加でご質問等ありましたら、お気軽にどうぞ。

maxves
質問者

お礼

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

その他の回答 (1)

  • hkd9001
  • ベストアンサー率48% (99/204)
回答No.1

こんにちは。 まず、 $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を超えるようであれば そこで終了してループを抜ける というようにプログラムすることが必要でしょう。 いちおう考え方だけカンタンに示してみました。追加でご質問あれば、気軽にどうぞ。

maxves
質問者

お礼

アドバイスを元にプログラムを修正致しましたら、10件表示される問題は解消いたしました。 有難う御座いました。 「次の10件」の問題は、頭では理解しているつもりなのですがプログラムの具体的な修正までたどり着けませんでした。。。

関連するQ&A

  • CSVファイルの10件表示について

    PHP初心者です。 CSVデータを活用してサイトを作ろうとしているのですが、 フリーワードで検索すると下記のようなエラーが出てしまいます。 Fatal error: Allowed memory size of 52428800 bytes exhausted (tried to allocate 77287300 bytes) in レンタルサーバー(ロリポップ)に memory_limitについて問い合わせたところ、 消費メモリを削減して対処してほしいと言われました。 10件だけ表示するようにすれば解決するかと思い、 自分なりにあれこれいじってみたのですが、 うまくいきませんでした。 10件だけ表示する方法やメモリ消費を抑える方法を お分かりになる方がいらっしゃいましたら、 ぜひご教授お願いいたします。 -index.php-トップページ <form action="search.php" method="get"><input type="text" name="key" size="90"> <input type="submit" name="submit" value="検索"></form> -seach.php-検索結果表示ページ <?php if($_GET["key"]==""){ print"キーワードを入力してください"; }else{ $KeyWord=$_GET["key"]; $KeyWord=htmlspecialchars($KeyWord); $KeyWord=mb_convert_encoding($KeyWord,"Shift_JIS"); $KeyWord=mb_convert_kana($KeyWord,s); $ArrKeyword=explode(" ",$KeyWord); $Result=array(); $Data=file("item.csv"); for($i=0;$i<sizeof($Result);$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}件見つかりました"; ?> <ul> <?php for($i=0;$i<sizeof($Result);$i++){ $line=explode(",",$Result[$i]); ?> <li><a href="item.php?id=<?=$line[0]?>"><?=$line[3]?></a></li> <?php } } } ?> 下記の行がエラーのようです。 for($i=0;$i<sizeof($Result);$i++){

    • ベストアンサー
    • PHP
  • 検索時エラー

    はじめまして PHPを用いてsystem.csv内を検索するんですが、ある文字を入力すると Warning: eregi() [function.eregi]: REG_BADRPT と表示されてしまいます。 例えば: 藤、++ などです。 なぜでしょうか? またどのように修正してあげたらいいのでしょうか? よろしくお願いいたします。 <?php if($_GET["key"]==""){ print"キーワードを入力してくださいね"; }else{ $KeyWord=$_GET["key"]; $KeyWord=htmlspecialchars($KeyWord); $KeyWord=mb_convert_encoding($KeyWord,"EUC-JP","auto"); $Result=array(); $Data=file("system.csv"); for($i=0;$i<sizeof($Data);$i++){ $lines=strip_tags($Data[$i]); if(eregi($KeyWord,$lines,$text_b)){ array_push($Result,$Data[$i]); } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<sizeof($Result);$i++){ $line=explode(",",$Result[$i]); ?> <li><?=$line[2]?><a href="item.php?id=<?=$line[0]?>"><?=$line[1]?></a></li> <?php } } } ?>

    • 締切済み
    • PHP
  • CSVファイルの検索結果表示について

    CSVファイルを検索して検索結果を表示したいのですが、 検索結果を表示できません。 トップページ <form action="search.php" method="get"><input type="text" name="key" size="90"> <input type="submit" name="submit" value="検索"></form> 検索結果を表示するページ <?php $ArrKeywordLength = sizeof($ArrKeyword); $fp = fopen('data.csv', "r"); $Result=array(); while(!feof($fp)){ $ret = fgets($fp, 4096); $lines = strip_tags($ret); $Match=true; for($n=0; $n<$ArrKeywordLength;$n++){ if(!strpos($ArrKeyword[$n], $lines)){ $Match = false; break; } } if($Match === true){ $Result[] = $ret; } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<10;$i++){ $line=explode(",",$Result[$i]); ?> <li><a href="item.php?id=<?=$line[0]?>"><?=$line[1]?></a></li> <?php } } ?> </ul> 上記のプログラムを実行すると、以下のようになってしまいます。 ○件見つかりました ・ ・ ・ ・ ・ 私のやりたいことは、以下のようなCSVファイルがあったら ----------------------------------------------------- CSVファイル 1,あいうえお 2,かきくけこ 3,さしすせそ 4,たちつてと 5,なにぬねの ----------------------------------------------------- <li><a href="item.php?id=1">あいうえお</a></li> <li><a href="item.php?id=2">かきくけこ</a></li> <li><a href="item.php?id=3">さしすせそ</a></li> <li><a href="item.php?id=4">たちつてと</a></li> <li><a href="item.php?id=5">なにぬねの</a></li> のように出力したいのですが、 どのように改良すればよいのでしょうか? わかってる方からすれば笑われるようなことかもしれませんが、 PHP初心者なので、本を読みながらいろいろ試してみても、 全然うまくいかないので、どなたか教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP 1ページあたりの表示制限に関して

    <?php require_once('test/common.php'); $Data=file("test/item.csv"); $ID=$_GET[id"]; if($P>0){ $Prev=$ID-1; $PrevPage="<a href='index2.html?id={$Prev}'>前の10件</a>"; } $Size=sizeof($Data); if($Size/1-1>$ID){ $Next=$ID+1; $NextPage="<a href='index2.html?id={$Next}'>次の10件</a>"; } ?> 全<?=$Size?>件 | <?=$PrevPage?> <?=$NextPage?> 「次の10件」「前の10件」のところを文字じゃなく画像を用いたいのですが、<img src="img/next.png" width="100px" />を入れてみるとページがエラーになってしまいます。文字じゃなく画像を使うにはどのようにすればいいのですか? 教えてください。

    • 締切済み
    • PHP
  • 検索結果をgoogleのように数件ずつ表示

    データベース初心者で申し訳ないのですが、質問失礼いたします。 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なので、こちらでできればと思っております。 何卒宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 検索結果($_POST)が2ページ目以降は消える

    PHP+MySQLで分割ページを作っています。 検索結果のページを分割しているのですが、2ページ目以降に検索されたレコードが表示されません。 1).2ページ目以降に続きのレコード(下記では21件目以降)を表示させるには、どうすれば良いのでしょうか。 2).上記には関係ないのですが、「<?= $msg ?>」で検索結果の総数を表示したいのですが、「1」としか表示されません…ついでで良いので、ご指摘いただけたらと思います。 <?php $keyword = $_POST['keyword']//検索ワードになります、下記の例では使用していません ?> <?php //データベース接続 $page = $_REQUEST['page']; if ($page == '') { $page = 1; } $page = max($page, 1); // 最終ページを取得する $sql = 'SELECT COUNT(*) AS cnt FROM table1'; $result = mysql_query($sql); $rows = mysql_fetch_assoc($result); $maxPage = ceil($rows['cnt'] / 20); $page = min($page, $maxPage); $start = ($page - 1) * 20; $result = mysql_query('SELECT * FROM table1 LIMIT ' . $start . ',20'); $rowss = mysql_num_rows($sql); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["mail"]."</td>"; $tempHtml .= "</tr>\n"; } $msg = "".count($rowss).""; }else{ $msg = "sorry"; } //結果保持用メモリを開放する mysql_free_result($result); ?> //下記から、HTML部に表示しています <?php $start_a = ($start + 1); print "".$start_a."件~"; $start_b = ($start + 20); print "".$start_b."件を表示しています(".$page."ページ目/全".$maxPage."ページ)<br>"; if ($page > 1) { print "<a href=\"page.php?page=".($page - 1)."\">前のページへ</a>  "; } else { print "前のページへ"; } if ($page < $maxPage) { print "<a href=\"page.php?page=".($page + 1)."\">次のページへ</a>  "; } else { print "次のページへ"; } ?> <?= $msg ?> 何卒、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • APIで検索結果を1件だけ取得する方法を教えてください

    日曜プログラマーのため、プログラミング知識が乏しいのですが質問させてください。 「Simple API」というサイトのWikipedia APIのサービスを利用しようと考えているのですが、 サイト上で紹介されているPHPサンプルですと、キーワードによっては複数件の結果を取得してしまいます。 --------以下サンプル------- <?php // キーワード指定 $keyword = "東京"; // APIのURL $url = "http://wikipedia.simpleapi.net/api?keyword=".urlencode($keyword)."&output=php"; // データを取得 $data = file_get_contents($url) ; // PHPシリアライズパーサーを利用して解析し、配列に入れる $array = unserialize($data); // 配列をforeachで表示するデモ print "<H1>Wikipedia情報</H1>"; foreach ($array as $key => $value) { print "<a href=\"".$value[url]."\"><strong>".$value[title]."</strong></a>\n<br/>". $value[body] ."<hr/>\n\n"; } ?> ------------------ 私のやりたいこととしては、検索キーワードに対して1件目の結果のみ表示させたいのですが、うまいやり方がわからず困っています。 (データ取得自体は1件のみでも複数件でも構わないのですが、表示は1件目のみさせたいです) どなたか1件目の結果のみ表示されるサンプルコードをご教授願えませんでしょうか。 よろしくお願いいたします。 【SimpleAPI vol.3 - Wikipedia API】 http://wikipedia.simpleapi.net/

    • ベストアンサー
    • PHP
  • ガウスのの単純消去法のプログラムです。

    ガウスのの単純消去法のプログラムです。 前進消去の第k段階が終わった段階でaij,biが表示されるようにしたいんですがどうすればいいでしょうか↓ よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> #define ERROR -1 #define EPS 1.0e-15 int gausssimp(double *, double *, double *, int); int main(void) { double *a,*b,*x,val; char s[32]; int i,j,n,result; printf("Input size n="); gets(s); sscanf(s,"%d",&n); if((a=(double *)calloc(n*n,sizeof(double)) ) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } if((b=(double *)calloc(n,sizeof(double))) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } if((x=(double *)calloc(n,sizeof(double))) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } /* A,b の成分を入力 */ printf("----- A -----\n"); for(i=0; i<n; i++){ for(j=0; j<n; j++){ printf("a(%2d,%2d)=",i+1,j+1); gets(s); sscanf(s,"%lf",&val); a[n*i+j]=val; } } printf("\n----- b -----\n"); for(i=0; i<n; i++){ printf("b(%2d)=",i+1); gets(s); sscanf(s,"%lf",&val); b[i]=val; } /* Gaussの単純消去法による求解 */ result = gausssimp(x,a,b,n); /* 解の表示 */ if(result == ERROR){ printf("ERROR occurs. pivot 0\n"); } else { printf("\n----- solution -----\n"); for(i=0; i<n; i++){ printf("x(%2d)=%.8e\n",i+1, x[i]); } } free(a); free(b); free(x); return 0; } int gausssimp(double *x, double *a, double *b, int n) { int i,j,k; double tmp,p,sum; /* step 1: 前進消去 */ /**** 追加 ****/ /* 前進消去の各段階を終えるごとに,式がどのように変化しているかわかるように表示する */ /**************/ for(k=0; k<n-1;k++){ if(a[n*k+k] == 0.0) { /* ピボットの値が0.割り算でエラーが起きる.*/ return ERROR; } else { /* k+1番目以降の式から x[k] の項を消去 */ for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; } b[i]=b[i]-p*b[k]; printf("a[%d %d]=%d b[%d]=%d",i,j,a[n*i+j]-p*a[n*k+j],i,b[i]-p*a[n*k+j]); ↑これではできませんでした。。。 } /**********************************/ } printf("k=%d\n",k); } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS) return(ERROR); sum=0.0; for(j=k+1; j<n; j++) sum+=a[n*k+j]*x[j]; x[k]=(b[k] - sum)/a[k*n+k]; } return 0; }

  • 二進検索木

    下記のプラグラムで二進検索木を作りたいのですが、うまくいきません(2つまでしか保存ができない)。 たぶん、ポインタがおかしいと思うのですが・・・。お願いします。 入力 年齢 1 名前 a メアド a@ 年齢 2 名前 b メアド b@ 年齢 3 名前 c メアド c@ 年齢 -1 出力 b  ×  c   ×   × 歳 2 名前 b メアド b@ 歳 3 名前 c メアド c@ #include<stdio.h> #include<stdlib.h> struct node{ char *name; char *email; int age; struct node *left; struct node *right; }; void getline(char *s,int n){ int c; while(--n>0&&((c=getchar())!=EOF && c!='\n')) *s++=c; *s='\0'; } char* dupstr(char* strg){ char* newstr; newstr = (char*)malloc(sizeof(char)*strlen(strg)); strcpy(newstr,strg); return newstr; } struct node *new(int n,char *na,char *em){ struct node *p; p=malloc(sizeof(struct node)); p->age=n; p->name=na; p->email=em; p->left=NULL; p->right=NULL; return p; } void print(struct node *p){ if(p==NULL)return; else{ print(p->left); printf("\n歳:%d ", p->age); printf("\n名前:%s ", p->name); printf("\nメアド:%s ", p->email); print(p->right); } } void print_tree(struct node *p,int level){ int i; for(i=0;i<level;i++)printf(" "); if(p==NULL)printf("×\n"); else{ printf("%s\n",p->name); print_tree(p->left,level+1); print_tree(p->right,level+1); } } void *insert(struct node *p,int n,char *na,char *em){ int c; c=strcmp(p->name,na); if(c==0); else if(c>0){ if(p->left==NULL) {p->left=new(n,na,em); return p;} else insert(p->left,n,na,em); } else{ if(p->right==NULL){ p->right=new(n,na,em); return p;} else insert(p->right,n,na,em); } } main() { int age,g; char buf[80],a[80],b[80],*email,*name; struct node *root=NULL; g=1; printf("\n歳を入力:"); getline(buf,sizeof(buf)); printf("\n名前入力:"); getline(a,sizeof(a)); name=dupstr(a); age=atoi(dupstr(buf)); printf("\nメアド入力:"); getline(b,sizeof(b)); email=dupstr(b); root=new(age,name,email); while(g==1){ printf("\n歳を入力:"); getline(buf,sizeof(buf)); age=atoi(dupstr(buf)); if(age==-1) break; printf("\n名前入力:"); getline(a,sizeof(a)); name=dupstr(a); printf("\nメアド入力:"); getline(b,sizeof(b)); email=dupstr(b); root=insert(root,age,name,email); } print_tree(root,0); print(root); }

  • データベース内容が表示されない

    <br>検索結果<br> <?php if($num_rows== 0){ $message="該当するデータはありませんでした"; } else $message=$num_rows ."件ヒットしました"; echo $message; ?> <br> <?php while($row = mysql_fetch_array($result));?> <br> <?php echo"{$row['tiiki']}"; ?> <?php print"<td>{$row['syoku']}</td>"; ?> <?php print"<td>{$row['koyou']}</td>"; ?> <?php print"<td>{$row['kai']}</td>"; ?> <br> <a href="html.html">再検索</a> とすると、三件ヒットしました、などは表示されますが、肝心のtiiki,syoku等の情報が表示されず、空白のままです。記述ミス等ありますでしょうか??

    • ベストアンサー
    • PHP