アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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);
-------------------------------------------------
といったイメージです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/18 14:59

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タグはどの段階で閉じられているのでしょうか。

この回答への補足

タグの抜け落ち、エラー部分を訂正しました。
ご指摘よろしくお願いします。

<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");
}
?>

補足日時:2006/01/18 09:36
    • good
    • 0
この回答へのお礼

何度も回答ありがとうございます。

エラーメッセージは、ご指摘していただいたとおりfor文を使用していたためでした。

>「全データをそのままずらずらっと表示することができる」ということを前提で話していましたが、この部分はできないということでしょうか。

メールをそのままずらずら表示させることはできました。しかし、ページリンクのプログラムを挿入する部分が間違っているのか、指定した件数ずつ表示されません。

<?phpタグはミスで抜け落ちていました。
申し訳ありませんでした。

お礼日時:2006/01/18 09:26

リンク表示部分だけを抜粋し、関数化しました。


※データ部分(メールのタイトルのみテーブル表示でしょうか)は関数外で行うか
 もしくは、関数内でデータ部分の表示もできるように拡張するなどが必要です。

----------------------------------------------------------
 /********
 * [ ○ 件中の ○-○ 件を表示 ]
 * [ 先頭 / 前へ / 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 "[".number_format($hit_count)."件中の<b>{$from}-{$to}</b>件を表示]<br>\n";
   /////////////////////////////////////////////
   ////// [ 先頭 / 前へ / 1 / 2 / 3 / ・・・ / 次へ / 最終 ]
   /////////////////////////////////////////////
   print "[";
   // ページ番号が2以上なら「先頭」と「前へ」をリンク表示
   if($page >= 2) {
    print "<a href=\"?page=1&\">先頭</a>/".
       "<a href=\"?page=".($page-1)."&\">前へ</a>/";
   // 1ページ目なら「先頭」と「前へ」を灰色表示
   } else {
    print "<span style=\"color:gray;\">先頭</span>/".
       "<span style=\"color:gray;\">前へ</span>/";
}
   // ページ別リンクの表示
   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 "<b style=\"color:red;\">".((int)($i / $list_up) + 1)."</b>";
    // 表示中でないページ番号
    } else {
     print "<a href=\"?page=".((int)($i / $list_up) + 1)."&\">".((int)($i / $list_up) + 1)."</a>";
    }
    // 表示数が$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 "/<a href=\"?page=".($page + 1)."&\">次へ</a>".
       "/<a href=\"?page=".(ceil($hit_count / $list_up))."&\">最終</a>";
   // 最終ページなら「次へ」と「最終」を灰色表示
   } else {
    print "/<span style=\"color:gray;\">次へ</span>".
       "/<span style=\"color:gray;\">最終</span>";
   }
   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個に置換してから実行してください。

この回答への補足

<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");
}
?>

補足日時:2006/01/17 15:38
    • good
    • 0
この回答へのお礼

早速回答していただきありがとうございます。
リンク部分は表示できました。
しかし、メールが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

補足にあるのが私が作成したソースなのですがどこか不具合がありますでしょうか?ありましたらご指摘よろしくおねがいします。

お礼日時:2006/01/17 15:38

説明不足でした、申し訳ありません。



サンプルでは作成したデータファイルの「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&
のような形になります。
    • good
    • 0

[ ○件中の○-○件の表示 ]


[ 前へ / 1 2 3 4 5 / 次へ ]

のようなリンクを作成するサンプルを以前

http://aki.adam.ne.jp/scripts/question/detail.ph …

に投稿したのですが、確認されましたでしょうか。


abc.log(テキストデータ) に

code タブ data1 タブ data2 タブ data3 タブ data4

というデータ(これを一まとめにして一行ずつ)を数十件用意してください。
その上で参考URLのソースをコピーして実行してみてください。


まず動作がblue_babyさんの意図するものかを検証してもらいたいのですがどうでしょうか。

分からない部分がありましたらもう少し解説してみようと思います(@^-^@)
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/17 13:52

blue_babyさんこんにちは、papillon68と申します。




次のページというのが具体的にどういったものか分かりません。

[ ○件中の○-○件の表示 ]
[ 前へ / 次へ ]
というようなものでしょうか。

それとも

[ ○件中の○-○件の表示 ]
[ 前へ / 1 2 3 4 5 / 次へ ]
というようなものでしょうか。


ページングするためには
 ・現在のページ数(表示中のもの)
 ・総メール数
 ・1ページで表示するメール数
を元に計算をしてページのリンクを自動生成してくれるプログラムを組むという方法などがあります。



下記の掲示板で以前解答したものがありますので、そちらのURLも貼っておきます。
http://aki.adam.ne.jp/scripts/question/detail.ph …

この回答への補足

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

補足日時:2006/01/16 17:08
    • good
    • 0

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