• 締切済み

ページ処理

毎度お世話になってます 同じような質問を数回させていただいたのですが 自分の技量不足のため上手く行きませんでした なので再度質問の形を変えてお聞きさせていただきます 今以下のようなコーティングでデータベースを 作成しています その際のページ処理が上手くいきません どのように上手くいかないかというと マッチしたサイト全てが検索結果に表示されてしまいます このコーティングをベースに構成したいのですが 何とかなりますでしょうか? $view=2; sub subtwo {open(fp,"log.txt"); @lines = <op>; close(op); $bigin = $in{"page"} * $view; $end = $bigin + $view; if($i !~ /\d+/){$i = 0}; if($open eq "") {foreach $line (@li) {($abc,$def,$ghi,$jkl,) = split(/,/,$line); $chk = 1; foreach $k (@key) {if(index($line,$k,)<0) {$c = 0; last}} if($c>0) {print "<A HREF=\"$abc\">$def</A><br>\n";<br>\n";}}}} ############################################ sub subthree {$bigin = $in{"page"} * $view; $end = $bigin + $view; if($end<$マッチした総数の変数) {$nextpage=$in{"page"}+1; print qq(<FORM method="get" action="kensaku.cgi"> <INPUT TYPE=HIDDEN NAME="page" VALUE="$nextpage"> <INPUT TYPE="SUBMIT" VALUE="next"> </FORM>\n);} if($bigin>0) {$backpage=$in{"page"}-1; print qq(FORM method="get" action="kensaku.cgi"> <INPUT TYPE="HIDDEN" NAME="page" VALUE="$backpage"> <INPUT TYPE="SUBMIT" VALUE="back">\n);} if($page<0) {$page=0} }

  • Perl
  • 回答数1
  • ありがとう数1

みんなの回答

noname#205944
noname#205944
回答No.1

ちょっと前に作っていたので、それを抜粋してみました(けっこうやっつけですけど) ・・人の書いたコードを読むのはにがてで、変数名とかはぜんぜん違いますが、参考になればと思います #------------ これは既存として # 表示件数 $view_max = ? # 指定ページ $this_page = ? # 全データ数 $data_max = ? #------------ ここからがキモ # 全ページ数 $page_max = $data_max ? ceil($data_max/$view_max) : 1; my ($page_high); # 指定ページの最大データ番号 my ($page_low); # 指定ページの最小データ番号(1番からです) &error('アクセスエラーです') if ($page_max < $this_page); if($this_page == 1) { $page_high = $data_max; $page_low = ($data_max > $view_max) ? $data_max-$view_max+1 : 1; } else { $page_high = $data_max - ($view_max * ($this_page-1)); $page_low = (($page_high - $view_max) >0) ? $page_high - $view_max+1 : 1; } #すると、どこからどこまでのデータを表示すればいいのかがわかると思います(&errorは自作で) #------------ ページナビゲーション my($this_cgi); # CGIの名前 (とりあえず page=ページ数,maxview=表示件数 として渡してます) if($this_page>1) { print qq(<a href="$this_cgi?page=) .($this_page - 1). qq(&maxview=$view_max">&laquo;</a>&nbsp; ); } for(my $i=1;$i<=$page_max;$i++) { if($i == $this_page) { print qq(<b>$i</b> ); } else { print qq(<b><a href="$this_cgi?page=$i&maxview=$view_max">$i</a></b> ); } } if($page_max>=$this_page+1) { print qq(&nbsp;<a href="$this_cgi?page=) .($this_page + 1). qq(&maxview=$view_max">&raquo;</a>); } うまくいかないときは、本番同様のデータを入れて 一つ一つの変数をテスト用に任意の箇所でprintして確かめるのが一番だと思いますよ

gonntetu
質問者

お礼

ありがとうございます 参考にさせていただきます

関連するQ&A

  • Perlでページ処理がどうしても機能しない!教えて!

    次のページが表示してくれません。 どこが悪いのか、わかりません。教えてください。 スクリプトは以下の通りです。 #formのデータ処理で $in{$key} = $val; # 入力データは%inへ #ページ処理(2) if($val eq '次の$page件'){ $allhits=$in{'allhits'}; $ff=$key; &Search; } #sub Search内で #foreach $line (@messages) {の中で #ページ処理(4) $page_control++; if($ff eq ""){ $ff = 1; } if( $ff > $page_control ){ next; } #ページ処理(5) #最初のページの時、データの最後まで処理する。 if($in{'next_num'} eq ''){ if($end != 1 && $hit == $page ) { $end = 1; $next_num = $page_control; $allhits++ ; } elsif( $hit >= $page) { $allhits++ ; } else{ push(@NEWS , $line); $hit++; $allhits++; } $test5 = $allhits;     #test値 13 -> なし 正常(値の変化をチェック) }elsif( $ff > 4 ){      #この辺の処理がうまくいっていない? $allhits = $in{'allhits'}; $test3 = $allhits;     #test値が入らない?(値の変化をチェック) if ($hit == $page ) { $next_num = $page_control ; $test4 = $next_num;   #test値が入らない?(値の変化をチェック) #last OUTER; } else { push (@NEWS , $line ); $hit++; } } } #foreach文ここまで &footer; #ページ送りのサブルーチン #ページ送りボタンサブルーチン sub footer { print "<table width=700><tr><td align=left>\n"; if ($ff >2) { print "<INPUT type=submit value=\"前の$page件\" onClick=history.back()>\n"; } print "</TD><TD align=right>\n"; if ($next_num){ print "<INPUT type=submit name=\"$next_num\" value=\"次の$page件\">\n"; } print "</td></tr></table>\n"; }

    • ベストアンサー
    • Perl
  • 一つのページで二つのFormを別々に使いたい

    <body> <form name="fm1"> <input type="hidden" value="1" id="page"> <input type="button" value="送信する" onClick="execute()"> </form> <form name="fm2"> <input type="hidden" value="2" id="page"> <input type="button" value="送信する" onClick="execute()"> </form> <div id="container">content</div> </body> </html> 上記のように同じ関数execute()を実行するのですが、受け渡す値がvalue="1" と value="2"と別々になっています。 素人考えではフォームfm1とfm2とは別々の値(1or2)を渡すと思ったのですが、どちらのボタンを押してもvalue="1"の結果となります。 二つのフォームを別々に動作させるにはどのようにすればよいでしょうか。

  • 全文検索ではなく、必要なデータ(複数フィールド)のみを検索するにはどうしたらいいですか?

    はじめまして、まだCGI初心者なものでよくわからないですが教えてください。 あるCGI関連の書籍に付属のCD内に修められた顧客データベースを改造しているところです。このデータベースはCSVデータの全ての情報を検索して結果を表示するものなのですが、これを「備考($ message)以外の情報を全て検索して結果を表示する」とするにはどのように改造したらよろしいでしょうか。備考は検索しないけれど、他の情報は全て検索して結果を表示させるということです。ただし、結果として表示される画面には備考($ message)の内容も表示させたいのです。 検索に関わる箇所を抜き出すと次のようになります。初心者なので説明がうまくできていないと思いますが、ご解答できる方々は是非ともご教授お願いいたします。 ############################ # 初期画面、検索結果表示 ############################ sub html { open(IN,"$file") || &error(100,'ファイルをオープンできません'); @DB = <IN>; close(IN); @DB = reverse(@DB); if ($FORM{'action'} eq "search") { $kw = $FORM{'kw'}; &jcode::convert(*kw,'euc'); foreach $line (@DB) { $value = $line; if ($kw =~ m/[\*\{\}\=\&\@\~\>\<\#\%\"\'\`\(\)\[\]\\\/\:\;\_\,]/){ &error(101,'検索キーが不適切です'); } &jcode::convert(*value,'euc'); if ($value =~ /$kw/i){ push(@HIT,$line); } } }else{ @HIT = @DB; } print "Content-type: text/html\n\n"; print <<"EOL"; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=x-euc-jp"> <title>$title</title> @style </head> <body> <div align="center"> <p class="title">$title</p> <p class="text"><b>|</b><a href="$HomeUrl">ホームページ</a><b>|</b></p> <form method="post" action="$reload"> <input type="hidden" name="action" value="write"> <input type="submit" value="データベースに書き込む" class="buttonsmall"> </form> <form method="post" action="$reload"> <input type="hidden" name="action" value="search"> <table border="0" cellspacing="0" cellpadding="2"> <tr> <td> <p class="text">名前、ユーザー名他、備考文の文字検索ができます。</p> </td> </tr> <tr> <td> <table border="0" cellspacing="0" cellpadding="2"> <tr valign="bottom"> <td> <input type="text" name="kw" size="30" class="textarea"> </td> <td> <input type="submit" value="検索" class="buttonsmall"> </td> </tr> </table> </td> </tr> </table> </form> EOL if ($FORM{'line'} eq ''){ $line = 0; }else{ $line = $FORM{'line'}; } $data_count = @HIT - 1; $view_end = $line + ($view-1); if ($view_end >= $data_count){ $view_end = $data_count; } foreach ($line .. $view_end) { ($date_now,$number,$name,$email,$hp,$message,$tiku,$yuza,$tel,$fax,$busho) = split(/\,/,$HIT[$_]); $message =~ s/\r/<br>/g; print <<"EOL"; ############################

    • ベストアンサー
    • Perl
  • どのボタンが押されたかによって処理をする

    解る方、教えて下さい。 例えば、<form>内に、 <input type="submit" value="合計照会" name="GOUKEI"> <input type="submit" value="詳細照会" name="MEISAI"> と2つボタンがあり、合計照会のボタンが押されたらVBスクリプトで処理をする為の, IF文 の変数をどう指定すればよいのかがわかりません。 (下記の % をどう指定するばよいのかがわかりません。) IF %%%%%%% = %%% THEN GOTO END END IF それともこの様な文ではダメなのでしょうか? 宜しくお願い致します。

  • perl 変数 代入

    恐れ入ります。 Perlで、フォームから送信して、変数に代入したいのですがうまくいきません。 print qq!<form action="./xxx.cgi" method="get">!; opendir(DIRHANDLE, "./xxx"); foreach(readdir(DIRHANDLE)){ next if /^\.{1,2}$/; print qq! <input type="checkbox" name="$_" value="$_"> <input type="submit" value="送信"></form> とし、ディレクトリ内のフォルダ名をnameに格納してxxx.cgiへ送信します。 xxx.cgi側では、 #!/usr/bin/perl use cgi; $form = CGI->new; として、送信されたデータを次々と代入したいのですが、どのようにしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • FORMから指定したファイルのリネームについて

    こんにちは! Perlの初心者です。 以下のプログラムは FORMから指定したファイルのリネームをやろうと思い、 途中まで作ったものです。 しかし、実行するとFORMは出来ているのですが、 リネームは行なわれません… print "Content-type:text/html\n\n"; print qq(<html>\n); print qq(<body><h1>ファイル名登録</h1>\n); print qq(<form action="$ENV{'SCRIPT_NAME'}" method="POST">\n); print qq(変更前:<input type="FILE" name="$user1"><br>\n); print qq(変更後:<input type="FILE" name="$user2"><br>\n); print qq(<inupt type="subimt" value ="登録">\n); print qq(</form>\n); print qq(</body>\n); print qq(</html>\n); rename ($usesr1,$user2); exit; 多分、FORMで指定したファイル名($user1,$user2)が、 renameの関数まで届いて無いからだと思うのですが… ここまでやって完全にお手上げになってしまいました。 どうしたらリネーム出来るか、分かる方ご指導宜しくお願い致します。 動作環境は、Windows98 or MEで、Internet Explorerを使っています。

  • データの入れ替え処理が巧くできないのですが

    いつもお世話になります 簡単なDBを作っているのですが、データの更新処理が巧くいかなくててこずっています POSTメッソドで送られてきた name=actionの内容がedit2、の時 sub menteが実行されます同じく name=noの変数には更新したいファイルの番号がセットされます それらを取得して、ファイルを開き $nooの内容(DBのファイル番号)とnoが一致したらブラウザから送られてきたデータと その部分のデータ($nooはデータの先頭で以降<>で区切って変数が格納される) を入れ替える処理を行いたいのですがどの様に書いたらいいのでしょうか、下記のコードですと変数 $_に更新される前のデータしか代入できず結果ファイルの入れ替えは行えません open(IN,"$logfile") || &error("Open Error : $logfile"); while (<IN>) { ($noo,@arg_[0..$#eqipument],@p[0..5],$n_article,$w_article,@reselect_marks) = split /<>/; if ($no == $noo ) { $_ = join('<>',$noo,(map{$arg_[$_]}(0..$#eqipument)),$p0,$p1,$p2,$p3,$p4,$p5,$n_article,$w_article,@reselect_marks,),'<>',"\n"; } push(@new,$_); } close(IN); # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); 尚ブラウザから送信されてくるデータは以下のような感じです print qq|<form action=\"$myself\" method=\"POST\">\n|; print qq|<input type=hidden name=mode value=\"admin\">\n|; print qq|<input type=hidden name=action value=\"edit2\">\n|; print qq|<input type=hidden name=no value=\"$no\">\n|; 宜しく御教授お願いいたします。

    • ベストアンサー
    • Perl
  • フォームのチェックボックスの値を次のページで読み込む方法

    「1.htm」のフォームでチェックボックスを作成し、 「2.asp」で結果を出力しようとしています。 が、複数チェックを入れるとエラーになります。 どこがまちがっているのでしょうか。 どなかたご教授ください。 宜しくお願いします。 ****1.htm**** <form method="POST" action="2.asp"> <INPUT type="checkbox" name="koumoku" value="1">1<br> <INPUT type="checkbox" name="koumoku" value="2">2<br> <INPUT type="checkbox" name="koumoku" value="3">3<br> </form> ****2.asp**** <% koumoku = Request.Form("koumoku") If koumoku = 1 then Response.Write "<p>1111</p>" End If If koumoku = 2 then Response.Write "<p>2222</p>" End If If koumoku = 3 then Response.Write "<p>3333</p>" End If ****エラーメッセージ****** 型が一致しません。: '[string: "1, 2, 3"]'

  • POST からの受け渡しができません・・・

    教えてくださいm(__)m <FORM action="<? echo $PHP_SELF; ?>" method="POST"> :(ここにはif文がはいっています。) : print "お名前:<BR>\n"; print "<input type=\"text\" name=\"handle\" size=\"16\" maxlength=\"30\" value=\"<? echo ($handle); ?>\"><br><br>\n"; print "性別:<BR>\n"; for (reset ($sex_tbl); $key = key ($sex_tbl); next ($sex_tbl)) { echo (" <OPTION value=\"" . $key . "\""); if ($key == $sex) echo (" SELECTED"); echo (">" . $sex_tbl[$key] . "\n"); } print "PRポイント:<BR>\n"; print "<input type=\"text\" name=\"pr\" size=\"16\" maxlength=\"30\" value=\"<? echo ($pr); ?>\"><br><br>\n"; print "<CENTER><input type=\"submit\" value=\"次の人!\"></CENTER><br>\n"; print "<input type=\"hidden\" name=\"page\" value=\"kekkapage\">\n"; print "<input type=\"hidden\" name=\"handle\" value=\"" . $_POST['handle'] . "\">\n"; print "<input type=\"hidden\" name=\"sex\" value=\"" . $_POST['sex'] . "\">\n"; print "<input type=\"hidden\" name=\"pr\" value=\"" . $_POST['pr'] . "\">\n";←80 </FORM> : : ↑なのですが、 「・・・on line 80」エラー表示になりうまくいきません。 の部分が原因と表示にはなっているのですが…。 助けてください。 宜しくお願いしますm(__)m

    • ベストアンサー
    • PHP
  • postのタイムラグ

    以下のソースでPOSTの値が取れないときがあるので困っています。 具体的にはページを表示してから30秒程度待ってからの クリックじゃないとPOSTの値が取れません。 GETの場合はページ表示後すぐにボタンをクリックしても大丈夫でした。 原因が分からず途方に暮れています。 お知恵をお貸しください。 PHP Version 5.2.3 <?php $P_data = $_POST["pg"]; print("POST=>".$P_data."<BR>"); $G_data = $_GET["pg"]; print("GET=>".$G_data."<BR>"); print <<< DOC_END <html> <head> </head> <body> DOC_END; echo"<form action=test.php method=post>"; echo"<input type=hidden name=pg value=1>"; echo"<input type=submit value=あ>"; echo"</form>"; echo"<form action=test.php method=post>"; echo"<input type=hidden name=pg value=2>"; echo"<input type=submit value=い>"; echo"</form>"; echo"<form action=test.php>"; echo"<input type=hidden name=pg value=3>"; echo"<input type=submit value=う>"; echo"</form>"; echo"<form action=test.php>"; echo"<input type=hidden name=pg value=4>"; echo"<input type=submit value=え>"; echo"</form>"; print <<< END </body> </html> END; ?>

    • 締切済み
    • PHP

専門家に質問してみよう