電子書籍の厳選無料作品が豊富!

はじめまして。
どうしてもわからないことがあり質問致しました。
どなたか解決策が分かる方、知識をご教授願います。

現在私は会社のネットショップを始めました。
商品を買い物かごに複数入れたとき、それぞれの商品についている削除ボタンを押したら、その商品だけリストから消えるようにしたいのですが、いまの状態では削除ボタンを押すと買い物かごのすべての商品が消えてしまいます。
是非、解決策を教えていただきたいです。

<概要>
それぞれの商品ページから商品idのみPOSTでcart.phpに送り、それを商品情報が記載されているdata.csvと比較して、商品情報をショッピングカートに表示させています。そのショッピングカートの一つ一つの×印に対応する商品idをGETでdelete.phpに送って、unsetで消去しようとしています。

日本語が下手で申し訳ないですが、どなたか解決策がわかる方がいましたら、何とぞよろしくお願い致します。

A 回答 (10件)

たびたび失礼します。


文字コード、UTF-8ではだめでしたか。。
WindowsServerなんでしょうか。
「能 表 申 十」などの文字が化けなければSJISでもいいのかも。


今日はまとまった時間が取れたので
「商品を買い物かごに複数入れたとき~」の件をじっくり見てみました。
商品を消去して戻ってくると全部消えるのはPOSTデータが原因ですね。
ためしにPOSTの処理と画面表示の処理を分けてみたらうまくいきました。
自分でやってみたファイルをまとめますので、よろしければご確認ください。
※ページ遷移の順番が変わっていますが、
フォームのファイルタイプは.phpにせず.htmlのままと仮定したリロード対策です。
あと、POSTやGETの値の保持はフォームで送った次のページまでです。

参考URL:http://uploadr.net/file/b410902745

この回答への補足

ご回答ありがとうございます。

本当にじっくり見ていただいてありがとうございます。
ちょっと時間がなかなかとれなくてすぐにはできませんが、こちらを参考にして1週間以内にはまた結果をご報告させていただきます。
本当にありがとうございました。

補足日時:2010/02/21 02:13
    • good
    • 0
この回答へのお礼

今日add.phpとcart.phpを導入させていただきました!
まだまだ未熟でadd.phpの解読までできていませんが、ついに正常に作動するようになりました!!
本当に助かりました!!めちゃめちゃうれしいです!!
じっくり分析して頂きありがとうございました!

残りのinformation_input.htmlに関してはなんとか自分で完成させます!

お礼日時:2010/02/25 00:09

削除して cart.php にリダイレクトした時と、


「カートの中身」ボタンを押した時に
「空っぽ」の表示になる理由の見当が付きました。

カートに商品を入れたときしか $id = $_POST["select"]; が ないですよね?

で、ここ

