PHPについて質問です。

現在ショッピングカートのPHPスクリプトを作成しており、
購入するボタンを押した商品をセッションに保存するということを行いたいのですがうまく出来ず困っております。
大変お手数をおかけしますが詳しい方おりましたら
購入ページのPHPスクリプトとデータを追加するページのPHPスクリプトを見ていただいて間違いがある場合指摘していただければと考えております。
(この後の処理としては、セッションに保存された値を順番に表示したいと考えております。。)
大変お手数をおかけしますがご回答お待ちしております。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/03/30 21:50:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59

ポイント100pt
<?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();

の//を取って一回アクセスした後、また戻して下さい。

id:aiomock

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

2010/03/24 16:00:10

その他の回答1件)

id:GreenStar No.1

回答回数192ベストアンサー獲得回数46

ポイント35pt

まずは購入ページのほうの例! 動かしての確認はしてないけど、在庫数が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/ とか既存のものを使えば楽なのに、どうして面倒なことしてるの??

学習するのでも既存のものの構造を学んだほうがいいと思うよ!!

id:aiomock

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

2010/03/24 07:41:13
id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59ここでベストアンサー

ポイント100pt
<?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();

の//を取って一回アクセスした後、また戻して下さい。

id:aiomock

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

2010/03/24 16:00:10
  • id:aiomock
    購入ページのPHPスクリプトです。

    購入するボタンを押したらデータを追加するPHPスクリプトに一度飛んでセッションに保存するという流れです。

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta content="text/html;charset=Shift_JIS" http-equiv="Content-Type">
    <title>test</title>
    </head>
    <body>
    <table style="text-align: left; width: 500px;" border="1"
    cellpadding="2" cellspacing="2">
    <tbody>
    <?


    require "database_connect.php";


    $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="add_data.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";

    }
    ?>

    </table>
    <br>
    <br>
    </body>
    </html>
  • id:aiomock
    データを追加するページのPHPスクリプトです。

    セッションに保存し確認ページへ移動するという流れにしたいのですが。。。。

    <?

    if(isset($_POST["submit"]))
    {

    require "database_connect.php";


    session_start();


    $_SESSION["kanri_no"]=array_push($_SESSION["kanri_no"],'".$_POST["kanri_no"]."');
    $_SESSION["kosuu"]=array_push($_SESSION["kanri_no"],'".$_POST["kosuu"]."');

    session_write_close();


    header('Location:kakunin.php');


    }
    ?>

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません