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);
-------------------------------------------------
といったイメージです。
回答ありがとうございました。
教えていただいたとおりにプログラムを作成して、動作確認を行いました。
正常に動作させることができました。
長々とお付き合いくださりありがとうございました。
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タグはどの段階で閉じられているのでしょうか。
この回答への補足
タグの抜け落ち、エラー部分を訂正しました。
ご指摘よろしくお願いします。
<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");
}
?>
何度も回答ありがとうございます。
エラーメッセージは、ご指摘していただいたとおりfor文を使用していたためでした。
>「全データをそのままずらずらっと表示することができる」ということを前提で話していましたが、この部分はできないということでしょうか。
メールをそのままずらずら表示させることはできました。しかし、ページリンクのプログラムを挿入する部分が間違っているのか、指定した件数ずつ表示されません。
<?phpタグはミスで抜け落ちていました。
申し訳ありませんでした。
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 "[".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");
}
?>
早速回答していただきありがとうございます。
リンク部分は表示できました。
しかし、メールが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
補足にあるのが私が作成したソースなのですがどこか不具合がありますでしょうか?ありましたらご指摘よろしくおねがいします。
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.ph …
に投稿したのですが、確認されましたでしょうか。
abc.log(テキストデータ) に
code タブ data1 タブ data2 タブ data3 タブ data4
というデータ(これを一まとめにして一行ずつ)を数十件用意してください。
その上で参考URLのソースをコピーして実行してみてください。
まず動作が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.ph …
この回答への補足
言葉足らずで申し訳ありません
[ ○件中の○-○件の表示 ]
[ 前へ / 1 2 3 4 5 / 次へ ]
というようなプログラムを作成したいと考えています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- IT・エンジニアリング ★お手上げ状態です。助けてください。ActiveReportについて 1 2023/08/20 04:29
- Visual Basic(VBA) ★お手上げ状態です。助けてください。ActiveReportについて 1 2023/08/20 04:27
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- その他(IT・Webサービス) google サイトの目次表示について 1 2023/06/17 23:24
- Excel(エクセル) excelvbaでスライドショーを作りたい 2 2023/04/20 14:32
- その他(プログラミング・Web制作) プログラムが書けません。 6 2023/01/22 22:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DTOとEntityの差は何ですか。
-
wordの差し込み印刷で文字...
-
【C#】DataGridViewの最大列数...
-
TCPDFでのHTML出力
-
C#でのForm間のデータ受け渡し...
-
WordでExcelデータを差込...
-
excel access連携 このテーブル...
-
rsyncでのエラー(sh: rsync: no...
-
エクセルVBAで楽天証券に注...
-
ページ切り替え機能
-
htmlについて.sqlの表示
-
小数点以下を含む計算でバグが...
-
「外部データの取り込み」とい...
-
Excelピポットテーブルでの表示...
-
回線速度が64kbpsだったら、64k...
-
ActiveReportのサブレポート機...
-
MSFlexGridのデータを初期化し...
-
VB.NET 2017の勉強中です。 今...
-
C言語で地図を描きたい
-
★お手上げ状態です。助けてくだ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
wordの差し込み印刷で文字...
-
DTOとEntityの差は何ですか。
-
【C#】DataGridViewの最大列数...
-
excel access連携 このテーブル...
-
WordでExcelデータを差込...
-
ActiveReportのサブレポート機...
-
GridViewからチェックボックス...
-
★お手上げ状態です。助けてくだ...
-
VBA内でのGetPixelを使用した時...
-
表を表示するコントロールについて
-
Windowsのマクロプログラムで、...
-
INIファイルに一括書き込みを行...
-
MSFlexGridのデータを初期化し...
-
C#でのForm間のデータ受け渡し...
-
「外部データの取り込み」とい...
-
C言語で地図を描きたい
-
小数点以下を含む計算でバグが...
-
エクセルVBAで楽天証券に注...
-
CSVのインポート【ASP.NET】
-
画像の読み込み&白黒判別プロ...
おすすめ情報