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

このQ&Aのポイント
  • Perlでページの処理が正常に動作せず困っています。具体的な問題点を教えてください。
  • 現在のPerlスクリプトにおいて、ページの表示が正しく行われません。どこが原因であるかを教えてください。
  • Perlのページ処理に関して困っています。スクリプト内の特定の処理がうまくいっていないようです。どこに問題があるのかを教えてください。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • karogon
  • ベストアンサー率75% (6/8)
回答No.2

スクリプト全体を見ていないので、 はっきりとは言えませんが、 >「次の$page件」($pageの部分は変数展開しています。)を押したとき と言うことであれば、 ・条件分岐で処理している部分を疑ってみる。 ・全体でのデータの流れでおかしい部分はないか? などをチェックしてみてはいかがですか? いずれにしろ、ここに記載されている部分だけだと 把握できない部分もあるので、原因を追及するのは 少し難しいですね。 お力になれず、申し訳ないです。

ctpsys
質問者

お礼

karogonさん チェックありがとうございます。 掲載部分が問題なさそうだとわかっただけでも 問題点を絞れて、大変うれしいです。 ありがとうございます。 おっしゃる通り ・条件分岐で処理している部分を疑ってみる。 ・全体でのデータの流れでおかしい部分はないか? の2点かなと思っていました。 今後ともよろしくお願いします。

その他の回答 (1)

  • karogon
  • ベストアンサー率75% (6/8)
回答No.1

表示されないとなると、何かエラーが出ているのでしょうか? ぱっと見て、気になった箇所が一点。 ソースの32行目で } #foreach文ここまで となっていますが、これに対応する"{"が 見当たりません。 おそらく10行目の #foreach $line (@messages) {の中で だとは思うのですが、実際にはコメントアウト されてますので、この部分で引っ掛かってるのでは ないですか?

ctpsys
質問者

補足

早速お返事ありがとうございます。 #foreach $line (@messages) {の中で  は スクリプト中では # はありません。{も対応しています。 最初(htmlから検索結果を呼び出したときは正常に表示されるのですが、「次の$page件」 ($pageの部分は変数展開しています。)を押したとき  Internal Server Errorがでてしまいます。 #ページ処理(5) の }elsif( $ff > 4 ){ まで値が正常ですが、 }elsif( $ff > 4 ){ の次から値が入らないようです。どうしてかわかりません。

