プロが教えるわが家の防犯対策術!

現在使用しているPHPにページャーを付けたいと奮闘しているのですが、小生PHPはまだまだ初心者でうまくいきません。
下は管理画面より生年月日や時間を入力することにより、個人のプロフィール等を表示できる表示画面のPHPなのですが、仮に管理画面より100人分入力すると、表示画面に100人表示されてしまうため、それをページャーにて例えば10人分づつ表示するといったものに出来ればと思っております。
回答される方のためにどのようなことを記載しなければいけないのか等もあまり分からない状態で、下に記載している分で不十分かも知れないのですが、足らない分はご指摘を頂ければ可能な限りコメントにて記載させて頂きますのでどうぞよろしくお願いいたします。
PHP Version 5.2.11
-------------
<?php
$fc = 16;
mb_http_output("SJIS");
mb_internal_encoding("UTF-8");
ob_start( 'mb_output_handler' );
require_once('../Smarty.class.php');
// create object
$smarty = new Smarty;
// template, cache, configuration files
$smarty->template_dir = '../templates/';
$smarty->compile_dir = '../templates_c/';
$smarty->config_dir = '../configs/';

$smarty->display('i_header1.tpl');
if (file_exists("../1.txt")){
$file_data = file("../1.txt");
}
//
$arry_cnt = count($file_data)/$fc;
$i=0;
$j=0;
while($i<$arry_cnt){
if (ereg_replace("\n","",$file_data[$i*$fc+15]) == "1"){
$wait_data[$j][rank] = ereg_replace("\n","",$file_data[$i*$fc+0]);
$wait_data[$j][s_name] = ereg_replace("\n","",$file_data[$i*$fc+1]);
$wait_data[$j][old_years] = ereg_replace("\n","",$file_data[$i*$fc+2]);
$wait_data[$j][body_style] = ereg_replace("\n","",$file_data[$i*$fc+3]);
$wait_data[$j][work_time] = ereg_replace("\n","",$file_data[$i*$fc+4]);
$wait_data[$j][time_wait] = ereg_replace("\n","",$file_data[$i*$fc+5]);
$wait_data[$j][comment] = ereg_replace("\n","",$file_data[$i*$fc+6]);
$wait_data[$j][pic_path] = ereg_replace("\n","",$file_data[$i*$fc+7]);
$wait_data[$j][img_href] = ereg_replace("\n","",$file_data[$i*$fc+8]);
$wait_data[$j][name_href] = ereg_replace("\n","",$file_data[$i*$fc+9]);
$wait_data[$j][i_href] = ereg_replace("\n","",$file_data[$i*$fc+10]);
$diff = ereg_replace("\n","",$file_data[$i*$fc+11]);
if (ereg_replace("\n","",$file_data[$i*$fc+11]) > time()) {
$diff = ceil($diff - time());

$m_diff = ceil($diff / 60);
$h_diff = ceil($diff / (60*60));
$d_diff = ceil($diff / (60*60*24));
if ($m_diff <= 60) {
if ($m_diff <= 5) {
$wait_data[$j][time_wait] = '5分待ち';
} elseif ($m_diff <= 10) {
$wait_data[$j][time_wait] = '10分待ち';
} elseif ($m_diff <= 15) {
$wait_data[$j][time_wait] = '15分待ち';
} elseif ($m_diff <= 30) {
$wait_data[$j][time_wait] = '30分待ち';
} elseif ($m_diff <= 45) {
$wait_data[$j][time_wait] = '45分待ち';
} else {
$wait_data[$j][time_wait] = '60分待ち';
}
} elseif ($h_diff <= 24) {
$wait_data[$j][time_wait] = "".$h_diff . '時間待ち';
}
}
$j++;
}
$i++;
}
function cmp($a, $b)
{
return strcmp($a["rank"], $b["rank"]);
}
usort($wait_data, "cmp");

$i=0;
while($j>$i){
$smarty->assign("img_href", $wait_data[$i][img_href]);
$smarty->assign("pic_path", $wait_data[$i][pic_path]);
$smarty->assign("i_href", $wait_data[$i][i_href]);
$smarty->assign("name_href", $wait_data[$i][name_href]);
$smarty->assign("s_name", $wait_data[$i][s_name]);
$smarty->assign("old_years", $wait_data[$i][old_years]);
$smarty->assign("body_style", $wait_data[$i][body_style]);
$smarty->assign("work_time", $wait_data[$i][work_time]);
$smarty->assign("time_wait", $wait_data[$i][time_wait]);
$smarty->assign("comment", $wait_data[$i][comment]);
$smarty->display('i_wait2.tpl');
$i++;
}
$smarty->display('i_footer1.tpl');
?>

A 回答 (2件)

ページャーの実装方法はいろいろありますが、一番簡単なものを実装してみました。


実装するに当たり、大分スクリプトを書き換えてしまいましたが、ご勘弁を。
18行目あたりの記述と、53行目あたりの記述、また、create_pager関数のあたりがページャーの実装というところです。
<?php
define('FC', 16);
define('DATA_LIMIT', 10);
define('LOG_FILE_PATH', '../1.txt');
mb_http_output('SJIS');
mb_internal_encoding('UTF-8');
require_once '../Smarty.class.php';

$DATA_KEYS = array(
'rank', 's_name', 'old_years',
'body_style', 'work_time', 'time_wait',
'comment', 'pic_path', 'img_href',
'name_href', 'i_href'
);



$page = 1;
if(isset($_GET['page'])){
$page = (int) $_GET['page'];
if($page == 0) $page = 1;
}


