PHPで店舗のショッピングカートを作ろうとしています。
data 1 リンゴ 100円
2 ミカン 80円
3 バナナ 50円
PHPコード
<form action="" method="post">
<?php
$sql = "SELECT * FROM list";
$sth = $dbh->prepare($sql);
$sth->execute();
while ($row = $sth->fetch()) {
$id = $row["id"];
$name = $row["name"];
$price = $row["price"];
$image = $row["image"];
echo <<<EOT
<table cellspacing="0" cellpadding="0" width="605" height="150">
<tr>
<td rowspan="5" valign="top"><img src="../kanri/image/goods/$image" border="0" /></td>
<form action="" method="post">
<input type="hidden" name="$id" value="$id" />
<input type="hidden" name="$name" value="$name" />
<input type="hidden" name="$price" value="$price" />
<td align="left" bgcolor="#eee8aa" width="400"><b> $id. $name</b></td>
</tr>
<tr>
<td colspan="2" bgcolor="#ccccff"><p><font color="#000088"><b>税込 :$price </b></p></td>
</tr>
<td colspan="2" bgcolor="#e6e6e6"><p> 個数 :
<select name="number">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select> <input type="submit" name="submit_cart" value="カートに入れる" /></p>
</td>
</tr>
</table>
</form>
<br />
EOT;
}
?>
<hr></hr>
<div align="center">カートの中身</div>
<?php
if (isset($_POST["submit_cart"])) {
if(!isset($name)){ $name = $_POST['name']; }
if(!isset($price)){ $price = $_POST['price']; }
if(!isset($number)){ $number = $_POST['number']; }
$total = $price * $number;
echo "<div align='center'><p>$id 番の情報を取得しました。</p></div>";
echo "<div align='center'><p>商品名: $name </p></div><div align='center'><p>単価:$price 円 / 個数:$number 個</p></div>";
echo "<hr></hr>";
echo "<div align='center'><p>合計金額:<b>$total 円</b>です。</p></div>";
}
?>
としているのですが、カートに入れるボタンを押しても最後のバナナしかカートに表示出来ません。
全ての商品の注文をカートに入れるにはどうすれば良いでしょうか?
ご教授のほど宜しくお願いします。
No.4ベストアンサー
- 回答日時:
> 現状ですと商品が増えるごとにコードも増えてしまいます、良い方法があれば宜しくお願いします。
商品が増えても処理内容が増えるわけではないのでコードは変わらないですよね?
生成されるHTMLは増えますが、それは1ページに表示する件数を制御することで対応できますから、また別の機能のお話ということで。
商品にオプションを付けたりBTOな商品(パーツを選べるパソコンの販売とか)を取り扱うとなると複雑になります。
> >処理の意味を考えると、if(!isset($name))って意味が無いと思うで$name=$_POST['name'];
> については最初その様にしたのですが値渡しがうまく行かず if(!isset~に変えました。
これは、
> 2、3と一つずつ振り分けることで一応全ての商品の表示は出来るようになりました。
この影響ですね。
> ここで商品別の番号をSESSIONで記憶して行けばいけるような気がするのですが、
最低限カートに入れた商品番号と数量の配列をセッションに格納していれば、カートの中身は復元できそうですね。
No.1さんが紹介されているものは、それなりに高機能なものですが、もう少し簡易なショッピングカートプログラムもありますから、一度プログラムを読んでみてはいかがですか?
英語ですが Simple PHP Shopping Cart チュートリアルというものが検索したらみつかりました。
http://jameshamilton.eu/content/simple-php-shopp …
ソースコードもダウンロード出来るみたいですから参考にしてみても良いと思います。
#見てみたらDBをPDOで接続するのであれば、ちょっと修正が必要です。
ちょうどセッションで管理するようになっているようです。
勉強にはちょうど良さそうですよ。
NARH さんありがとうございます。
>最低限カートに入れた商品番号と数量の配列をセッションに格納していれば、カートの中身は復元できそうですね。
セッションを設置したところ上手くゆきました。
只、現在商品の呼び出しに
商品1は$sql = "SELECT * FROM glist WHERE id='1'";
サブミットネーム = submit_cart1
商品2は$sql = "SELECT * FROM glist WHERE id='2'";
サブミットネーム = submit_cart2
商品3は$sql = "SELECT * FROM glist WHERE id='3'";
サブミットネーム = submit_cart3
としているのでコードがどんどん増えてゆき対処方法を考えています。
おかげさまでかなり前に進むことが出来ました。
ベストアンサーに選ばせて頂きます。
No.3
- 回答日時:
商品を手に取り、投げた(post)先に、カートがありません。
なので、前に投げたものは、すでになくなっています。
カート機能を実現するには、
一定期間中に同じクライアントから出されるデータを、格納しておく仕組みが必要です。
ですので、セッションや一時データベースで実装する事になります。
あと、各商品毎に<form><input type="submit"></form>があって、
使い勝手が悪い気もしますが、これは仕様という事で良いのしょうか。
iroha_code さん返信ありがとうございます。
>セッションや一時データベースで実装する事になります。
現在セッションの方向で悪戦苦闘しております。
>あと、各商品毎に<form><input type="submit"></form>があって、
>使い勝手が悪い気もしますが、これは仕様という事で良いのしょうか。
何分、自分の知識の範囲内で自作しているため非合理的な部分が多数あると思います。
やはり出来るだけコードは短く、簡単にしたいと思っています。
なにか良い方法があれば宜しくお願いします。
No.2
- 回答日時:
分かりやすいように、$name の動きを見てみましょう。
最初データベースから取得した商品名として使われて、while で廻されます。
次にカートに入れたときは、POSTされた商品名と期待しています。
しかし、POST先は同じPHPですから、先のデータベースから取得した名前の部分も動きます。
ですから、while 終了時点で $name = "バナナ" です。
そこで、
if(!isset($name)){ $name = $_POST['name']; }
ですから、POSTでの値で上書きはせず、$name は "バナナ" です。
処理の意味を考えると、if(!isset($name))って意味が無いと思うので
$name=$_POST['name'];
としても良いと思います。
#本来は、POSTされた値は有効な値であるかチェックをしなければなりません。
$name 以外に $price もそうですね。
$id は$_POST['id'] を取得する所がありませんね。
一応プログラムの設計を考えているように思えますが、もう1,2段掘り下げて(処理を分解して)考えた方がいい気がします。
NARH さん返信ありがとうございます。
ご注意を参考にしとりあえず
// ========== 商品ID 1 ========== //
echo "<form action='' method='post'>";
$sql = "SELECT * FROM glist WHERE id='1'";
ーーーーーーー 省略 -----------
サブミットネームをsubmit_cart1
// ========== 商品1のカート ========== //
if (isset($_POST["submit_cart1"])) {
という風に 2、3と一つずつ振り分けることで一応全ての商品の表示は出来るようになりました。
ここで商品別の番号をSESSIONで記憶して行けばいけるような気がするのですが、
>処理の意味を考えると、if(!isset($name))って意味が無いと思うので$name=$_POST['name'];
については最初その様にしたのですが値渡しがうまく行かず if(!isset~に変えました。
>$id は$_POST['id'] を取得する所がありませんね
はすみません、コピー&ペーストする時に抜けておりました。
if(!isset($id)){ $id = $_POST['id']; }で取得するようにしています。
現状ですと商品が増えるごとにコードも増えてしまいます、良い方法があれば宜しくお願いします。
No.1
- 回答日時:
失礼ですが、どうしても自作プログラムでないと駄目でしょうか。
オープンソースである、以下のアプリをお奨めしたいのですが・・・。
http://www.ec-cube.net/
http://zen-cart.jp/
何故なら、運営中にこのようなトラブルになった場合、お客様は待ってくれません。
やはり、一人で作られたプログラムには限界があります。
私も、上記の2点を使っています。
自作は限界があると思います。
besso_1965 さん返信ありがとうございます。
PHPを勉強し始めてまだ1年未満ですが色々学んで行くうちについつい欲が出てしまいカート機能も自身で拵えたいと思うようになってきたものですから、
なるべく自分で作るようにしどうしても無理であれば zen-cartの方を使いたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpで変数を使ってcopyできない
-
画像をDBに登録できない
-
アップロードファイル名の文字化け
-
array_multisortがうまくできま...
-
初心者です。入力フォームのp...
-
<input type="hidden" >で配列...
-
PHP ボタンが押されたら処理を...
-
「$id」は表でいうと、どこを...
-
【PHP&JavaScript】複数の別ウ...
-
POSTを使わずに値を渡す方法
-
phpやmysqlで作る簡易掲示板作...
-
検索時の選択内容を保持する方法
-
PHPのエラーの解消法について教...
-
チェックボックスのvalueに変数...
-
フォームボタンを押すたびに数...
-
$_SESSIONについて教えて下さい。
-
【PHPチェック】ラジオボタンが...
-
ドロップダウンで送信先を変更...
-
チェックボックスによる検索(...
-
チェックボックスによる検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Flaskでサーバー立ち上げに関して
-
VBA で、スペースを含むファイ...
-
PHPからHTMLへの変数の受け...
-
phpで変数を使ってcopyできない
-
プログラミングC++のmapについて
-
POSTの項目に追加
-
アップロードファイル名の文字化け
-
サブフォルダ内の全てのテキス...
-
MySQL,PHPのリロードによる二重...
-
複数条件での検索について教え...
-
php+mysqlでの重複チェックにつ...
-
$_SESSIONに渡した後はそのまま...
-
アップロードしたファイルの絶...
-
ログイン パスワード変更のプ...
-
PHP&MySQL fetchAll()でデータ...
-
セキュリティーを意識した書き方。
-
foreachがうまく動かない
-
テキストボックスの値を取得したい
-
ファイルアップローダーで送信...
-
phpで読み込んだcsvが文字化け...
おすすめ情報