if(strcmp($id,$data[0]) == 0){

$id の中身がないので、これ以降は実行されていません。

この回答への補足

ご回答ありがとうございます。

本当に問題発見から原因まで考えて頂きありがとうございます。
ちょっといまはなかなか時間が取れないので、こちらを参考にして試してみます。1週間以内にはまた結果をご報告させて頂きます。
本当にありがとうございます。

補足日時:2010/02/21 02:15
    • good
    • 0
この回答へのお礼

原因、おっしゃるとおりでした。。。
なんとか正常に作動させて頂けました!
bm_hiro様、長いことお付き合いして頂きありがとうございました!!
本当に感謝してますし、正常に動いてかなり嬉しいです!!

information_input.htmlに関しては何とか自分で解決してみます!!

お礼日時:2010/02/25 00:11

#5です。


---- ---- ---- ---- ---- ---- ----
> いきなり長いコードまで記載してしまって申し訳ないです。

長さもさることながら可読性に難があるように感じたのと、
strcmp() を使う必要性に疑問を持った事で、意識が保てなかっただけです。
今後、商品が増えたりした場合の拡張性を考えると、これは ちょっと。。。と思います。
俺なら どうするかと言うと、何通りか浮かびますが、とりあえず、配列使いますね。

//以下商品名からその商品が掲載されているページに飛ばすための処理


//ここまで

↑の部分の事です。
---- ---- ---- ---- ---- ---- ----
あと #6 の 補足の

>下記の方がおっしゃっているように最終確認画面まで行くと、
> 削除した商品は表示されず確かにSESSIONの中身は削除されているみたいですが。。

これは、俺の書き方悪かったですね。
最初、テキトーにぽんぽんカートに入れたり削除したりしてたもんで、
気がついたのが最終画面だったってだけです。
$_SESSIONの中身は 常に正常な状態だと思います。
カートの中身に表示されないだけで。

昨日、俺が書いた再現実況でも、途中のも ちゃんと削除されて表示されてましたよ。
---- ---- ---- ---- ---- ---- ----
> <同じ商品の個数が増えていかず上書きされる>

んー、cart.php の前半だけ見た感じですけど、
一つの商品に対して 一つの$_SESSION["item"][$id] しか持ってないですよね?
既に カートの中にある商品だったら 加算するとかの処理は 全く見当たりません
でした。

$file = fopen("data/data.csv" , "r");
while($data = fgetcsv($file)){
if(strcmp($id,$data[0]) == 0){
$price_n = (int)$data[2];
$sum_n = $price_n * $num_n;

$_SESSION["item"][$id] = array("$num_n" , "$data[1]" , "$price_n" , "$sum_n");

↑の部分。

data.csv を総当りで、カートに入れた品物の情報を取り出してきて、
合計額に 単価 * 数量 を追加して、
その商品の情報などを $_SESSION["item"][$id] に 配列で代入。
当然、既にデータが入っていた場合は、無残にも上書きされる。。。と。。
---- ---- ---- ---- ---- ---- ----
> <個人情報の入力画面>

一番、手抜きなのは 入力されているか どうかだけの判断をするもので済ましてるところもあります。
厳密にやるなら、メルアドや電話番号の正当性、数字しか入らない所に全角文字が入っているとか、それなりのチェックが必要です。
---- ---- ---- ---- ---- ---- ----
> <データが正常に表示できていない>

これに関しては、あとで 見てみます。
眠くなってきたんです。ごめんなさい。
---- ---- ---- ---- ---- ---- ----
あと文字コードは パソコン向けなら UTF-8のほうがいいですよ。
SJISだとバグ文字対策とかしなきゃいけなくなりますから。
    • good
    • 0

回答番号No,4 とNo,6を投稿したものです。

連投すみません。

商品がすべて消えてしまう現象について、
cart.phpでも$_SESSION["item"][$id]と記述されていますので、
ファイルの先頭にsession_start()を書き加えてみてください。
【cart.php】
<?php
session_start(); //<-ココニクワエル
$id = $_POST["select"];
$num = $_POST["num"];
$num_n = (int)$num;
$sum_all = 0;//全合計金額

あと、他の方のコメントにもあるようですが
フォームのタグが少々壊れていることろがあります。
<select>の<option></option>の一部など
ブラウザによっては正確にデータを送ることができないかもしれませんのでLet'sご確認&修正。
    • good
    • 0

回答番号:No.4です。



文字化け、直りませんでしたか…結果画面のソース内でも化けていますか?
自分も貴サイトのソースをお借りして検証してみました。
※ソースを無断使用してごめんなさい。

ファイルの文字コードはすべてUTF-8とのことなので
検証用のファイルの文字コード、キャラセットともにUTF-8にあわせました。

結果、cart.php内のHTML-MetaのキャラセットをUTF-8にして出力してみたところ文字化けが直りました。

一連のソースをまとめてZipにしましたので、お手数ですがご確認いただけたらと思います。
(ウィルスチェック済みですが、DL後解凍する前にもチェックすることをお勧めします)

参考URL:http://uploadr.net/file/bccd5ee60a

この回答への補足

ご回答ありがとうございます。
<文字コードについて>
アドバイスをもとに、またわけがわからないままいろいろ試してみたところ(下記)文字化けはなくなりました。
・cart.php、data.csvをSJISで保存
・cart.phpのキャラクターセットをSJIS
・last_check.phpのキャラクターセットをUTF-8(なぜかSJISにしてしまうと、ページ全体が文字化けしたため)
・last_check.phpに以下を記入
$item[1] = mb_convert_encoding($item[1], "UTF-8", "auto");
($item[1]は商品名です)

またcart.phpの$item(商品の情報が全て入っています)をvar_dump()してみたところ、今まで出ていた文字化けもなくなりました。本当にありがとうございます。
<商品の削除について>
session_start()も<select>もすべて直しましたが以前変わらず・・・
下記の方がおっしゃっているように最終確認画面まで行くと、削除した商品は表示されず確かにSESSIONの中身は削除されているみたいですが。。
あと最初のほうでここに「localhostではうまくいっていた」と書いたのですがlocalhostで試してみたらcart.phpが正常に作動しなくなっていました。本当にいろいろ聞いて申し訳ないですが、何か心当たりがあったら教えてほしいです。

補足日時:2010/02/19 02:33
    • good
    • 0

どうも、はじめまして。


最初に この質問を見たときに そちらのサイトのほう見て疑問に思った事があったのですが、
#1で そちらの提示されたソースを見て、ゲンナリしてしまいましたので、回答を保留していました。

説明が下手クソなので、言い方が回りくどくなるのと、
根本的に 学がないのとで 無駄に長くなるのと、口が悪いのは、ご了承ください。

まだ解決していないようでしたので、再度、先ほど そちらのサイトを見て、
新たに気がついたことがありましたので、お知らせします。

> var_dump()みたいなので調べてみたら、本来「柿下人麻呂」とかって出ないといけないのに文字化けしているんですよ・・・

var_dump()したのならお気づきになられたかもしれませんが、
$_SESSION の中では、データは 「正常に 削除したものだけ削除されている」ように見受けられました。
ちなみに、文字化けの原因は data.csv が UTF で サイトが SJISなので おかしな事ではありません。

以下に、上記の根拠を説明します。
----- ----- ----- ----- ----- ----- ----- -----
まず、カートが 空っぽの状態で 商品A,B,C の3商品を カートに入れる。

カートの中身が表示されている画面で、右下の「カートの中身」っていうリンクをクリック。

なぜか、「空っぽ」に表示される。 ← 疑問点 その1

めげずに、ブラウザの戻るボタンを押し、商品 D を追加する。

ちゃんと、商品 A、B、C、D が カートの中身として 表示される。

この状態で、商品 B を [x] を クリックして 削除 する。

またまた「空っぽ」に表示される。

再度、折れそうな心を 奮い立たせ ブラウザの戻るボタンを押し、商品 E を 追加する。
(ここで ふと 気がついた。「個数の選択」に5が存在しねぇぇぇぇぇぇ)
   http://shusoan.com/shu_so_an/shu_so_an2.html
  原因は 最後の > がない。
  <option value="4">4</option
  chrome は 勝手に補完してくれたみたいですが、lunascape だと HTML通りに 表示した模様。
  一応、書いておくと、chrome も lunascape も ブラウザの名前。

期待通りに、商品 A、C、D、E が カートの中身として 表示される。

正直、もう 気がついてくれるんじゃないかと思いつつ、商品 E を削除する。

「空っぽ」 カート表示

ブラウザの戻るボタン押し、商品 A を 「数量を変更」し追加する。

商品 A、C、D が 表示されるものの 商品 A の数量は、今回のものに 上書きされた模様。 ← #2さんの指摘どおり

ここで、あえて、右下のリンクの「カートの中身」をクリック。

前回同様、「空っぽ」

更に、あえて、カートの中のボタンの[NEXT]をクリック。

個人情報の入力画面に 何も入力せずに [NEXT]。
(入力チェックはない模様) ← 製作途中だからだと解釈

[最終確認画面]
個人情報と、商品 A、C、D が表示される。 ← この時点で、ようやく $_SESSION の中身は 正常なデータだと気がついた俺。
----- ----- ----- ----- ----- ----- ----- -----

************************************************
結論 : データを正常に表示できていないだけっぽい。
************************************************

「カートの中身」を押した時もそうですけど、$_SESSION からのデータを表示に反映できていないだけだと思いました。

最初に宣言したとおりですが、無駄に長くてすみません。
更に 問題の切り分けをしただけで、問題の解決になってなくてすみません。

あと タイトルは 「ネットショップの運営に困っています」と言うよりかは「カートの開発に困っています」って感じですね。

この回答への補足

ご回答ありがとうございます。またいきなり長いコードまで記載してしまって申し訳ないです。

いえいえ、厳しいお言葉のほうが参考になるので助かります。
またこの投稿をみて問題点を整理できました。そしてタイトルは・・・おっしゃる通りです!


<同じ商品の個数が増えていかず上書きされる>
いまそのコードも書いているのですが、正直わかりません。けれどそれは何とか自分でやってみたいと思います。
<個人情報の入力画面>
こちらも自分で何とかします!!
<データが正常に表示できていない>
この問題は何度やっても私では解決できず正直手詰まりです。。もしコード等見て、おかしいとお気づきになった点があれば投稿していただけると幸いです。

いろいろと調べて頂きありがとうございます。

補足日時:2010/02/19 03:04
    • good
    • 0

>本来「柿下人麻呂」とかって出ないといけないのに文字化けしているんですよ・・・



この部分だけなんですが気になることが。
読み込むCSVファイルの文字コードがEUC-JPやUTF-8Nになっていませんか?
Shift-jisで作られているようなので、CSVファイルの文字コードもShift-jisにあわせて試してみてください。

この回答への補足

ご回答ありがとうございます。
ご指摘の通りやってみたのですがなおりませんでした。。

ちなみにcart.phpとdata.csvとinformaiton_input.htmlはすべてUTF-8Nで保存しています。cart.phpとinformation_input.htmlはcharset="UTF-8"でコードを書いています。
残りのページはすべてSJISで書いています。

文字コードが怪しいと思ったのは、自分が文字コードについてあまり理解していないからです。なにか考えられる理由はありますでしょうか。。アドバイスを頂けたら幸いです。

補足日時:2010/02/17 23:29
    • good
    • 0

 該当HPに飛んで、少し、ソースコードを見てみました。


 delete.php のソースが解りませんので、どのよう操作をしているのか不明ですが・・・。

 idの価(商品のコード)を持たして、delete.phpに送って、そのidに対応した商品を削除するんですよね。組み立てとしては、それで合っていると思いますよ。 

 しかし、ローカルではうまく動いていてサーバーに移動したら期待した動きにならないというのもおかしな話ですね。

この回答への補足

ご回答ありがとうございます。真剣に悩んでいます。。
delete.phpは下記のようになっているのですが・・・
一つ気になっているのが、文字コードなんです。cart.phpの$_SESSION["item"] (金額や商品名などの詳細情報がキーをIDとしてarrayの中に入っています)を、var_dump()みたいなので調べてみたら、本来「柿下人麻呂」とかって出ないといけないのに文字化けしているんですよ・・・
一概には何とも言えないかもしれないですけど、それって関係あったりしますか?

<delete.php>
<?php
session_start();

$id = $_GET["id"];//delete.php?id=$key_idのidの中身$key_idを受け取って$idに入れる
unset($_SESSION["item"][$id]);

header("Location: cart.php");
?>

補足日時:2010/02/17 00:11
    • good
    • 0

概要で書かれているので、そのまま組めばいいと思うのですが


どこがわからないか書いた方がよいかもしれませんね。
同じ商品を購入した場合、買い物かごの中に
数が増えていかないのも気にはなりますが…。

この回答への補足

回答ありがとうございます。
概要通りに作って、localhostで試しに使用していた時は、いらない商品だけしっかり削除できていたのですが、アップロードしたら突然削除できなくなりました。なので正直どこがいけないのかわからない状態で、煮詰まってどなたかの教えを頂きたいと思って質問致しました。ひょっとしたら文字コードに問題があってうまく削除できていないのかもと思ってはいるのですが、いろいろ試してみてもうまくいかず・・・
また同じ商品を買い物かごに入れたときに数が増えていかないというのは、おっしゃる通りです。
本当にまだPHP含めhtmlなどの勉強はまだまだ未熟で、質問内容なども説明が足らないところもあるかと思いますが、どうしても完成させたいのでもし原因がわかれば教えて頂きたいです。

補足日時:2010/02/14 14:19
    • good
    • 0

>>


それぞれの商品ページから商品idのみPOSTでcart.phpに送り、それを商品情報が記載されている data.csvと比較して、商品情報をショッピングカートに表示させています。そのショッピングカートの一つ一つの×印に対応する商品idをGETで delete.phpに送って、unsetで消去しようとしています。
<<

あなたの言葉がそのまま「仕様」になっていますよね?
その通り組めばよいだけでは?

文章そのままのロジックを具体的にどう書けばよいのか分からない。
というのであれば、逆宣伝している状態ですよ。
つまり。「この程度の事が作れないようなスキルの人が組んだサイトで買い物したくない、セキュリティ的にあぶなっかしくてココでは買い物できない」って思わせてしまうことになっていますよ。

この回答への補足

回答ありがとうございます。
localhostで試した時は、いらない商品だけ削除できていたのですが、アップロードしたら突然削除できなくなりました。なのでどこかいけないのかがわからなく、煮詰まってどなたかの教えを頂きたいと思って質問致しました。
コードの一部も載せますのでもし原因がわかったら教えて頂けないでしょうか?
ーcart.phpー
<?php
$id = $_POST["select"];
$num = $_POST["num"];
$num_n = (int)$num;
$sum_all = 0;//全合計金額

$file = fopen("data/data.csv" , "r");
while($data = fgetcsv($file)){
if(strcmp($id,$data[0]) == 0){
$price_n = (int)$data[2];
$sum_n = $price_n * $num_n;

$_SESSION["item"][$id] = array("$num_n" , "$data[1]" , "$price_n" , "$sum_n");

foreach($_SESSION["item"] as $key_id => $item){ //$item = array("$num_n" , "$data[1]" , "$price_n" , "$sum_n")
if(!empty($key_id)){ //itemの中身があれば以下を表示

//以下商品名からその商品が掲載されているページに飛ばすための処理
if(strcmp($key_id, "s1") == 0 || strcmp($key_id, "s2") == 0 || strcmp($key_id, "s3") == 0 || strcmp($key_id, "s4") == 0 || strcmp($key_id, "s5") == 0 || strcmp($key_id, "s6") == 0 || strcmp($key_id, "s7") == 0 || strcmp($key_id, "s8") == 0 || strcmp($key_id, "s9") == 0 || strcmp($key_id, "s10") == 0 || strcmp($key_id, "s11") == 0 || strcmp($key_id, "s12") == 0 || strcmp($key_id, "s13") == 0 || strcmp($key_id, "s14") == 0 || strcmp($key_id, "s15") == 0 || strcmp($key_id, "s16") == 0 || strcmp($key_id, "s17") == 0 || strcmp($key_id, "s18") == 0 || strcmp($key_id, "s19") == 0 || strcmp($key_id, "s20") == 0){
$link = "../shu_so_an/shu_so_an1.html";
}else if(strcmp($key_id, "s21") == 0 || strcmp($key_id, "s22") == 0 || strcmp($key_id, "s23") == 0 || strcmp($key_id, "s24") == 0 || strcmp($key_id, "s25") == 0){
$link = "../shu_so_an/shu_so_an2.html";
}else if(strcmp($key_id, "s26") == 0){
$link = "../shu_so_an/shu_so_an3.html";
}else if(strcmp($key_id, "k1") == 0 || strcmp($key_id, "k2") == 0 || strcmp($key_id, "k3") == 0 || strcmp($key_id, "k4") == 0 || strcmp($key_id, "k5") == 0 || strcmp($key_id, "k6") == 0 || strcmp($key_id, "k7") == 0 || strcmp($key_id, "k8") == 0 || strcmp($key_id, "k9") == 0){
$link = "../ken/ken1.html";
}else if(strcmp($key_id, "k10") == 0 || strcmp($key_id, "k11") == 0){
$link = "../ken/ken2.html";
}else if(strcmp($key_id, "k12") == 0 || strcmp($key_id, "k13") == 0){
$link = "../ken/ken3.html";
}
//ここまで

print("<tr background=\"images/bgimage.png\">");
print("<td align=\"center\"><img src=\"data2/$key_id.png\"></td>"); //(画像)
print("<td align=\"center\"><a href=\"$link\" alt=\"戻る\"> $item[1] </a></td>"); //$data[1]のこと(商品名)
print("<td align=\"center\"> $item[2] 円</td>"); //$price_nのこと(単価)
print("<td align=\"center\"> $item[0] 個</td>"); //$num_nのこと(個数)
print("<td align=\"center\"> 別 </td>"); //(送料)
print("<td align=\"center\"> $item[3] 円</td>"); //$sum_nのこと(合計値段)
print("<td align=\"center\"><a href=\" delete.php?id=$key_id \" onmouseout=\"MM_swapImgRestore()\" onmouseover=\"MM_swapImage('Image$key_id','','images/delete2.png',1)\"><img src=\"images/delete1.png\" name=\"Image$key_id\" border=\"0\" id=\"Image$key_id\" /></a></td>"); //削除
print("</tr>");

$sum_all = $sum_all + $item[3];
}
}
}
}
fclose($file);
$_SESSION["sum_all"] = $sum_all;
?>
</table>

質問箇所もわからない、質問内容なども説明が足らない、と失礼極まりないと思っておりますが、どうしても完成させたいのでもし原因がわかれば教えて頂きたいです。

補足日時:2010/02/14 14:45
    • good
    • 0

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