ミスチルの大名曲の数々が配信決定!! 31日間無料!!

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>";
}
?>

としているのですが、カートに入れるボタンを押しても最後のバナナしかカートに表示出来ません。
全ての商品の注文をカートに入れるにはどうすれば良いでしょうか?

ご教授のほど宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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で接続するのであれば、ちょっと修正が必要です。
ちょうどセッションで管理するようになっているようです。
勉強にはちょうど良さそうですよ。
    • good
    • 0
この回答へのお礼

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
としているのでコードがどんどん増えてゆき対処方法を考えています。

おかげさまでかなり前に進むことが出来ました。

ベストアンサーに選ばせて頂きます。

お礼日時:2011/03/29 02:32

商品を手に取り、投げた(post)先に、カートがありません。


なので、前に投げたものは、すでになくなっています。

カート機能を実現するには、
一定期間中に同じクライアントから出されるデータを、格納しておく仕組みが必要です。
ですので、セッションや一時データベースで実装する事になります。

あと、各商品毎に<form><input type="submit"></form>があって、
使い勝手が悪い気もしますが、これは仕様という事で良いのしょうか。
    • good
    • 0
この回答へのお礼

iroha_code さん返信ありがとうございます。

>セッションや一時データベースで実装する事になります。
現在セッションの方向で悪戦苦闘しております。

>あと、各商品毎に<form><input type="submit"></form>があって、
>使い勝手が悪い気もしますが、これは仕様という事で良いのしょうか。
何分、自分の知識の範囲内で自作しているため非合理的な部分が多数あると思います。

やはり出来るだけコードは短く、簡単にしたいと思っています。
なにか良い方法があれば宜しくお願いします。

お礼日時:2011/03/25 01:33

分かりやすいように、$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段掘り下げて(処理を分解して)考えた方がいい気がします。
    • good
    • 0
この回答へのお礼

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']; }で取得するようにしています。

現状ですと商品が増えるごとにコードも増えてしまいます、良い方法があれば宜しくお願いします。

お礼日時:2011/03/25 01:28

失礼ですが、どうしても自作プログラムでないと駄目でしょうか。


オープンソースである、以下のアプリをお奨めしたいのですが・・・。

http://www.ec-cube.net/

http://zen-cart.jp/

何故なら、運営中にこのようなトラブルになった場合、お客様は待ってくれません。
やはり、一人で作られたプログラムには限界があります。
私も、上記の2点を使っています。
自作は限界があると思います。
    • good
    • 1
この回答へのお礼

besso_1965 さん返信ありがとうございます。

PHPを勉強し始めてまだ1年未満ですが色々学んで行くうちについつい欲が出てしまいカート機能も自身で拵えたいと思うようになってきたものですから、

なるべく自分で作るようにしどうしても無理であれば zen-cartの方を使いたいと思います。

お礼日時:2011/03/25 01:14

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Q簡単な買い物カゴ機能を作成しました。

<?php
echo "ばなな";
echo '<form action="*****" method="*****">';
echo '<input type="hi**en" name="bnn" value="0">';
echo '<input type="submit" value="カートに入れる">';
echo '</form>';
?>
買い物カゴ
<?php
$a = array('ばなな','りんご','魚');
$s = $_POST['bnn'];
$k = $a[$s];
$_SESSION['ss'] = $k;
echo $_SESSION['ss'];
echo '<a href="ss.php">次へ</a>';
?>


上記でセッションしているはずなのに、違うページを経由してカートページに行くと何故か値が消えてます。どなたか問題点を御教授いただけないでしょうか。。。

Aベストアンサー

>やはり確認ページがいるのでしょうか

いやダイレクトにもいけますが、確認ページはあった方がいいです。
ダイレクトで行く場合は、POSTされるデータともとのセッションデータが
競合しますので、POSTデータのチェックが必要です。

以下、入力→カゴ→別ページ→カゴで動作がわかると思います

//nyuryoku.php
<form action="kago.php" method="post">
<select name="bnn">
<option value="0">ばなな</option>
<option value="1">りんご</option>
<option value="2">魚</option>
</select>
<input type="submit" value="カートに入れる">
</form>

//kago.php
<?PHP
session_start();
$a = array('ばなな','りんご','魚');
$s = $_POST['bnn'];
print "ポストデータは".$_POST['bnn']."<br>\n";
$k = $a[$s];
if(!empty($k)) $_SESSION['ss'] = $k;
print "セッションデータは".$_SESSION['ss']."<br>\n";
?>
<a href="betu.php">別のページ</a>

//betu.php
<a href="kago.php">カゴに戻る</a>

>やはり確認ページがいるのでしょうか

いやダイレクトにもいけますが、確認ページはあった方がいいです。
ダイレクトで行く場合は、POSTされるデータともとのセッションデータが
競合しますので、POSTデータのチェックが必要です。

以下、入力→カゴ→別ページ→カゴで動作がわかると思います

//nyuryoku.php
<form action="kago.php" method="post">
<select name="bnn">
<option value="0">ばなな</option>
<option value="1">りんご</option>
<option value="2">魚</option>
</select>
<input type="submit" va...続きを読む

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

