スレッド表示 | フラット表示〕 全トピック 920 件中 110 番目 次≫ ≪前

リンクを表示?

created: 2007-06-18 16:15 | modified: 2007-06-20 22:58 | reply: 7

[3778] リンクを表示?

user: 里美 | created: 2007-06-18 16:15
以前にお世話になった者です。また、分からない事があるので教えて下さい。
今回は2点ほど聞きたい事があります。
下のコードは少々長いですが、よろしくお願いします。

cate.csvとitem.csvを使って、ホームページを作っています。

トップページ、カテゴリページ、商品ページが表示されるようになっています。

質問1・トップページでの表示について?

トップページに

各カテゴリの最新商品5件だけ表示できるようにしたい。もっと見る場合はそのカテゴリページへリンクを貼りたい。

(こんなかんじ)

トップページ

◆カテゴリA
1・商品1(商品ページへ)
2・商品2
3・商品3
4・商品4
5・商品5

もっと見る場合はここをクリック(カテゴリページへリンク)

◆カテゴリB



もっと見る場合はここをクリック

以下同じ感じで。


質問2・各商品ページにカテゴリページで表示される全商品を表示&リンク

(こんなかんじ)

商品ページで

商品2
説明文

商品1|商品2|商品3|商品4|商品5|・・・

(カテゴリAならAの全商品と言う意味です)

このようにしたいのですが、ほどんど初心者である為、良く分かりません。

ここからコードです。

<?php
$C=$_GET["c"]; //クエリからパラメータを取得
$ID=$_GET["id"]; //クエリからパラメータを取得(アイテム)
$DATA=file("item.csv"); //CSVファイルを1行1要素で配列に読み込む
$CAT_DATA=file("cate.csv"); //カテゴリ用CSVファイルを読み込む

//CSVファイルからページデータを獲得する関数
//@引数 $id :ページID
//@戻り値 array :ページデータ
//(該当するIDがなければ空の配列を返す)

function getPageRecord ( $id )
{
$filename = 'cate.csv'; // CSVファイル名
$maxlen = 10240; // 1行の最大長(バイト)


$record = array();
if ($fp = fopen($filename, 'r')) {
while ($rec = fgetcsv($fp, $maxlen, ',')) {
if ($rec[0] == $id) {
$record = $rec;
break;
}
}
fclose($fp);
}
return $record;
}

//ページデータ獲得
$page = getPageRecord($_GET['c'])


//獲得したデータのレイアウト(カテゴリページ用のトップ)
?>
<?php
if($C){


//ここからカテゴリページ

<html>
<body>


//パラメータがある場合の処理(カテゴリ別のページを表示)


for($i=sizeof($DATA)-1;$i>=0;$i--){ //$DATAの要素を一つずつ読み込みながら以下の処理を行う
$line=explode(",",$DATA[$i]); //1要素をさらにカンマで分解し配列に格納
if($line[1]==$C){ //もしパラメータとカテゴリ番号が一致すれば表示

◆◆◆ここはカテゴリページが表示されます◆◆◆

}
}

}elseif($ID){ //パラメータ[id]がある場合の処理(アイテムの個別ページを表示)



//ここからアイテムのCSV参照(商品ページ)

for($i=0;$i<sizeof($DATA);$i++){ //$DATAの要素を一つずつ読み込みながら以下の処理を行う
$line=explode(",",$DATA[$i]); //1要素をさらにカンマで分解し配列に格納
if($line[0]==$ID){ //もしパラメータとアイテム番号が一致すれば表示

//ここから入れ子(ネスト)になっている
for($n=0;$n<sizeof($CAT_DATA);$n++){ //カテゴリーリストを読み込む
$lines=explode(",",$CAT_DATA[$n]);
if($lines[0]==$line[1]){ //アイテムデータのカテゴリIDと一致すれば「リスト」を表示


//ここから商品ページです
<html>
<body>
//入れ子ここまで


◆◆◆ここは商品が表示されるようになっています◆◆◆


◆◆◆◆◆ここに質問2を入れたい◆◆◆◆◆

}
}


}
}

}else{


//トップページ


<html><head>
</head>
<body>

◆◆◆◆◆ここに質問1を入れたい◆◆◆◆◆

}
?>
</body>
</html>
reply: 3779 返信 編集 削除