関連するQ&A

  • 一致する文字としない文字があるのですが

    会員のログイン等で、氏名(漢字)と生年月日でログインするように してあるのですが、「眞」や「はしご高」などの文字が、 フォームで渡ってきた場合に、 データと一致しなくエラーとなってしまいます。 if (!open(IN,"$file")) { &error('データベースエラー','.'); } @BASE = <IN>; $all = @BASE; close(IN); if ($FORM{'FF'} eq '') { $FF = 0; } else { $FF = $FORM{'FF'}; } $TO = $FF + $page - 1; if ($TO > $#BASE) { $TO = $#BASE; } $hit = 0; $next_num = ''; foreach $num ($FF .. $#BASE) { $data = $data2 = $BASE[$num]; &jcode'convert(*data,'euc'); ($d,$NO,$REM,$DATE,$NAME,$EMAIL,$PMAIL,$AGE,$SEX,$PREF) = split(/\,/,$data); # 名前(一致) if ($NAME5 ne 'dadada') { if ($NAME eq $FORM{'NAME'} ) { ; } else { next; } } # 生年月日(一致) if ($AGE5 ne 'kakak') { if ($AGE eq $FORM{'AGE'} ) { ; } else { next; } } # 検索終了処理 if ($hit == $page) { $next_num = $num; last; } else { push(@NEW,$data2); $hit++; } } と検索の部分はなっております。 エラーが出る漢字は少ないのですが、 ログインできないお客様がいて困っています。 なにか対処方法はございますでしょうか? 何卒、宜しくお願い致します。

    • 締切済み
    • CGI
  • ページ処理

    毎度お世話になってます 同じような質問を数回させていただいたのですが 自分の技量不足のため上手く行きませんでした なので再度質問の形を変えてお聞きさせていただきます 今以下のようなコーティングでデータベースを 作成しています その際のページ処理が上手くいきません どのように上手くいかないかというと マッチしたサイト全てが検索結果に表示されてしまいます このコーティングをベースに構成したいのですが 何とかなりますでしょうか? $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} }

  • CGIのカスタマイズについて

    ネットレスキューさんの簡易データベースについて search.cgiの表示部分でテーブルを一つずつ生成させようと思ったのですがエラーが出ます。 どこが悪いのでしょうか? ----------ここから------- foreach $data (@NEW) { ($d,$DATE,$PREF,$NAME,$EMAIL,$HURL,$AGE,$HANDLE,$REM) = split(/\,/,$data); print "<table width="450" border="0" cellspacing="0" cellpadding="0" class="p12_16">\n"; print "<tr>\n"; print "<td colspan="2" bgcolor="#CC0033" height="14"><font color="#FFFFFF">● $NAME</font></td>\n"; print "</tr>\n"; print "<tr>\n"; print "<td width="70">地域</td>\n"; print "<td width="380">$PREF</td>\n"; print "</tr>\n"; print "<tr>\n"; print "<td height="14">Eメール</td>\n"; print "<td><a href=\"mailto:$EMAIL\">$EMAIL</a></td>\n"; print "</tr>\n"; ---中略---- print "<td height="14">内容</td>\n"; print "<td>$REM</td>\n"; print "</tr>\n"; print "</table>\n"; if ($next_num ne '') { while (($key,$val) = each %FORM2) { if ($key ne 'FF') { $buf = "$buf&$key=$val"; } } print "<h3>↓<a href=\"search.cgi?$buf&FF=$next_num\">次の$page件</a></h3>\n"; } } print "</body></html>\n\n"; exit; --------------ここまで----- splitの扱い方が良く分っていません。 御存知の方御指導下さいませ。

    • ベストアンサー
    • CGI
  • CGIでのページ指定~その(2)

    以前教えていただいた下記の記述なのですが 新規のCGIで実行するとうまく表示されません; $inの関連記述をしていないからでしょうか? まったくの新規のCGIで実行できる記述方法を 教えてください よろしくお願いします m(_ _)m **************************** if($in{'p'} eq '1'){&page1;} sub page1{ print"1ページ目"; print"<a href=./aaa.cgi?p=2>2ページ目</a>"; } ****************************

    • ベストアンサー
    • CGI
  • perlで行う次ページ処理について

    今、perlで次ページ処理がわからなくてこまっています。したいことは、リスト表示でデータは50件以上存在しているのですが、10件ずつ表示したくて、1ページ目に次ページへいくボタンをつけ、2ページ目には前ぺーじと次ページがでて、5ページ目には前ページのボタンが下にでるようにしたいのですが、できません。教えてください。 ####図面一覧表表示#### $line=0; print<<"_HTMLI_"; <HR> <TABLE BORDER="5" BGCOLOR="#dfefff" BORDERCOLOR="#80bfff" > <tr><td>MO</td><td>期</td><td>見積番号</td><td>読み(物件名称)</td> <td>物件名称</td><td>読み(図面名称)</td><td>図面名称</td><td>図面形式</td> <td>使用容量</td><td>作成日付</td><td>CAD担当者1</td><td>CAD担当者2</td></tr> _HTMLI_ open(FILE,"< list.txt"); while(<FILE>){ $tmp=$_; @sample=split(/\x09/,$tmp); print<<"_HTMLA_"; <TR><TD>$sample[0]</TD><TD>$sample[1]</TD><TD>$sample[2]</TD> <TD>$sample[3]</TD><TD>$sample[4]</TD><TD>$sample[5]</TD> <TD>$sample[6]</TD><TD>$sample[7]</TD><TD>$sample[8]</TD> <TD>$sample[9]</TD><TD>$sample[10]</TD><TD>$sample[11]</TD></TR> _HTMLA_ if($line >= 100){ goto abort; } } abort: close(READ); ####HTML終了#### print<<"_HTMLT_"; </TABLE><BR><BR>

    • ベストアンサー
    • Perl
  • 前ページ・次ページの判定の仕方

    現在行いたい処理は以下の通りです。 (1)データの一覧を表示させる (2)一覧を表示させた状態でデータを変更する。 (3)更新ボタンを押さずに前ページか次ページを押した時に  「変更ボタンを押して下さい。」とのメッセージを出力させる。 (4) OKを押した時は、(3)の時に押した前ページか次ページの 処理を行う。 (4)の処理を行なった時に前ページか次ページの判定の仕方 がわかりません。 教えていただきたく、宜しくお願いいたします。 ソースは以下の通りです。 <script type="text/javascript"> function next(action) { var page = document.forms[0].NowPage.value; document.forms[0].NowPage.value = parseInt(page) + 1; document.forms[0].action = action; document.forms[0].submit(); } function before(action) { var page = document.forms[0].NowPage.value; document.forms[0].NowPage.value = parseInt(page) - 1; document.forms[0].action = action; document.forms[0].submit(); } function change(){ myRet = confirm("修正ボタンを押してください。"); if ( myRet == true ){ next('sample!Next.action'); } } </script> ・ ・ <td class="list1" ><s:textfield name="Sample1" size="10" maxlength="10" onchange="change()" /></td> ・ ・ ・  <td><s:submit value="修正" cssClass="form_button" action="Sample" method="Update" onclick="return confirm('%{btnUpdateMsg}');"/></td> <s:hidden name="btnUpdateMsg" /> <tr> <td class="form_navigation"> <s:if test="nowPage!=1"> <div class="navigation"> <s:a href="#" onclick="after('Sample!Next.action');"> <前ページ </s:a> </div> </s:if> </td> <td class="form_navigation"> <s:if test="nowPage!=TotalPage"> <div class="navigation"> <s:a href="#" onclick="next('Sample!Next.action');"> 次ページ> </s:a> </div> </s:if> </td> </tr>

  • 検索結果($_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
  • 掲示板で親のデータを子に反映させる方法

    スミマセン。基本だと思いますが、教えてください。 Joyful系の掲示板のファイルなのですが、 各記事の親記事にある特定のデータを、 取り出す方法を教えて下さい。 5<>IP<>1234567890<> 3<><>2012/01/12(Thu) 08:42<>ウサギ<>Yahoo<> 5<>3<>2012/01/12(Thu) 09:04<>ネコ<><> 1<><>2012/01/12(Thu) 08:41<>イヌ<>Google<> 2<>1<>2012/01/12(Thu) 08:41<>ウサギ<><> 4<>1<>2012/01/12(Thu) 09:03<>タヌキ<><> こんな感じで、データが記入されるdatファイルがあります。 「1のレスが2・4」「3のレスが5」です。 それで、親記事に「Yahoo」や「Google」というデータが入っているので、 親記事1にレスしてる2・4でも、 親記事に入ってる「Google」といった文字を反映したいのです。 うまく伝えられ無いので、画像にしてみましたので見てやって下さい。 私が見てるプログラムでは、 レスはレスで、「Google」等の文字を探してしまっているので、望む形にならないのです; どうぞ、よろしくお願いします! ↓ざっくり。この辺りの最初の方に、親だけ読み込んで、$search1 とかに、セットできないかと考えています。 ★━━━━━━━━━━━━━━━━━━━━★ local($ipt,$wh,$i,$flag); # 記事を展開 open(IN,"$logfile") || &error("Open Error : $logfile"); $top = <IN>; $i=0; $x=1; $flag=0; # ソート無し:必要最小限だけ読み込み if(!$sort && !$threadsuu){ while(<IN>){ if((split(/<>/))[1] eq "") { $i++; } if ($i < $page + 1) { next; } if ($i > $page + $p_log) { next; } push(@DATA,$_); } } # ソート無し、スレッド表示有り elsif(!$sort && $threadsuu){ @DATA = <IN>; } # ソート有り:全データを読み込んでソート実行 else{ @DATA = <IN>; if($sort == 1){ &ressort; } if($sort == 2){ &nosort; } } close(IN); # 新着スレッドを表示 if($threadsuu || $up_down){ &thread; } # レスの表示制限をする場合には、配列を改造 if($max_res){ &omit; } foreach(@DATA){ ($no,$reno,$date,$name,$mail,$search) = split(/<>/); # ページ処理 if($sort || $threadsuu){ if ($reno eq "") { $i++; } if ($i < $page + 1) { next; } if ($i > $page + $p_log) { next; } } if (!$reno && $flag) { print "</td></tr></table><br><br>\n\n"; $flag=1; } if (!$reno) { print "<table class=\"table1\" align=\"center\" cellspacing=0 cellpadding=2>\n<tr><td>"; $flag=1; } if ($reno && $line_color) { print "<hr noshade size=1 width='85%' color=\"$line_color\">\n"; } print "<table width=100% border=0 cellpadding=2 cellspacing=0>\n<tr>"; if ($reno) { print "<td rowspan=2 width=40><br></td>"; } if($line_color){ print"<td>"; } elsif($reno){ print"<td class=\"b2\">"; } else{ print"<td class=\"b1\">"; } if (!$reno) { print "<span class=\"sub\"> <font color=\"$t_color\"><b>$sub </b></font></span>";} else { print "Re:<font color=\"$t_color\"><b>$sub </b></font></span>";} if($search == "yahoo") { print "投稿者:<span class=\"name\">$name</span> yahooで検索";} elsif($search == "google") { print "投稿者:<span class=\"name\">$name</span> Googleで検索";} else { print "投稿者:<span class=\"name\">$name</span> その他で検索";}

    • ベストアンサー
    • Perl
  • 次ページ処理で途中つまりました

    次ページ処理を作成しています。 サイト内は1ページごと表示されます。 トータル件数表示することも完成しています。 URL内にfoge?page=2みたいなところまで完成したのですが、肝心の2ページ目に行くURLをクリックしても行かず、同じページが表示されます。 そのサイトはIDとパスワードを保持したまま次のページなどにいくことを目論んでいます。 なので、実際のURLは↓ foge?mycmd=read3&mynum=0&mypass=22&page=2 最後にpage=2を使って次のページに行かせたいのですが。 ちなみにmynumやmypassはIDとパスワードです。mycmd=read3は処理ルーチンで分岐させています。 このpage=2という数値をちゃんと取れていない気がするのです。下のようにして数値を得ようとやってみましたが、ダメでした。 $method = $ENV{ 'REQUEST_METHOD' }; if( $method eq 'GET' ) { $query = $ENV{ 'QUERY_STRING' }; # データの受け取り &getparam( $query ); # データの分解 $mode = 'show_write'; # 処理モードの決定(show_write:表示) } elsif( $method eq 'POST' ) { read( STDIN, $query, $ENV{ 'CONTENT_LENGTH' } ); # データの受け取り &getparam( $query ); # データの分解 $mode = 'write'; } sub getparam { my( $value, $key ); foreach $in_param ( split( /&/, $query ) ) { ( $key, $value ) = split( /=/, $in_param ); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge; &jcode'convert( *value, $code ); $param{ $key } = $value; } } $page = $param{ 'page' }; # ページ数 どのようにして次ページ処理をうまく行かせればよいか教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • PHP pagerについて

    現在mysqlに登録されているデータを表示させてなおかつ表示制限をつくっています。 pagerにて表示を分割しています。 http://www.phppro.jp/qa/3073のソースを参考に作成したみたのですが、 下記が自分なりに編集したコードです。 define(LMAX, 5); if (!isset($_GET['page'])) { $page = 1; } else { $page = intval($_GET['page']); if ($page == 0 ) { die('page no error'); } } $skip = ($page - 1) * LMAX; $query = sprintf('SELECT * FROM `test` LIMIT '.$skip.','.(LMAX + 1)); $result = mysql_query($query, $link) or die(mysql_error()); $line = 0; while ($row = mysql_fetch_array($result)) { if ($line >= LMAX) { break; } if ($line == 0) { // ヘッダ出力 $r_list .= "<tr>\n"; $r_list .= "<th>テスト1</th>\n"; $r_list .= "<th>テスト2</th>\n"; $r_list .= "<th>テスト3</th>\n"; $r_list .= "<th>テスト4</th>\n"; $r_list .= "</tr>\n"; } $line++; $r_list .= "<tr>\n"; $r_list .= "<td>" .$row["test1"]. "</td>\n"; $r_list .= "<td>" .$row["test2"]. "</td>\n"; $r_list .= "<td>" .$row["test3"]."</td>\n"; $r_list .= "<td>" .$row["test4"]."</td>\n"; $r_list .= "</tr>\n"; } if ($page > 1) { $prev = '<a href="?page=' . ($page - 1) . '">Prev</a>'; } if ($line > LMAX) { $next = '<a href="?page=' . ($page + 1) . '">Next</a>'; } としています。 いくつかご質問がお分かりの方が、いらっしゃいましたら教えていただけないでしょうか? ・define(LMAX, 5);のところで5にしているにもかかわらず5件表示がされない。 ・このコードだとPrevやNextがでない。 ・ 2個目の$r_list .= "</tr>\n";の下に$line++;を書くとPrevやNextが表示される。 以上になります。 宜しくお願いいたします。

    • 締切済み
    • PHP