• ベストアンサー

「○件リスト表示&次のページへ」と表示させたいのですが・・・

Web上でPOP3に接続して新着メールを確認するプログラムを作成しています。 受信したメールの一覧を表示させるのではなく、1ページに表示する件数を指定して、件数が多い場合は次のページへといったように表示させたいのですが、プログラムの作成方法がわかりません。 OSはwindowsXP PHP5を利用しています。 どなかたご教授くだされば幸いです。 どうぞよろしくお願いします。

  • PHP
  • 回答数6
  • ありがとう数8

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

  • ベストアンサー
回答No.6

全ての表示はできるということなので、あとはページに該当するデータのみを表示する処理ですね。 表示中のページ番号と1ページ中に表示するデータ数により必要なデータのみを表示する方法です。 例えば・・・ 全部で99件のメールがあるとします。($hit_count) そして1ページ中に10件のメールのタイトルを表示するとします。($list_up) すると、 1ページ目:1~10件目 2ページ目:11~20件目  ・  ・  ・ 10ページ目:91~99件目 となりますね。 forなどのループを使ってデータの表示を行うので必要でないデータをスキップすればいいです。 また、そのページのデータが全て表示されれば、それ以後を判断する必要もないので、 ループ処理から抜け出します。 例) ------------------------------------------------- $page = 2; // ページ数 $count = 0; // 表示数(実際の表示数[これによりbreakの判断]) $list_up = 10; // 1ページ中の表示数 $data = array('1', '2', ..., '99'); // データ $hit_count = count($data); // 総データ数 // リンク表示 echo_paging($hit_count, $page, $list_up); // データの表示 for($i = 0; $i < $hit_count; $i++) { // 前ページのデータはスキップする if($i < ($page-1)*$list_up) continue; /* ここでデータの表示(該当データ) */ // 実際の表示数のカウントアップ $count++; // 実際の表示数が1ページ中に表示するデータ数に達したらループから抜け出す if($count == $list_up) break; } // リンク表示 echo_paging($hit_count, $page, $list_up); ------------------------------------------------- といったイメージです。

blue_baby
質問者

お礼

回答ありがとうございました。 教えていただいたとおりにプログラムを作成して、動作確認を行いました。 正常に動作させることができました。 長々とお付き合いくださりありがとうございました。

その他の回答 (5)

回答No.5

Fatal error: Cannot redeclare echo_paging() (previously declared in C:\Apache Group\Apache2\htdocs\program2\pop3.php:35) in C:\Apache Group\Apache2\htdocs\program2\pop3.php on line 35 上記のエラーメッセージは関数を再定義(重複定義)したためです。 例えば、 function a() { } function a() { } と a() を複数定義したときに発生するエラーです。 for()などのループの中で重複して関数を定義していないでしょうか。 imapにつては扱ったことがないので、何故なのかは分かりません。 質問される際に > 受信したメールの一覧を表示させるのではなく、 と書いてあったので、「全データをそのままずらずらっと表示することができる」 ということを前提で話していましたが、この部分はできないということでしょうか。 まずは、全データを表示できるようになってからページングにより、必要データのみを表示するようにしてみてはいかがでしょうか。 ソースを載せるときのタイプミスだと思うのですが、 <?phpタグの中で更に<?phpタグを使われています。 最初の<?phpタグはどの段階で閉じられているのでしょうか。

blue_baby
質問者

お礼

何度も回答ありがとうございます。 エラーメッセージは、ご指摘していただいたとおりfor文を使用していたためでした。 >「全データをそのままずらずらっと表示することができる」ということを前提で話していましたが、この部分はできないということでしょうか。 メールをそのままずらずら表示させることはできました。しかし、ページリンクのプログラムを挿入する部分が間違っているのか、指定した件数ずつ表示されません。 <?phpタグはミスで抜け落ちていました。 申し訳ありませんでした。

blue_baby
質問者

補足

タグの抜け落ち、エラー部分を訂正しました。 ご指摘よろしくお願いします。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> </head> <body bgcolor="#ffffff"> <center> ***メールリスト一覧*** <br><br> <?php $mbox = @imap_open("{" . $mailserver . ":110/pop3}INBOX", "$user", "$pass"); if ($mbox) { /* 新着確認 */ $mboxes = imap_check($mbox); $hit_count = $mboxes->Nmsgs; echo "新着メールが $hit_count 件あります<br><br>"; /* 1通以上あれば */ if ($hit_count > 0){ /* 各メールのリストを作成 */ ?> ※この部分にpapillon68様のソースプログラムを挿入させていただいています。 文字数の関係上省略させていただきました。 <?php for ($i = $hit_count ; $i>= 1; $i--){ $head = imap_header($mbox, $i); $body = imap_body($mbox, $i, FT_INTERNAL); ?> <br> <?php echo htmlspecialchars(mb_decode_mimeheader($head->subject)); ?> <br> <a href="mailbody.php?i= <?php echo $i;?>"> <?php echo htmlspecialchars(mb_decode_mimeheader($head->fromaddress)); ?> </a> <br> <?php } } imap_close($mbox); } else { /* 認証の失敗 */ print("認証エラー<BR>\n"); } ?>