[3779] Re. リンクを表示?

user: ゆうじ | created: 2007-06-19 00:51
こんばんわ。

制御構造で気になる所はまったくありませんし
CSVファイルを読んで利用する方法も
理解されてるように見受けられますが、
何がわからないのでしょうか。


コードを見て感じたのは、
表示処理の中にデータ獲得処理があるので、
可読性が悪くなって、迷子になる可能性が高いなと思います。

$DATA = file("item.csv");
$CAT_DATA = file("cate.csv");

↑せっかくはじめのところで、
cate と item のデータを全て読み込んでいらっしゃるので、
この時点で完全な2次元配列にしてしまえば
表示処理の中でループを入れ子にして可読性を落とすこともなくなります。

その上で、データ操作に関わるユーザ定義関数を
あらかじめこの程度用意しておけば
表示は表示でスッキリ書けると思います。

必要があれば、希望のデータが得られるような
ユーザ定義関数を増やして下さい。

もし、見当違いならおっしゃってください。

/*
* CSVファイルを全て読み込んで2次元配列で返す
*/
function loadCsv ( $filename )
{
if (!is_file($filename) || !is_readable($filename)) {
return false;
}

$maxlen = 10240;
$records = array();

if ($fp = fopen($filename, 'r')) {
while ($rec = fgetcsv($fp, $maxlen, ',')) {
$records[$rec[0]] = $rec;
}
fclose($fp);
}

return $records;
}

/*
* $id に一致する商品のレコードを返す
* 引数:商品ID
*/
function getItem ( $id )
{
global $DATA;
return $DATA[$id];
}

/*
* $id に一致するカテゴリのレコードを返す
* 引数:カテゴリID
*/
function getCategory ( $id )
{
global $CAT_DATA;
return $CAT_DATA[$id];
}

/*
* カテゴリに含まれる商品のリストを返す
* 引数:カテゴリID
*/
function getCateItems ( $id )
{
global $DATA;

$records = array();
foreach ($DATA as $key => $rec) {
if ($rec[1] == $id) {
$records[$key] = $rec;
}
}
return $records;
}


/*
* CSVをロード
*/
$DATA = loadCsv("item.csv"); // 商品リスト
$CAT_DATA = loadCsv("cate.csv"); // カテゴリーリスト

/*
* クエリからパラメータを取得
*/
$C = $_GET["c"]; // カテゴリID
$ID = $_GET["id"]; // 商品ID


/*
* 途中省略
*/


/*
* $C に該当するカテゴリを得るには
*/
$category = getCategory($C);

/*
* $id に該当する商品を得るには
*/
$item = getItem($id);

/*
* カテゴリ $C に属する商品リストを得るには
*/
$items = getCateItems($C);

/*
* 商品 $id と同じカテゴリに属する商品リストを得るには
*/
$item = getItem($id);
$items = getCateItems($item[1]);
Parent: 3778  reply: 3782 返信 編集 削除

[3782] Re. リンクを表示?

user: 里美 | created: 2007-06-19 10:30
ゆうじ様へ

こんにちは、お返事ありがとうございました。

そして、いろいろと書いていただきありがとうございます。。

実は、私はphpはほとんど分からず私が書いたコードも人のを参考にして以前ゆうじさんにも助けてもらってなんとなく出来た物でもっともっと勉強しなくてはいけないのですが、早急に問題を解決したいと思っています。


今のコードではとりあえず基本的な事は出来ています。

今回の質問は
1・トップページに各カテゴリの最新商品5件を表示し、詳しく見る場合は各カテゴリページへ飛ぶようにしたい。

2・各商品ページで同じカテゴリで表示されている物を表示&リンクさせたいです。

