dポイントプレゼントキャンペーン実施中!

宜しくお願いします。
下記URLを参考にアイテム別ページを作成したのですが
データ量が多い為クエリを利用して10件毎にページを分けたいのですが
やり方が思い浮かびませんどのように記述すれば出来ますでしょうか
http://affiliate.aki-f.com/prog/page/33.html




<?php
require_once('common.php');
$Cid=$_GET['cid'];
$Data=file('cat.csv');
for($i=0;$i<sizeof($Data);$i++){
$line=explode(",",$Data[$i]);
if($line[0]==$Cid){
$CatTitle=$line[1];
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<title><?=$CatTitle?> | サンプルリンク集</title>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<body>
<a href="index.php">HOME</a>
<h1><?=$CatTitle?></h1>
<table border="1">
<tbody valign="top">
<?php
$Data=file('item.csv');
for($i=0;$i<sizeof($Data);$i++){
$line=explode(",",$Data[$i]);
if($line[1]==$Cid){
$ImageLink=DeleteEsc($line[2]);
$TextLink =DeleteEsc($line[3]);
?>
<tr>
<td><?=$ImageLink?></td>
<td>
<?=$TextLink?><br><br>
<a href="item.php?id=<?=$line[0]?>">詳細を見る</a>
</td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</body>
</html>




item.csvファイルの中身は

あいうえお,abc
かきくけこ,efg
さしすせそ,hij
たちつてと,lmn

以下省略

A 回答 (3件)

for($i=$P*9;$i<$P*9+9;$i++){ のところ。


検索でヒットした場合のみカウントする必要がありますが、これだとヒットするしないにかかわらず$iがカウントされます。その結果、そのページの内でヒットした分だけが表示されるため「ページ毎に表示件数がバラバラ」になるのでしょう。
混乱しないようまずは該当データのみ抜き出してみるとか。
--------------------------------------
//ヒットしたデータ用の配列を用意
$Data_hit=array();
//とりあえずヒットするデータを取得する
foreach($Data2 as $val){
$line=explode(",",$val);
if($line[1]===$Cid) array_push($Data_hit,$line);
}

//ヒットしたデータを更に表示する分に切り詰める
$Data_hit = array_slice($Data_hit,$P*9,9,TRUE);

//あとは表示するだけ
foreach($Data_hit as $line){
echo "$line[0] $line[1]<br>";
}
----------------------------------------
あるいは 2回まわすのがいやなら

//件数は設定変更できるよう変数にしとく。
$kensuu = 9;
//必要な計算をしておいて
$start = $P*$kensuu;
$end = $start+$kensuu;
//該当データのカウント用
$c=0;

//$Data2を回して…
foreach($Data2 as $val){
$line=explode(",",$val);
//該当しなければ、次へ
if($line[1]!==$Cid) continue;
//ここに来る=該当した、ということなのでカウントして
++$c;
//$start以下なら、関係ないので次へ
if( $c <=$start) continue;
//$endまで来たら、おしまい
if( $c >$end) break;

//ここまで来れば、Hitかつ表示範囲内ということなので表示
echo "$line[0] $line[1]<br>";
}
----------------------------------------
とか。
あるいはまた、いちいち Page=3 とかで計算しないで直で表示開始の番号を受け取るAno2さんの方法でも。どちらにしても、せめてfunction、できればclassにした方がよいとは思いますが。

この回答への補足

無事やりたい事が出来ました
これから自分でイジりながら改良して行きたいと思います
本当にありがとうございました!

補足日時:2012/04/05 15:42
    • good
    • 0

fileで全件読み込んでいるのですから比較的楽なケースだと思います。

「表示スキップ件数」をQueryStringで引き渡すようにして(存在しなければ0=スキップしない)forの開始数値を変えるだけでいいと思います。

最後まで表示していなければ(forのLoop内で表示件数の条件でbreakするときには)「次の○○件」のanchor要素を出力(QueryStringで、?skip=10などを生成)すればいいです(件数部分は($skip + 10)で書けます)。

この回答への補足

ありがとうございます!
回答者No.1さんとは別のやり方なのでしょうか
QueryStringというのを参考書で調べましたが載ってませんでした
なのでググって調べてみましたがよくわかりませんでした
QueryStringとはどういう処理をする物なのでしょうか?

補足日時:2012/04/04 15:59
    • good
    • 0

たくさんあるデータをページ分割して表示したいということですよね。


データを表示するほかに、次へ >> などでのページ送りのリンクも必要になってきます。「ページング」と呼ばれていて、あちこちで解説されていますからググってみてくだい。

考え方の一例として、1ページ10件で、Page=1 等で受け取れば、
Page=1の時  0~ 9
Page=2の時 10~19
Page=3の時 20~29

となりますよね。ということは、
($Page -1) x 件数 から (件数)個のデータを取得・表示すればよいということになります。

以下が分かりやすいかも。
http://fstyle.ddo.jp/archives/2005/10/cgiphp_1.h …
http://tenderfeel.xsrv.jp/php/639/

※一応「 PHP ページャー 」で探せばPEARをはじめいろいろ配布されてはいますが、一度自分のロジックで作成してみることをお勧めします。
    • good
    • 0
この回答へのお礼

ありがとうございます!質問のURLと同じ所にある
http://affiliate.aki-f.com/prog/page/38.html
を参考にページ送りのリンクを作成し
10件以下の表示には成功出来たのですが
for文の良い回し方?が思いつかず
現状ページ毎に表示件数がバラバラの状態です。
以下が現在のphp文章です
恐らく後一歩の段階だと思うのですがどうすれば良いのでしょうか…




<?php
require_once('common.php');
$Cid=$_GET['cid'];
$P=$_GET["p"];
$Data=file('cat.csv');
$Data2=file('item.csv');
for($i=0;$i<sizeof($Data);$i++){
$line=explode(",",$Data[$i]);
if($line[0]==$Cid){
$CatTitle=$line[1];
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<title><?=$CatTitle?> | サンプルリンク集</title>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<body>
<a href="index.php">HOME</a>
<h1><?=$CatTitle?></h1>

<?php
//解説(2)
if($P>0){
$Prev=$P-1;
$PrevPage="<a href='cat.php?cid=1&p={$Prev}'>前の10件</a>";
}
//解説(3)
$Size=sizeof($Data2);
if($Size/10-1>$P){
$Next=$P+1;
$NextPage="<a href='cat.php?cid=1&p={$Next}'>次の10件</a>";
}

echo "$PrevPage $NextPage";

echo "<br />";

?>




<table border="1">
<tbody valign="top">
<?php
for($i=$P*9;$i<$P*9+9;$i++){
$line=explode(",",$Data2[$i]);
if($line[2]==$Cid){
$ImageLink=DeleteEsc($line[2]);
$TextLink =DeleteEsc($line[3]);
?>
<tr>
<td><?=$ImageLink?></td>
<td>
<?=$TextLink?><br><br>
<a href="item.php?id=<?=$line[0]?>">詳細を見る</a>
</td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</body>
</html>

お礼日時:2012/04/04 15:51

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