ob_start('mb_output_handler');


$smarty = new Smarty();
$smarty->template_dir = '../templates/';
$smarty->compile_dir = '../templates_c/';
$smarty->config_dir = '../configs/';

$smarty->display('i_header1.tpl');

if (file_exists(LOG_FILE_PATH) && is_readable(LOG_FILE_PATH)){

$wait_data = array();
$fp = fopen(LOG_FILE_PATH, 'r');
while(!feof($fp)){
$buff = array();
for($j=0; $j<FC; $j++){
$buff[] = rtrim(fgets($fp, 4096));
}
if(isset($buff[FC-1]) && $buff[FC-1] == "1"){
$wait_data[] = format_array($buff);
}
}

if(!empty($wait_data)){

usort($wait_data, "cmp");

$start = ($page - 1) * DATA_LIMIT;
$end = ($page * DATA_LIMIT);

$data_count = count($wait_data);
if($data_count <= $end){
$end = $data_count;
}

for($i=$start; $i<$end; $i++){
foreach($DATA_KEYS as $key){
$smarty->assign($key, $wait_data[$i][$key]);
}
$smarty->display('i_wait2.tpl');
}
$smarty->assign('pager', create_pager($data_count, $page));
$smarty->display('i_footer1.tpl');
}else{
exit('logがありません');
}

}else{
exit('logファイルが開けません');
}



function create_pager($data_count, $this_page){
$script = $_SERVER['PHP_SELF'];
$pages = ceil($data_count / DATA_LIMIT);

$ret = array();

for($i=1; $i<$pages+1;$i++){
if($i == $this_page){
$ret[] = $i;
}else{
$ret[] = '<a href="'.$script.'?page='.$i.'">'.$i.'</a>';
}
}

return implode(' | ', $ret);

}

function format_array($data){
global $DATA_KEYS;

$ret = array();
foreach($DATA_KEYS as $num => $name){
$ret[$name] = $data[$num];
}
$wait_time_str = get_wtime_str($data[$num+1]);
if($wait_time_str !== false){
$ret['time_wait'] = $wait_time_str;
}

return $ret;
}

function get_wtime_str($diff){
$time = time();
if($diff <= $time) return false;

$diff = ceil($diff - $time);
$m = ceil($diff / 60);
$h = ceil($diff / (60*60));
$d = ceil($diff / (60*60*24));

if($m <= 60){
$num = 60;
for($i=5; $i<60; $i+=5){
if($m <= $i){
$num = $i;
break;
}
}
return "{$num}分待ち";
}elseif($h <= 24){
return "{$h}時間待ち";
}

return false;
}

function cmp($a, $b){
return strcmp($a['rank'], $b['rank']);
}

?>
    • good
    • 0
この回答へのお礼

hogehoge78様
回答ありがとうございました。
たいへん助かりました。
早速試してみたところ、うまく動作しました。
ところでhogehoge78様が作られたものではフッターのテンプレートにpagerを挿入することで表示することは出来たのですが、ヘッダーのテンプレートに挿入した時は、表示が出来ませんでした・・。
仮にヘッダーのテンプレートにも表示させたい場合は、なにか付け加える必要があるのでしょうか?
また質問と少し離れるかも知れませんが、最初に当方で掲載したスクリプトを書き換えられた理由を教えていただけますでしょうか?
恥ずかしながらどうして書き換える必要があったのかすら、分からないのです・・。
お手隙な折にご回答くださいませ。

お礼日時:2009/12/17 14:10

■ヘッダにもページャを表示するために


>$smarty->display('i_header1.tpl');
の記述を、
$data_count = count($wait_data);
の後ろに持ってきて、
$smarty->assign('pager', create_pager($data_count, $page));
の記述を、$smarty->display('i_header1.tpl');
の上に持ってくれば恐らくいけます。

■なぜ書き換えたのかについて
ページャの実装は、ソース見ていただくと分かるとおり、
取得したデータの件数をカウントする必要があります。

また、適当なことを書いて実際に上手く動かないといった場合
何度も修正コードを投稿せねばならない可能性があります。

その為、今回質問者さんの投稿されたソースを理解する必要があり、
かつ、どこに挿入すれば上手く動くかを検討するために
一度テスト環境に同様なディレクトリ構成(require_onceや、file関数で取得しているパスとか)をつくって、実際に実行して試してます。

しかしながら、okwaveの投稿は、ソースのインデントが表示されないのと、今回のソースの内容が煩雑で分かりづらかった為、
理解した順番にソースを記述していきました。

その際、効率の悪い記述(関数にまとめたら楽そうな部分とか)や、
適していない関数(正規表現を使わない置換でereg_replaceを使うよりかは、str_replaceのほうが良い)などを適当に切り分けて
まとめてしまいました。

ついでに、PHPはまだ初心者と仰られていましたので、「こういう書き方も出来る」というのをお伝えしたかったというのもまた一つの理由です。

もし、問題があるのであれば、必要箇所(ページャの考え方)だけ抽出して、元のコードに当てはめて頂ければと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
hogehoge78様の方法にてヘッダーにも表示することが可能になりました。

書き換えのことに関しては全く問題はないのですが、不思議に思った為伺いました。

PHPに関してはまだまだお伺いしたいことがございますが、色々試して挑戦し、壁にぶつかった際、あらためて質問をたてます。

この度は貴重なお時間を割いて頂き、ありがとうございました。

お礼日時:2009/12/18 14:18

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