回答No.4

リンク表示部分だけを抜粋し、関数化しました。 ※データ部分(メールのタイトルのみテーブル表示でしょうか)は関数外で行うか  もしくは、関数内でデータ部分の表示もできるように拡張するなどが必要です。 ----------------------------------------------------------  /********  * [ ○ 件中の ○-○ 件を表示 ]  * [ 先頭 / 前へ / 1 / 2 / 3 / ・・・ / 次へ / 最終 ]  *  * ▲ 上記のようにリンクを表示する関数  *  * $hit_count: 全データ数  * $page: 表示するページ番号  * $list_up: 表示件数  * $link_list_up: リンク表示の数  */  function echo_paging($hit_count, $page = 1, $list_up = 10, $link_list_up = 5) {   $link_count = 1; // リンクの表示数   ///////////////////////////////////////////////   //// リンクの表示   ///////////////////////////////////////////////   // ページ数がヒット件数までなら表示   if(($page - 1) * $list_up + 1 <= $hit_count) {    /////////////////////////////////////////////    ////// [ ○ 件中の ○-○ 件を表示 ]    /////////////////////////////////////////////    $from = number_format(($page - 1) * $list_up + 1);    // 5件表示できるとき    if($page * $list_up <= $hit_count) $to = number_format($page * $list_up);    else                $to = number_format($hit_count);    print "[&nbsp;".number_format($hit_count)."&nbsp;件中の&nbsp;<b>{$from}-{$to}</b>&nbsp;件を表示&nbsp;]<br>\n";    /////////////////////////////////////////////    ////// [ 先頭 / 前へ / 1 / 2 / 3 / ・・・ / 次へ / 最終 ]    /////////////////////////////////////////////    print "[&nbsp;";    // ページ番号が2以上なら「先頭」と「前へ」をリンク表示    if($page >= 2) {     print "<a href=\"?page=1&\">先頭</a>&nbsp;/&nbsp;".        "<a href=\"?page=".($page-1)."&\">前へ</a>&nbsp;/";    // 1ページ目なら「先頭」と「前へ」を灰色表示    } else {     print "<span style=\"color:gray;\">先頭</span>&nbsp;/".        "<span style=\"color:gray;\">前へ</span>&nbsp;/"; }    // ページ別リンクの表示    for($i = 1; $i < $hit_count; $i += $list_up) {     // ページ番号が($link_list_up / 2)以上の場合はページ番号を真中に表示する     if($page >= $link_list_up / 2) {      // 表示リンクページ番号に最大ページ番号が含まれている場合は      // $link_list_upページ分表示させるための判断      if(($i - 1) / $list_up + 1 < ceil($hit_count / $list_up) - $link_list_up + 1) {       // 表示ページ番号を真中にするための処理       if($i <= ($page - ceil($link_list_up / 2)) * $list_up) continue;      }     }     // 表示中のページ番号     if($i == ($page - 1) * $list_up + 1) {      print "&nbsp;<b style=\"color:red;\">".((int)($i / $list_up) + 1)."</b>&nbsp;";     // 表示中でないページ番号     } else {      print "&nbsp;<a href=\"?page=".((int)($i / $list_up) + 1)."&\">".((int)($i / $list_up) + 1)."</a>&nbsp;";     }     // 表示数が$link_list_upに達したら表示ストップ     if($link_list_up == $link_count++) break;     // 次ページがある場合(ページ数の間に「/」を表示したいときはコメントを外す)     //if(((int)($i / $list_up) < (int)($hit_count / $list_up)) &&     //  ($i + $list_up != $hit_count)) print "/";    }    // ページ番号が最大ページ番号未満なら「次へ」と「最終」をリンク表示    if($page < ($hit_count / $list_up)) {     print "&nbsp;/&nbsp;<a href=\"?page=".($page + 1)."&\">次へ</a>&nbsp;".        "&nbsp;/&nbsp;<a href=\"?page=".(ceil($hit_count / $list_up))."&\">最終</a>&nbsp;";    // 最終ページなら「次へ」と「最終」を灰色表示    } else {     print "&nbsp;/&nbsp;<span style=\"color:gray;\">次へ</span>&nbsp;".        "&nbsp;/&nbsp;<span style=\"color:gray;\">最終</span>&nbsp;";    }    print "]\n";   }  }  //$page = (! isset($_GET['page'])?1:((int)$_GET['page']==0?1:$_GET['page']));  if(! isset($_GET['page']))   $page = 1;  else if((int)$_GET['page']==0) $page = 1;  else              $page = $_GET['page'];  // リンクの表示  echo_paging(99, $page); ----------------------------------------------------------- 見やすくするために半角スペースを全角スペースにしているので そのままコピペするとエラーメッセージが表示されます。 全角スペースを半角スペース2個に置換してから実行してください。

blue_baby
質問者

お礼

早速回答していただきありがとうございます。 リンク部分は表示できました。 しかし、メールが1件のみしか表示されません。 また、このようなエラーが表示されます Fatal error: Cannot redeclare echo_paging() (previously declared in C:\Apache Group\Apache2\htdocs\program2\pop3.php:35) in C:\Apache Group\Apache2\htdocs\program2\pop3.php on line 35 補足にあるのが私が作成したソースなのですがどこか不具合がありますでしょうか?ありましたらご指摘よろしくおねがいします。

blue_baby
質問者

補足

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> </head> <body bgcolor="#ffffff"> <center> ***メールリスト一覧*** <br><br> <?php $mbox = @imap_open("{" . $mailserver . ":110/pop3}INBOX", "$user", "$pass"); if ($mbox) { /* 新着確認 */ $mboxes = imap_check($mbox); $hit_count = $mboxes->Nmsgs; echo "新着メールが $hit_count 件あります<br><br>"; /* 1通以上あれば */ if ($hit_count > 0){ /* 各メールのリストを作成 */ for ($i = $hit_count ; $i>= 1; $i--){ $head = imap_header($mbox, $i); $body = imap_body($mbox, $i, FT_INTERNAL); ※この部分にpapillon68様のプログラムを入れております。 文字数の関係上省略させていただきました。 <?php echo htmlspecialchars(mb_decode_mimeheader($head->subject)); ?> <br> <a href="mailbody.php?i= <?php echo $i;?>"> <?php echo htmlspecialchars(mb_decode_mimeheader($head->fromaddress)); ?> </a> <br> <?php } } imap_close($mbox); } else { /* 認証の失敗 */ print("認証エラー<BR>\n"); } ?>

回答No.3

説明不足でした、申し訳ありません。 サンプルでは作成したデータファイルの「code」がない場合、何も表示しないようにできていました。 データの作り方としては --------------------------------------------------------------- 1 タブ データ1 タブ データ2 タブ データ3 タブ データ4 1 タブ データ1 タブ データ2 タブ データ3 タブ データ4 1 タブ データ1 タブ データ2 タブ データ3 タブ データ4 2 タブ データ1 タブ データ2 タブ データ3 タブ データ4 ・ ・ ・ --------------------------------------------------------------- というファイルをテキストで作成し、名前を「abc.log」 として保存します。 アクセスするURLは http://localhost/phpのファイル名?code=1& のような形になります。

回答No.2

[ ○件中の○-○件の表示 ] [ 前へ / 1 2 3 4 5 / 次へ ] のようなリンクを作成するサンプルを以前 http://aki.adam.ne.jp/scripts/question/detail.php?rt=1334&id=1334 に投稿したのですが、確認されましたでしょうか。 abc.log(テキストデータ) に code タブ data1 タブ data2 タブ data3 タブ data4 というデータ(これを一まとめにして一行ずつ)を数十件用意してください。 その上で参考URLのソースをコピーして実行してみてください。 まず動作がblue_babyさんの意図するものかを検証してもらいたいのですがどうでしょうか。 分からない部分がありましたらもう少し解説してみようと思います(@^-^@)

blue_baby
質問者

お礼

何度もご回答ありがとうございます。 サンプルコードまで表示していただいているのですが code タブ data1 タブ data2 タブ data3 タブ data4 というデータとありますがどのような風に作成したらよいのでしょうか? 一度自分で作成してみたのですが、何も表示されませんでした。 単純な質問で申し訳ありませんがご教授よろしくお願いします。

回答No.1

blue_babyさんこんにちは、papillon68と申します。 次のページというのが具体的にどういったものか分かりません。 [ ○件中の○-○件の表示 ] [ 前へ / 次へ ] というようなものでしょうか。 それとも [ ○件中の○-○件の表示 ] [ 前へ / 1 2 3 4 5 / 次へ ] というようなものでしょうか。 ページングするためには  ・現在のページ数(表示中のもの)  ・総メール数  ・1ページで表示するメール数 を元に計算をしてページのリンクを自動生成してくれるプログラムを組むという方法などがあります。 下記の掲示板で以前解答したものがありますので、そちらのURLも貼っておきます。 http://aki.adam.ne.jp/scripts/question/detail.php?rt=1334&id=1334

blue_baby
質問者

補足

言葉足らずで申し訳ありません [ ○件中の○-○件の表示 ] [ 前へ / 1 2 3 4 5 / 次へ ] というようなプログラムを作成したいと考えています。

関連するQ&A

  • 受信メールを表示するには?

    PHPを使って、現在受信しているメールの件名一覧をブラウザに表示するというような、WEBメールの簡易版のようなものを作りたいと思っています。 環境はPOP3/PHP4もしくは5で、できればフリーウェアを入れるより、仕組みを学びながらプログラムを組みたいと思っています。 参考になるサイトやプログラムなどがあれば、教えてください。

    • ベストアンサー
    • PHP
  • mail コマンドだと数件あるのに imap だとメール 0件 

    phpにてメールサーバーよりメールの内容を表示するプログラム作成しています。 mailコマンドを実行するとメールが数件(新着もあり)あるのにもかかわらず、 phpのimap関数だと0件となります。 サーバー上でとりあえずimapもしくはPOP3にてコマンドなどで何件あるのか確認できないのでしょうか?。

  • DBを使用しないで「○件リスト表示&次のページへ」のやり方が・・・

    初めまして。初心者です。 MySQLを使用した指定件数リスト表示のやり方はあったのですが、fopen等を使ってCSVやDATファイルでも同様のことが出来るのでしょうか? どなかたご教授くだされば幸いです。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • チェックを入れたページを表示するには

    こんばんわ。 現在、仮想で検索プログラムをチームで作成しています。 その中で、閲覧履歴を保存して別のページで表示する、というものを作る事になりました。検索してそのページに飛ぶのではなく、閲覧するページにはチェックボックスを置いて、そこにチェックを入れれば、お気に入り登録され、別のページに表示される。表示されたページのリンクを押せば、目的のページに飛べる、といった感じにしたいのですが可能でしょうか?可能ならば、やり方を教えて下さい。 ちなみにWebサーバーはApache,DBはMySQL,プログラミングにはPHPとHTMLを使用し、OSはWindowsXPです。 説明下手で分かりづらいとは思いますが、どうかお願いします。

    • 締切済み
    • PHP
  • ホームページトップでの新着の表示方法について

    下記のサイトの様に、ホームページトップに、新着情報を表示させる方法を教えてください。 http://www.fujiokachuo-hoikuen.jp/ 新着一覧ページから、選んだ項目のタイトルリンクと日付をトップに表示させ、そこから一覧ページへジャンプするというプログラムになります。 ポイントは下記の3つです。 ・新着表示ができる。 ・選んだ項目が表示できる。 ・更新が簡単にWeb上でできる。 以上、どなたか教えて頂けますと幸いです。 また、webシステム全体ではなくプログラム毎にお願いできる制作会社さんや教えていただける学校などはあるのでしょうか。合わせてお願い致します。 どうぞ、よろしくお願い致します。

    • 締切済み
    • CSS
  • ページ切り替え時に点線を表示させたまにしたい。

    タイトルが分かりにくく申し訳ございません。 (WordPressを使っています) 現在、TOPページにインラインフレームを使い、新着情報を表示させています。(ページナビ付き) タイトル下には点線をCSSで表示させていました。 ページナビでページを送ると画面が切り替わるので、そのタイミングでタイトル下の点線が一瞬消えてしまいます。(ページ切り替えなので当たり前の動作ですが) 一瞬でも消さない方法はないかと思い、TOPページに画像として位置を合わせて表示させておきました。 インラインフレーム内の新着情報はページナビで切り替わり、点線はTOPページの画像なので表示されたままには出来たのですが、何も考えずにTOPページに貼りつけただけなので、新着情報の件数に関係なく表示されたままになってしまっています。 新着情報の件数に合わせて表示させ、尚且つページ切り替えの影響を受けづに表示させる方法はないでしょうか。 下記にコードを記述しました。 (HP作成は全くのど素人で記述がなっていない点が山ほどあると思います。ご了承ください) ご享受よろしくおねがいします。 <?php if($_SERVER['REQUEST_URI']=="/top/"): ?> // TOPページにインラインフレーム <iframe frameborder="0" src="http://・・・・/category/news" scrolling="no"></iframe> <div id="dot1"> <img src="<?php bloginfo('template_url'); ?>/images/dot.png" ></div>//点線1 <div id="dot2"> <img src="<?php bloginfo('template_url'); ?>/images/dot.png" ></div>//点線2 //…8件分点線の画像を表示 <div id="dot8"> <img src="<?php bloginfo('template_url'); ?>/images/dot.png" ></div>//点線8 <?php endif; ?> //インラインフレーム内(新着情報) <?php query_posts($query_string . '&' .'showposts=10&category_name=news'); if (have_posts()) : while (have_posts()) : the_post(); ?> <h2><?php the_time('Y.m.d') ?> <a> <?php the_title(); ?></a></h2> <?php endwhile; $pt = $wp_query->max_num_pages; endif; ?> //ページナビ用の$pt <?php wp_reset_query(); ?>

    • ベストアンサー
    • PHP
  • php fsockopenコマンドで新着メールを受け取りHP上に表示し

    php fsockopenコマンドで新着メールを受け取りHP上に表示したいのですが 何分まだ経験不足なのでどうやったらいいかよくわかりません 一応調べて書けるとこまで書いてみたのですが、 ドメイン指定、パスワードの入力、新着メールの受信等がわかりません。 どなたか教えて下さい。 // ソケットオープン $socket = fsockopen('pop.〇〇〇.jp', 110, $error_no, $error_message, 10); if ($socket !== false) {

    • ベストアンサー
    • PHP
  • 「次の10件を表示する」のような表示がしたい

    住所録を表示するページをPHPで作成しました。 問題なくできたのですが、データが増えたので一度に表示するのは例えば20件とかにして、「次の20件」のようなボタンをおすと、 21件~40件を表示させ、そのページには、 「前の20件」と「次の20件」のボタンを表示させたいと考えています。 最初のページには、「前の20件」ボタンはなく、 最後のページには、「次の20件」ボタンは表示させないように考えています。 どのようにすればよろしいでしょうか。 ご教授ください。 ************************************************ 作成したPHP ************************************************ <?php print("<table>"); $cont = mssql_connect("サーバ名","ユーザ名","パスワード"); mssql_select_db('DB名', $cont); $sql = "select * from テーブル名 $rc = mssql_query($sql,$cont); while ($array = mssql_fetch_array($rc)) { print("<tr>"); print("<td>"); print "".$array["氏名"].""; print("</td>"); print("<td>"); print "".$array["住所"].""; print("</td>"); print("</tr>"); } print("</table>"); mssql_close($cont); ?> ************************************************ 環境 PHP5.2 Apache2.2 SQLserverVersion5 PHPとSQLは別サーバになります。 両サーバOS:windows

    • ベストアンサー
    • PHP
  • PHPで「\」をDBにインサートすると「\\」になる件

    宜しくお願いします。PHP初心者です。 今PHP(smartyも利用しています。)とMYSQLで新着情報のプログラムを作成しています。「タイトル」と、「本文」のフォームがあり、それをDBにインサートして表示させるというシンプル?なものです。 ページ遷移は、「フォーム記入ペ-ジ」→「確認ページ」→「登録完了ページ」というふうになっています。 フォーム記入ページで「\」と記入して確認ページに移動すると、「\\」となってしまします。 この原因が分かる方いらっしゃいましたらご教授いただけないでしょうか。

    • ベストアンサー
    • PHP
  • 表示出来ないのと出来るページが、ある

    Webページの表示について アドレスによって表示できるページと表示できないページが、あるのですが何故なのなのでしょうか?。表示できないページの例として、トレンドマイクロのWebページにある okweb入り口 ですとか、OKweb今日の質問のメール添付アドレスの ●オークションページが開かない ここ4~5日前から、ヤフーオークションを見ていて、次ページを... http://virus.okweb.ne.jp/kotaeru.php3?qid=800599 ●ウィルス! こんにちわ!先日訳の分からないメールの添付ファイルを間違えて... http://virus.okweb.ne.jp/kotaeru.php3?qid=800478 などのアドレス。表示できるアドレスの例としては (WeekiyOkweb)の  今日のOK http://okweb.jp/today.php3  株式会社オーケイウェブ  http://www.okweb.co.jp/  OKWeb Communityに関するお問い合わせ http://feedback.okweb.ne.jp/ などです。何故同じソフトで同じ設定であるのに、表示できるアドレスとできないアドレスがあるのでしょか? 不思議でなりません。原因を教えて頂ければ幸いです。 宜しくお願いいたします。

専門家に質問してみよう