Q特定のセッション変数の内容だけ破棄

$_SESSION['data1']
$_SESSION['data2']
$_SESSION['data3']
$_SESSION['data4']

 このようにセッション変数が複数ある場合、session_destroy();を宣言するとすべてのセッション変数の内容が破棄されますが、例えば「$_SESSION['data1']と$_SESSION['data2']だけ」といったように、特定のセッション変数の内容だけを破棄することは出来ますか?

Aベストアンサー

unset($_SESSION['data1']);
とすればよいです。

全体を初期化したい場合は、
$_SESSION=array();
とします。
unset($_SESSION)としてはいけません。
(スーパーグローバル変数としての特殊な機能が無効化されてしまうため)

QPHPの関数実行

<?php
function disp(){
echo "hello world";
}
?>

<form>
<input type="text">
<input type="button" onclick="<?php disp() ?>">
</form>

といったソースを書いてみたのですが、ボタンを押してみるのですが作動しません。
どこか間違えているのでしょうか、それとも作動しないのでしょうか・・・。
当方としては、formのinputボタンを押したらPHPの関数が実行させるようにしたいのですが・・・。
どなたかご助言をお願いします。

Aベストアンサー

ウソつきました
出来ましたー

<?php

if($_REQUEST[submit] == TRUE){
function disp(){
echo "hello world";
}
}

else{
function disp(){
echo "";
}
}

?>

<form method="post" action="">
<input type="text" value="<?php disp(); ?>">
<input name="submit" type="submit"value="押せ">
</form>

QPHP + MySQL で登録時に重複チェックをしたいです。

PHP + MySQL で登録時に重複チェックをしたいです。
DBには
ID Title Name
1 Book1 Author1
2 Book2 Author2
と3000件ほど入っています。これからも増えていく予定です。

このDBにPHPから新たに100件ほどのレコードを一気に登録したいときに、
・Title名が既にDBに登録されている → 何もせずに次へ
・Title名がまだ登録されていない時 → DBへ登録
と、この様な処理をさせたいと考えています。

現状は登録したい値を配列で回し、一つ一つSELECT文で件数チェックをし、0件で有れば登録。0件以外であれば無視。と、している状況です。
ただこれですと、どうしてもサーバーに負担が掛かってしまう気がするのです。

もし、何か他に良い方法がありましたら教えていただけないでしょうか?
よろしくお願いいたします。

Aベストアンサー

他の方法の例として、

DBにて、"Title" をunique keyにして、登録時に、
INSERT IGNORE INTO table_name 構文を使ってINSERT する

では如何でしょう。
Mysqlが、勝手に重複しいれば無視して、重複がなければ登録してくれます

Qショッピングカートのセッション処理について。

いつも拝見し大変お世話になっております。

現在ショッピングカートを作成しておりますが、商品購入画面から”購入する”のボタンを押したときに、購入する商品ID,注文数量、サイズ、商品価格をセッションとして
格納したいのですがうまくいかず困っております。
使用PHPバージョンは4.4です

ソースは以下のとおりです。
//購入するのボタンを押したときの処理
if (isSet($_POST['cart']){
$_SESSION['cart'][$_POST(商品コード)] =+$_POST(商品価格);
//↑セッション格納ここまで
//(テスト)格納したデータを表示
print_r($_SESSION['cart']);
}

いろいろと調べて該当する商品コードと値段は
格納することができたのですが、その他の商品購入数などをデータにさらに格納する時どうすればいいかわかりませんでした。

お忙しい中大変申し訳ございませんがお知恵をお貸しいただけますでしょうか?よろしくお願いいたします。

Aベストアンサー

if (!isset($_SESSION['cart'][$_POST['商品コード']])) {
$_SESSION['cart'][$_POST['商品コード']] = array('price'=>$_POST['商品価格'], 'number'=>1);
}
else {
$_SESSION['cart'][$_POST['商品コード']]['price'] += $_POST['商品価格'];
$_SESSION['cart'][$_POST['商品コード']]['number']++;
}
とか
個数だけセッションに入れて価格はデータベースから取得して乗算する方法もありますが。

Q\n で改行する意味って??

最近少しPHPプログラミングを始めました。
なので超初心者です。

ネットなどでPHPのサンプルを見ていたら、よく『\n』というものを目にします。
調べてみたところ、エスケープシーケンスと呼び改行のような作用をする、という事は分かったのですが、
実際のサイト画面上では改行されないのに、何の為に使うんですか?そこが良く分かりません。

教えて下さい!!

Aベストアンサー

> 実際のサイト画面上では改行されないのに、何の為に使うんですか?
あえて言うなら、「ソースを確認する時に判りやすいように」ですかね。
「HTMLを手書きで入力するときに、なぜ改行を入れるのか」と同じ理由ではないでしょうか。
改行が全くないソースは見辛いので、私は改行を入れています。

また、ファイルから内容を読み込む時には、file関数を使えば、一行ずつ配列に格納できる、という利点があります。

$lines = file('data.log');

参考URL:http://jp.php.net/manual/ja/function.file.php

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング