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

私はプログラミングなどに関しては全くの素人なのですが、
今回こちらのサイト様(http://affiliate.aki-f.com/prog/cat/cat9.html)を参考にして簡易データベースなるものを作ろうと思っています。
ですがやはり付け焼刃の知識ではどうにも先が見えなく困っています。
今回が初投稿なのですが何卒宜しくお願いいたします。
以下に各ソースと質問を書かせていただきます。

------------------------CSVの中身------------------------
商品カテゴリー,商品タイトル,値段,発売年,簡単な説明,おすすめ度
商品カテゴリー,商品タイトル,値段,発売年,簡単な説明,おすすめ度
商品カテゴリー,商品タイトル,値段,発売年,簡単な説明,おすすめ度
~同じ用に数十件ほど~
商品カテゴリー,商品タイトル,値段,発売年,簡単な説明,おすすめ度
-------------------------------------------------------------
同じカテゴリー、発売年、おすすめ度などで絞込み表示するような形を想定しています。


------------------------------INDEX.PHP------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head><meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"></head>
<body>
<table>
<tbody>

<?php
$Data=file('list.csv');
for($i=1;$i<sizeof($Data);$i++){
$line=explode(",",$Data[$i])
?>
<tr>
<td><a href="test.php?id=<?=$line[0]?>"><?=$line[0]?></a></td>
<td><a href="test.php?id=<?=$line[1]?>"><?=$line[1]?></a></td>
<td><a href="test.php?id=<?=$line[2]?>"><?=$line[2]?></a></td>
<td><a href="test.php?id=<?=$line[3]?>"><?=$line[3]?></a></td>
<td><a href="test.php?id=<?=$line[4]?>"><?=$line[4]?></a></td>
<td><a href="test.php?id=<?=$line[5]?>"><?=$line[5]?></a></td>
</tr>
<?php
}
?>

</tbody></table></body></html>
----------------------------------------------------------------
index.phpでは全商品のリストが表示されます。


---------------------------test.php-----------------------------
<?php
$id=$_GET['id']
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head><meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"></head>
<body>
<table>
<tbody>

<?php
$Data=file('list.csv');
for($i=0;$i<sizeof($Data);$i++){
$line=explode(",",$Data[$i]);
if($line[/*質問1*/]==$id){
?>
<tr>
<td><a href="test.php?id=<?=$line[0]?>"><?=$line[0]?></a></td>
<td><a href="test.php?id=<?=$line[1]?>"><?=$line[1]?></a></td>
<td><a href="test.php?id=<?=$line[2]?>"><?=$line[2]?></a></td>
<td><a href="test.php?id=<?=$line[3]?>"><?=$line[3]?></a></td>
<td><a href="test.php?id=<?=$line[4]?>"><?=$line[4]?></a></td>
<td><a href="test.php?id=<?=$line[5]?>"><?=$line[5]?></a></td>
</tr>
<?php
}
}
?>

</tbody></table></body></html>
---------------------------------------------------------------
index.phpで選択された項目で絞り込んで表示するページです。

質問1
上記の、if($line[~]==$id)の、~の部分に例えば0と入っているなら商品カテゴリーを選択した時に同じカテゴリーで絞り込み表示するわけなのですが、これだけでは当然他の項目を選択しても何も表示されません。なので、~の部分に全ての$lineを巡回させるような命令を書ければ全項目での絞り込みに対応できるんじゃないかなと、素人ながらに思っているのですがどうでしょうか?またその方法、もしくは他の解決策をご教授願えますでしょうかm(_ _)m

あと、index.phpとtest.phpを1つにまとめてしまえることはできるでしょうか?私としてはできるならそうしたいのです。が、うまくできませんでした。

どこか変なことを口走っているかも知れませんがご容赦ください。
宜しくお願いします。

A 回答 (5件)

検索用のリンクが


<a href="test.php?id=<?=$line[0]?>"><?=$line[0]?></a>

とのことですので、「どのフィールドのデータを送ったか」を識別するために、下記のようにGETを一つ増やしてはいかがでしょうか?

<a href="test.php?field=**&id=<?=$line[0]?>"><?=$line[0]?></a>

field=の後ろの**には各フィールドのキーワードを入れます。
こうすることで、
$_GET['field']と$_GET['id']で複数の値を受け取ることができるようになります。


print<<<EOFはヒアドキュメントです。
私も名前を忘れて使ってました。(^^ゞ

例えば、
print "ほげほげ";
print "ふがふが";
print "ぴよぴよ";

などと続けて書く場合、

print <<<EOF
ほげほげ
ふがふが
ぴよぴよ
EOF;

とまとめて記述できます。

また、ダブルクォーテーションなどを¥でエスケープする必要がなくなるので便利です。
    • good
    • 0

> $line[0]が$idと一致しなければ$line[1]を調べる


> それも一致しなければ次・・・次・・・と動いてくれれば

例えば、
test.php?id=10
でアクセスした際、カテゴリーを探して、なければタイトルを探して、なければ値段を探して・・・
ということでしょうか?
そもそも、違うフィールドを同じキーで検索することが特殊なので、「bang2000」さんの意図していることがわかりませんが…(^^ゞとりあえず下記ソースでできると思います。(未確認)
for ($j=0;$j<[フィールド数];$j++) {
for ($i=0;$i<sizeof($Data);$i++) {
$line=explode(",",$Data[$j]);
if ($line[$i] == $id) {
//処理内容
}
}
}

> index.phpとtest.phpはやはりまとめられるならまとめたいです。
素人思考で申し訳ありませんが、下記が参考になれば。

if (empty($_GET['id'])) {
//index.phpの処理
} else {
//test.phpの処理
}


最後に、
print <<<EOF
については、次のステップでがんばってください。
まとめてやると大変なので。(^^ゞ
    • good
    • 0
この回答へのお礼

ありがとうございます。
上と下のソースを使わせて頂いたら見事に私の思うとおりの動作をしてくれました。
本当に感謝です^^
しかしこのままだとka-kichiさんにほぼ全て作って頂いちゃった形になってしまいますね(^^;A
これで満足しててはいけないので、今回のことも含めて勉強させていただきますm(_ _)m

>違うフィールドを同じキーで検索することが特殊なので

本当は、「どのフィールドのデータを送ったか」によって検索するフィールドを変えられるようにできればスマートだと思いますし、
負荷も減ると思いますし理想なんですが、ちょっと考えてみても案の定「?」だったので、
これは後々の私の宿題と言うことにさせていただきます(^^;A

print <<<EOF
についてまた少し調べてましたら、ヒアドキュメントなるものに当たったのですが、これのことですかね・・?

なにはともあれ、この度はお付き合いいただいて本当にありがとうございましたm(_ _)m

お礼日時:2007/12/31 17:01

う~ん。

書き忘れたことを「inu2」さんに指摘されてしまいました。(^^ゞ

名誉挽回のために少し補足を…(^^ゞ

CSVの区切り文字には、「通常使わない文字」がいいですよ。
私の経験上、「<>」が多いみたいですよ。
区切り文字は一文字とは限りません。
こうなると、CSV(カンマ区切り)ではなくなりますが…。

自分以外の人が使用するスクリプトであれば(通常、そうだと思いますが)誰がどんなデータを入力するか予想がつきません。
悪意のある人がわざと変なデータを入力するかもしれませんしね。(^^ゞ

それを回避する手段として、POSTなりGETなりで送られてきたデータをHTMLエンティティに変換する方法があります。
HTMLエンティティに変換すると、HTMLタグが無効になります。
例:「<strong>」→「$lt;strong&gt;」となります。つまり、区切り文字「<>」と間違えることがなくなります。

以上、参考になれば幸いです。
    • good
    • 0
この回答へのお礼

区切り文字は問題なければ「タブ」で、つまりTSVファイルにして対応しようと思ってます。

なるほど、HTMLエンティティに変換ですか
今はまだローカルで操作しているだけなので問題ないと思いますが、その時は勉強させていただきます!
ありがとうございましたm(_ _)m

お礼日時:2007/12/30 17:06

いきなりプログラムを作るのではなく


CVS とはなんぞや?
という事を理解しないと駄目ですよ
CSVの仕様を正確に把握していないと何が原因なのか分からずにつまってしまいます

例えば、商品タイトルや、値段、簡単な説明の中に 「,」が含まれている場合はどうなりますか?
質問されてるソースを実行したら途中でexplodeで切られてしまいますよ


質問内で例にあげているサイトですが、プログラム初心者が理解しやすいように説明はしているものの、実際にここの例文で作られたサイトは実用には耐え難くあくまでも勉強するためだけの例にしかすぎません
つまり、このサイトだけではお遊びのものしか作れません
    • good
    • 0
この回答へのお礼

ご忠告ありがとうございますm(_ _)m
区切りの問題に関しては、タブ区切りなどにして適当に対応しようと思っていました。
プログラミングも含めて勉強させていただきます!
ありがとうございました

お礼日時:2007/12/30 17:00

私も初心者で、おそらくbang2000さんと同程度のレベルだと思うのですが…。

(^^ゞ

どのように「うまくいかない」のかを書きましょう。
また、OS、PHPなどのバージョンなども書いた方がいいと思います。

さて本題ですが…

・$_GET['id']で送られてくるデータは日本語ですか?それとも半角英数字ですか?

書籍で例えると、CSVには
参考書,PHP入門,2000・・・
雑誌,日系BP,1500・・・
以下省略
と入っていると思われます。
これが、
if($line[0]==$id){
を満たすためには、$id(つまり$_GET['id'])に日本語が入っている必要があります。
しかし、GETで日本語を送るためには日本語を文字コードに変換する必要が出てきますので、お勧めではありません。

そこで、新規に「list.php」を作り、
<?php
$category = array(
"0"=>"参考書",
"1"=>"雑誌",
以下省略
);
?>
とだけ入力しておきます。
もちろん、CSVは
0,PHP入門,2000・・・
1,日系BP,1500・・・
以下省略
としておく必要があります。

検索フォームには
<select name="id">
<option value="0">参考書</option>
<option value="1">雑誌</option>
以下省略
</select>
としておき、$_GET['id']では0や1が送られてきます。

ただし、これはカテゴリーのみ検索可能なので、上記と同様の処理を「商品タイトル」や「おすすめ度」などに置き換えて繰り返す必要があります。

長くなりましたので、これを踏まえて再度ご質問願います。

また、index.phpとtest.phpを一つにまとめる方法としては、$_GETが空の時は通常一覧、$_GETが空ではない時は検索処理という具合にまとめることは可能です。
他のファイル構成なども考慮して決めてはいかがでしょうか?

余談ですが、スクリプト部分と表示部分は分けた方がいいと思います。
分けておくと、ソースが見やすくなりますし、将来、Smartyなどを利用する時に移行しやすくなりますよ。
分け方は、
<?php

//前半にスクリプト

//後半でブラウザ表示
print <<<EOF
<html>
割愛
<td>a href="test.php?id=$line[0]">$line[1]</a></td>
割愛
</html>
EOF;
?>
とすればいいと思います。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます^^
使用しているOSはXP SP2
PHPはPCにインストールしているものってことでしょうか
これはバージョン5.2.5となっています

$_GET['id']で送られてくるデータですが、この辺りは例えば商品カテゴリーなら、CSVに新たに列を設けて、カテゴリーごとに 0 や 1 等の番号も割り当て、その番号で$_GETに送ろうと考えています。
説明が足りずに申し訳ありませんでした。
あと、とりあえず検索フォームは使わず、テーブルのセル内の要素にリンクを張るだけの形で作りたいと思っています。

自分はまず基本的な文法などからして理解していないのかもしれないですが、先の質問の

if($line[0]==$id){
?>
<tr>
<td><a href="test.php?id=<?=$line[0]?>"><?=$line[0]?></a></td>
~中略~
</tr>
<?php
}

の部分、$line[0]が$idと一致しなければ$line[1]を調べる
それも一致しなければ次・・・次・・・と動いてくれれば思い通りのものができると思うのですがどこに何を書けばいいのかがよくわからないのです。
elseifを$lineの数だけ繰り返して書いてみたりも一応したのですがエラーが出ました(何分勉強不足で文法表現から間違えているのかもしれないのですが)

全体のファイル構成ですが、とりあえずはこの商品リスト(index.phpとtest.php)と、あとは各商品の詳細ページだけということになります。index.phpとtest.phpはやはりまとめられるならまとめたいです。

最後にご指摘ありがとうございます。
スクリプト部分と表示部分を分ける、ですか。
print <<<EOF でググってみたのですが、ん~む、いまいち要領を得ません^^;
私のレベルが低すぎて理解できていないっぽいです(汗
後々勉強させていただこうと思いますm(_ _)m

お礼日時:2007/12/30 16:38

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