以上の2点ですが、トップページと商品ページの部分にコードを記載しなければいけないと思うのですが、そのコードの書き方が分かりません。

ためしに、私のコードにゆうじさんが書いた物を何度か上書きしてアップしてみたのですが、トップページしか表示されずカテゴリページも上手く表示できませんでした。(このようなレベルですがよろしくお願いします)
Parent: 3779  reply: 3783 3784 返信 編集 削除

[3783] Re. リンクを表示?

user: ゆうじ | created: 2007-06-19 20:41
ふと思いましたが、
リンクを表示?ってことはリンクを張るための
タグがわからないってことではありませんよね。
以下みたいな。

<a href="http://****/**.php?c=<?php echo $カテゴリID; ?>">このカテを見る</a>

時間がないので今はこの確認だけです。
別途長文を用意しています。お楽しみに。
Parent: 3782  返信 編集 削除

[3784] コードに落とし込むまでの例

user: ゆうじ | created: 2007-06-20 01:22
コードの書き方・・・ってかなり漠然ですね。
「上手く表示できませんでした」と書くより
「このように表示されました」とか
「・・・というエラーメッセージがでました」
と今起こっている現象をお知らせ頂ければ
こちらも判断材料になるのですがね。

文章を読めばコードを想像できるくらいまで、
考えてることを具体化する作業を丁寧に行えば
わからないことが具体的に表現できますし、
コードも自力で書けるようになりますよ。

以下のお題をより具体的な処理や値に分解してみましょう。

1・トップページに、各カテゴリの最新商品5件を表示し、詳しく見る場合は各カテゴリページへ飛ぶようにしたい。

これは最終的に、
以下のような構成になりますね。

トップページ

+ カテゴリー1
+ 最新商品1
+ 最新商品2
+ 最新商品3
+ 最新商品4
+ 最新商品5
+ カテゴリ1へのリンク

+ カテゴリー2
+ 最新商品1
+ 最新商品2
+ 最新商品3
+ 最新商品4
+ 最新商品5
+ カテゴリ2へのリンク

+ カテゴリー3
+ 最新商品1
+ 最新商品2
+ 最新商品3
+ 最新商品4
+ 最新商品5
+ カテゴリ3へのリンク

ここではどんなデータが必要かというと

【1】全カテゴリのリスト
【2】カテゴリに含まれるの最新5件の商品リスト

カテゴリへのリンクは、
カテゴリのidだけあれば良いので【1】で得られます。


【1】については、スクリプトのはじめに
CSVをロードしてるのでこのまま使えます。

【2】については、
先に作った getCateItems関数 で得た商品リストを、
さらに、登録日をキーに、下り順に並べ替えて、
はじめの5件だけ得る必要があります。

これに関しては、
どのカテゴリでも同じなので、使いまわしがきくよう
新たに以下のようなユーザ定義関数にまとめます。

<?php
/*
* 登録日を下り順で並べ替えるuasort用関数
*/
function sort_date_down ( $商品A, $商品B )
{
if ($商品A[登録日] == $商品B[登録日]) {
return 0;
} else if ( $商品A[登録日] < $商品B[登録日] ) {
return 1;
} else {
return -1;
}
}

/*
* カテゴリーに含まれる最新の商品のリストを返す
* $件数はオプション:デフォルトで5件
*/
function getNewCateItems ( $カテゴリID, $件数 = 5 )
{
$全商品リスト = getCateItams($カテゴリID);
if (!is_array($全商品リスト) || !count($全商品リスト)) {
return false;
}

uasort($全商品リスト, 'sort_date_down');

$最新商品リスト = array();
$n = 0;
foreach ($全商品リスト as $商品ID => $商品) {
if ($n < $件数) {
$最新商品リスト[$商品ID] = $商品;
$n++;
} else {
break;
}
}
return $最新商品リスト;
}
?>

必要なデータを得る準備ができたところで、
全体の構成に合うよう表示処理を組み立てると
こんな具合になるではないでしょうか。

<?php
// トップページ

foreach ($全カテゴリリスト as $カテゴリID => $カテゴリ) {
echo $カテゴリ[カテゴリ名];
$最新商品リスト = getNewCateItems($カテゴリID, 5);
foreach ($最新商品リスト as $商品) {
echo $商品[商品名];
}
echo '<a href="http://****/***.php?c=', $カテゴリID, '">このカテゴリへ</a>';
}
?>

echo の部分は、見栄え良くHTMLに整形してもらうとして、
日本語で書いた変数と値を訂正すれば
お題のコードの出来上がりです。

わからないところは、細かく突っ込んでください。
Parent: 3782  reply: 3785 返信 編集 削除

[3785] Re.コードに落とし込むまでの例

user: 里美 | created: 2007-06-20 13:52
ゆうじさんへ

お返事ありがとうございます。
早速試してみたのですがエラーです。
Warning: Invalid argument supplied for foreach() in
と出てしまいました。

ゆうじさんの説明をよく読んでみると

>日本語で書いた変数と値を訂正

とあり、これが先ずわかりません。そのまま、コピー貼り付けしてアップしたらエラーでした。

csvですが

cate.csv
カテゴリー,id,キャッチコピーH1,説明文,メタ説明文,キーワード1,キーワード2,ページタイトル,,,,

item.csv
Id,カテゴリID,リンクURL,画像URL,正式商品名,略式商品名,価格,商品詳細,,,,,,

このようになっています。

変数と値がわからないです。




それと、CSVなんですが、cate.csvとitem.csvを一番上の階層におき、その下にいくつかフォルダを作って各index.phpを作ろうと思います。
そうなると各、index.phpには全てのカテゴリが表示される事になると思います。

各カテゴリは違うジャンルな為、任意でカテゴリを選ぶようにしたいです。




また、CSVなんですが、どのくらい商品データを入れて平気でしょうか?
ロリポップサーバーを使用していますが、どのくらいまでなら耐えられるのでしょうか?

重ね重ねの質問ですが、よろしくお願いします。
Parent: 3784  reply: 3786 返信 編集 削除

[3786] 日本語の変数と値

user: ゆうじ | created: 2007-06-20 16:59
> 変数と値がわからないです。

「変数」の書式は「 $変数名 」なので
普通なら 「$CAT_DATA」 と書くところを
「$全カテゴリリスト」と書いてます。

「値」は、頭に $ の無い日本語で、
実際の数値や文字列を示してます。
「登録日」は、商品データの中の
登録日にあたるフィールドの値のことで、
登録日のフィールドが8番目なら
$商品A[登録日] は、$itemA[7] になります。

アイデアをコードにするまでの過程を
理解いただくのに変数や値を日本語で書いただけなので
里美さんが決めたルールに基づいて
これらを実行できるよう書き直してください。

「変数」がどういうものかということなら
マニュアルにあるのでご覧いただいた上で
わからないことがあればあらためて質問ください。
http://jp.php.net/manual/ja/language.variables.php


item.csv を見る限り
登録日らしきフィールドがありませんが、
登録日が無いと、どれが新しい商品なのか判断できませんよね。
ここに書いてないけど実際あるならば良いのですが。



> 各カテゴリは違うジャンルな為、任意でカテゴリを選ぶようにしたいです。

希望が次々と増えてる気がしますが、
これに対して、私は何を応えればいいのでしょうか?


> また、CSVなんですが、どのくらい商品データを入れて平気でしょうか?

多くのサーバで、PHPが使える最大メモリーは8Mにしてあると思います。
シェアしてるので全て使い切ることは出来ませんので、
これ以下で、良識の範囲内で、ってことになります。
もっと具体的な数が必要ならロリポップさんに確かめてください。
Parent: 3785  reply: 3787 返信 編集 削除

[3787] Re.

user: 里美 | created: 2007-06-20 22:58
ゆうじさんへ

今回はいろいろとありがとうございました。

ちょっと現段階では上手くいきませんが、すこし考えながらトライしたいと思います。

また、わからない事があったら教えてください。
Parent: 3786  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 110 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