現在ショッピングカートのPHPスクリプトを作成しており、
購入するボタンを押した商品をセッションに保存するということを行いたいのですがうまく出来ず困っております。
大変お手数をおかけしますが詳しい方おりましたら
購入ページのPHPスクリプトとデータを追加するページのPHPスクリプトを見ていただいて間違いがある場合指摘していただければと考えております。
(この後の処理としては、セッションに保存された値を順番に表示したいと考えております。。)
大変お手数をおかけしますがご回答お待ちしております。
<?php session_start(); function order() { require "database_connect.php"; echo '<table style="text-align: left; width: 500px;" border="1" cellpadding="2" cellspacing="2"> <tbody>'; $sql=mysql_query(" SELECT * from TEST WHERE PRODUCT='さくらんぼ' ; "); while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) { echo "<tr>\n"; echo '<td style="vertical-align: center; text-align: center;"> <FORM method="POST" action="kakunin.php"> <input type="hidden" name="kanri_no" value="'.$row["PRODUCT_NAME"].'">'.$row["PRODUCT_NAME"].'<br> '.$row["PICTURE"].'<br><br> 残り在庫数:'.$row["KOSUU"].'個<br> 金額:<font color="red" size="+1">'.$row["PRICE"].'</font>円<br> 購入数:<select name="kosuu"> <option>1</option> <option>2</option> <option>3</option> <option>4</option> <option>5</option> <option>6</option> <option>7</option> <option>8</option> <option>9</option></select><br> <input type="submit" name="submit" value="購入する"></form> </td></tr>'."\n"; } echo '</tbody></table>'; } function cart() { // $_SESSION["cart"] = array(); $_SESSION["cart"][] = array($_POST["kanri_no"], $_POST["kosuu"]); echo '<table><tbody>'; foreach ($_SESSION["cart"] as $item) { list($kanri_no, $kosuu) = $item; echo '<tr><td>'.$kanri_no.'</td><td>'.$kosuu.'</td></tr>'; } echo '</tbody></table>'; } function cart2() { // $_SESSION["cart"] = array(); $kanri_no = $_POST["kanri_no"]; $_SESSION["cart"]["$kanri_no"] = $_POST["kosuu"]; echo '<table><tbody>'; foreach ($_SESSION["cart"] as $kanri_no=>$kosuu) echo '<tr><td>'.$kanri_no.'</td><td>'.$kosuu.'</td></tr>'; echo '</tbody></table>'; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html;charset=UTF-8" http-equiv="Content-Type"> <title>test</title> </head> <body> <?php order() ?> <br> <?php cart2() ?> <br> </body> </html>
phpの特徴はhtmlの中に埋め込んで記述できることですがこれをすると後々面倒になると思いますので
htmlとphpの部分は分けるようにしたほうがいいと思います。今回は上下に分けました。
またadd_data.phpはkakunin.phpにリダイレクトしているので同一ファイル内としました。
$_SESSION["kanri_no"]と$_SESSION["kosuu"]に分けると面倒なので$_SESSION["cart"]としました。
配列として追加する場合はarray_push()より$_SESSION["cart"][]のような書き方のほうが便利です。
$_SESSION["cart"][] = array($_POST["kanri_no"], $_POST["kosuu"]);
この場合は購入したものが常に追加されます。そのため重複が発生しますので、それが問題なければ
cart()の配列方式でいいでしょう。
重複しない必要があるなら"kanri_no"での連想配列にします。
$kanri_no = $_POST["kanri_no"];
$_SESSION["cart"]["$kanri_no"] = $_POST["kosuu"];
無ければ追加しますし、既にあれば上書きされます。
cart()が単純な配列でcart2()が連想配列です。
<?php cart2() ?>の部分を変えると違いがはっきりするでしょう。
セッションをクリアーする必要がある場合は
// $_SESSION["cart"] = array();
の//を取って一回アクセスした後、また戻して下さい。
まずは購入ページのほうの例! 動かしての確認はしてないけど、在庫数が3個だったら3個までしか表示しないとかの工夫もしてあるよ!!
# SQL $sql = mysql_query("SELECT * from TEST WHERE PRODUCT='さくらんぼ'") or die("失敗"); # ヘッダ echo '<table>'; # ボディ while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) { $output = '<tr><td><FORM method="POST" action="add_data.php">' . '<input type="hidden" name="kanri_no value="' . $row["PRODUCT_NAME"] . '">' . $row["PRODUCT_NAME"] . '<br>' . $row["PICTURE"] . '<br><br>' . '残り在庫数:' . $row["KOSUU"] . '個<br>' . '金額:<span style="color:red; font-size: large;">' . $row["PRICE"] . '</span>円<br>'; if ($row["KOSUU"] > 0) { $output += '購入数:<select name="kosuu">'; for ($i = 1; $i <= $row["KOSUU"]; $i++) { $output += '<option>' . $i . '</option>'; if ($i > 8) { break; } } $output += '</select>'; } $output += '<input type="submit" name="submit" value="購入する"></form></td></tr>'; } echo $output; # フッタ echo '</table>';
データ追加ページのほうの例! こっちも動かしてないです!!
# ヘッダ echo '<table>'; echo '<tr><th>管理番号</th><th>個数</th></tr>'; # ボディ $c = count($_SESSION["kanri_no"]); for ($i = 0; $i < $c; $i++) { echo '<tr><td>' . $_SESSION["kanri_no"][$i] . '</td><td>' . $_SESSION["kosuu"][$i] . '</td></tr>'; } # フッタ echo '</table>';
いちおう、両方簡単に手直ししてみたけど、こんなの実用には使えないよ! 基礎構造学ぶにしてもお粗末だよ!!
利用者側からすれば1つのページに商品の種類だけformがあるなんて重たいページは迷惑な話!!
セキュリティの面もあるから、まだまだいろいろあるんだよ!!
http://zen-cart.jp/ とか既存のものを使えば楽なのに、どうして面倒なことしてるの??
学習するのでも既存のものの構造を学んだほうがいいと思うよ!!
ご回答ありがとうございます。
<?php session_start(); function order() { require "database_connect.php"; echo '<table style="text-align: left; width: 500px;" border="1" cellpadding="2" cellspacing="2"> <tbody>'; $sql=mysql_query(" SELECT * from TEST WHERE PRODUCT='さくらんぼ' ; "); while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) { echo "<tr>\n"; echo '<td style="vertical-align: center; text-align: center;"> <FORM method="POST" action="kakunin.php"> <input type="hidden" name="kanri_no" value="'.$row["PRODUCT_NAME"].'">'.$row["PRODUCT_NAME"].'<br> '.$row["PICTURE"].'<br><br> 残り在庫数:'.$row["KOSUU"].'個<br> 金額:<font color="red" size="+1">'.$row["PRICE"].'</font>円<br> 購入数:<select name="kosuu"> <option>1</option> <option>2</option> <option>3</option> <option>4</option> <option>5</option> <option>6</option> <option>7</option> <option>8</option> <option>9</option></select><br> <input type="submit" name="submit" value="購入する"></form> </td></tr>'."\n"; } echo '</tbody></table>'; } function cart() { // $_SESSION["cart"] = array(); $_SESSION["cart"][] = array($_POST["kanri_no"], $_POST["kosuu"]); echo '<table><tbody>'; foreach ($_SESSION["cart"] as $item) { list($kanri_no, $kosuu) = $item; echo '<tr><td>'.$kanri_no.'</td><td>'.$kosuu.'</td></tr>'; } echo '</tbody></table>'; } function cart2() { // $_SESSION["cart"] = array(); $kanri_no = $_POST["kanri_no"]; $_SESSION["cart"]["$kanri_no"] = $_POST["kosuu"]; echo '<table><tbody>'; foreach ($_SESSION["cart"] as $kanri_no=>$kosuu) echo '<tr><td>'.$kanri_no.'</td><td>'.$kosuu.'</td></tr>'; echo '</tbody></table>'; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html;charset=UTF-8" http-equiv="Content-Type"> <title>test</title> </head> <body> <?php order() ?> <br> <?php cart2() ?> <br> </body> </html>
phpの特徴はhtmlの中に埋め込んで記述できることですがこれをすると後々面倒になると思いますので
htmlとphpの部分は分けるようにしたほうがいいと思います。今回は上下に分けました。
またadd_data.phpはkakunin.phpにリダイレクトしているので同一ファイル内としました。
$_SESSION["kanri_no"]と$_SESSION["kosuu"]に分けると面倒なので$_SESSION["cart"]としました。
配列として追加する場合はarray_push()より$_SESSION["cart"][]のような書き方のほうが便利です。
$_SESSION["cart"][] = array($_POST["kanri_no"], $_POST["kosuu"]);
この場合は購入したものが常に追加されます。そのため重複が発生しますので、それが問題なければ
cart()の配列方式でいいでしょう。
重複しない必要があるなら"kanri_no"での連想配列にします。
$kanri_no = $_POST["kanri_no"];
$_SESSION["cart"]["$kanri_no"] = $_POST["kosuu"];
無ければ追加しますし、既にあれば上書きされます。
cart()が単純な配列でcart2()が連想配列です。
<?php cart2() ?>の部分を変えると違いがはっきりするでしょう。
セッションをクリアーする必要がある場合は
// $_SESSION["cart"] = array();
の//を取って一回アクセスした後、また戻して下さい。
ご回答ありがとうございます。
ご回答ありがとうございます。