ポンクソフト

ショッピングカート - PHPとPostgreSQLの連携入門

前ページ PHPとPostgreSQLの連携入門 TOP 

目次

  1. PHPとPostgreSQLの連携入門
  2. 掲示板1
  3. 掲示板2
  4. 5Wゲーム
  5. 販売管理システム
  6. 画像アップロード掲示板
  7. ショッピングカート

ショッピングカート

画像付きのショッピングカートシステムを作成します。新しくセッションの使い方も学びます。

テーブル「商品」の作成

以下のようなテーブルを「cart_syohin」という名前で作成してください。
列名データ型その他説明
codeserial primary key商品コード
nametext商品名
tankainteger単価
explanationtext商品説明
psqlを使う場合は、以下のように入力します(# はプロンプト)。
# create table cart_syohin(code serial primary key, name text, tanka integer, explanation text);

画像ディレクトリの作成

ソースを格納するディレクトリに「cart_image」ディレクトリを作成し、属性変更して「その他」に書込許可属性を与えます。

商品登録プログラムの作成

最初に商品を登録する部分を作成します。以下のソースを入力してください。但し
dbname=postgres user=postgres password=postgres
上記の部分は、テーブルを作成したDB名、ユーザ名、パスワードに変更してください。
<?php
$con = pg_connect("dbname=postgres user=postgres password=postgres");
if ($_POST['insert']) {
  $name = pg_escape_string(htmlspecialchars($_POST['name']));
  $tanka = pg_escape_string(htmlspecialchars($_POST['tanka']));
  $explanation = pg_escape_string(htmlspecialchars($_POST['explanation']));
  $tname = $_FILES['photo']['tmp_name'];
  if ($tname) {
    if (!is_uploaded_file($tname)) error("不正なアップロード");
    $type = $_FILES['photo']['type'];
    if ($type != "image/jpeg" && $type != "image/pjpeg") {
      error("JPEG形式ではありません");
    }
  }
  pg_query($con, "insert into cart_syohin(name,tanka,explanation) values('$name',$tanka,'$explanation')");
  if ($tname) {
    $rs = pg_query($con, "select last_value from cart_syohin_code_seq");
    $code = pg_fetch_result($rs, 0, 0);
    move_uploaded_file($tname, "cart_image/$code.jpg");
  }
} else if ($_POST['delete']) {
  $code = pg_escape_string(htmlspecialchars($_POST['code']));
  pg_query($con, "delete from cart_syohin where code=$code");
  @unlink("cart_image/$code.jpg");
}

function error($msg) {
  print "<p><font color='red'>$msg</font></p>\n";
  exit();
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>ショッピングカート 商品登録</title>
</head>
<body>
<p>画像はJPEGファイルのみ登録できます。</p>
<table border="1">
<tr><th>商品画像</th><th>商品名</th><th>単価</th><th>商品説明</th><th> </th></tr>
<form method="post" action="cart_regist.php" enctype="multipart/form-data"><tr>
<td><input type="file" name="photo"></td>
<td><input type="text" name="name"></td>
<td><input type="text" name="tanka"></td>
<td><input type="text" name="explanation" size="50"></td>
<td><input type="submit" name="insert" value="追加"></td>
</tr></form>
<?php
$rs = pg_query($con, "select * from cart_syohin order by code desc");
while ($row = pg_fetch_array($rs)) {
  print "<form method='post' action='cart_regist.php'><tr>";
  $code = $row['code'];
  print "<td>";
  if (file_exists("cart_image/$code.jpg")) print "<img src='cart_image/$code.jpg' border='0'>";
  print "</td>";
  print "<td>{$row['name']}</td><td>{$row['tanka']}</td>";
  print "<td>{$row['explanation']}</td>";
  print "<td><input type='submit' name='delete' value='削除'>";
  print "<input type='hidden' name='code' value='$code'></td>";
  print "</tr></form>\n";
}
pg_close($con);
?>
</table>
</body>
</html>
入力が終わったら「cart_regist.php」というファイル名で保存、サーバにアップロードし、動作確認してください。

ショッピングカートプログラムの作成

次にショッピングカート部分のプログラムを作成します。以下のソースを入力してください。但し
dbname=postgres user=postgres password=postgres
上記の部分は、テーブルを作成したDB名、ユーザ名、パスワードに変更してください。
<?php session_start() ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>ショッピングカート</title>
</head>
<body>
<?php
if ($_POST['cart']) {
  $code = htmlspecialchars($_POST['code']);
  $num = htmlspecialchars($_POST['num']);
  $_SESSION['cart'][$code] += $num;
  print "<p>カートに入れました。</p>\n";
} else if ($_POST['delete']) {
  $_SESSION['cart'] = array();
  print "<p>カートを空にしました。</p>\n";
}
?>
<form method="post" action="cart_buy.php">
<input type="submit" name="buy" value="精算">
</form>
<form method="post" action="cart.php">
<input type="submit" name="delete" value="カートを空にする">
</form>
<table border="1">
<?php
$con = pg_connect("dbname=postgres user=postgres password=postgres");
$rs = pg_query($con, "select * from cart_syohin order by code desc");
while ($row = pg_fetch_array($rs)) {
  print "<form method='post' action='cart.php'><tr>";
  $code = $row['code'];
  print "<td rowspan='2'>";
  if (file_exists("cart_image/$code.jpg")) print "<img src='cart_image/$code.jpg' border='0'>";
  print "</td>";
  print "<td rowspan='3'>{$row['explanation']}</td>";
  print "<td nowrap>{$row['tanka']}円</td></tr>";
  print "<tr><td nowrap><input type='text' name='num' size='3'>個</td></tr>";
  print "<tr><td>{$row['name']}</td>";
  print "<td><input type='submit' name='cart' value='カートへ'>";
  print "<input type='hidden' name='code' value='$code'></td>";
  print "</tr></form>\n";
}
pg_close($con);
?>
</table>
</body>
</html>
入力が終わったら「cart.php」というファイル名で保存、サーバにアップロードし、動作確認してください。

精算プログラムの作成

次にショッピング終了後のカートの中身を精算する部分のプログラムを作成します。以下のソースを入力してください。但し
dbname=postgres user=postgres password=postgres
上記の部分は、テーブルを作成したDB名、ユーザ名、パスワードに変更してください。
<?php session_start() ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>ショッピングカート 精算</title>
</head>
<body>
<table border="1">
<tr><th>商品名</th><th>単価</th><th>数量</th><th>小計</th></tr>
<?php
$con = pg_connect("dbname=postgres user=postgres password=postgres");
$sum = 0;
foreach($_SESSION['cart'] as $code => $num) {
  $rs = pg_query($con, "select * from cart_syohin where code=$code");
  $row = pg_fetch_array($rs);
  $ss = $num * $row['tanka'];
  print "<tr><td>{$row['name']}</td><td>{$row['tanka']}円</td>";
  print "<td>$num</td><td>{$ss}円</td></tr>\n";
  $sum += $ss;
}
print "<tr><td colspan='2'> </td><td>合計</td><td>{$sum}円</td></tr>\n";
pg_close($con);
?>
</table>
<a href="cart.php">カートに戻る</a>
</body>
</html>
入力が終わったら「cart_buy.php」というファイル名で保存、サーバにアップロードし、動作確認してください。

商品登録プログラム(cart_regist.php)ソースの解説

if ($_POST['insert']) {
商品を入力して「追加」ボタンを押したときにif 文以下の処理が実行されます。
  $name = pg_escape_string(htmlspecialchars($_POST['name']));
  $tanka = pg_escape_string(htmlspecialchars($_POST['tanka']));
  $explanation = pg_escape_string(htmlspecialchars($_POST['explanation']));
不正な処理を防ぐために商品名・単価・商品説明の各フィールド値をエスケープします。
  $tname = $_FILES['photo']['tmp_name'];
  if ($tname) {
    if (!is_uploaded_file($tname)) error("不正なアップロード");
    $type = $_FILES['photo']['type'];
    if ($type != "image/jpeg" && $type != "image/pjpeg") {
      error("JPEG形式ではありません");
    }
  }
画像がアップロードされた場合、JPEG形式かどうかチェックします。前回の講座を参照してください。
pg_query($con, "insert into cart_syohin(name,tanka,explanation) values('$name',$tanka,'$explanation')");
商品テーブルに入力された名前・単価・商品説明のレコードを追加します。
  if ($tname) {
    $rs = pg_query($con, "select last_value from cart_syohin_code_seq");
    $code = pg_fetch_result($rs, 0, 0);
    move_uploaded_file($tname, "cart_image/$code.jpg");
  }
画像がアップロードされた場合、[商品コード].jpg の名前で car_image ディレクトリに移動します。
} else if ($_POST['delete']) {
  $code = pg_escape_string(htmlspecialchars($_POST['code']));
  pg_query($con, "delete from cart_syohin where code=$code");
  @unlink("cart_image/$code.jpg");
}
商品の削除ボタンを押したとき、hidden フィールドの商品コードにより商品テーブルの該当のレコードを削除します。
$rs = pg_query($con, "select * from cart_syohin order by code desc");
既に追加した商品一覧を並べるとき、最新のものが一番上に来るように商品コードの降順(desc)でソートしています。

ショッピングカートプログラム(cart.php)ソースの解説

<?php session_start() ?>
セッションを開始しています。セッションを使うと、複数ページにまたがって変数を保持しておくことができます。
if ($_POST['cart']) {
「カートへ」のボタンが押されたとき、以下の文を実行します。
  $code = htmlspecialchars($_POST['code']);
  $num = htmlspecialchars($_POST['num']);
商品コードと数量をフォームより取得します。
$_SESSION['cart'][$code] += $num;
$_SESSION 配列に書いたキーがセッション変数となります。例えばセッション変数 a の値に 50 を入れたければ $_SESSION['a'] = 50; とします。ここではセッション変数 cart を商品コードをキー、数量を値とした配列にしています。
} else if ($_POST['delete']) {
  $_SESSION['cart'] = array();
「カートを空にする」ボタンを押したときは、セッション変数 cart をクリアしてカートの中身を消去します。

精算プログラム(cart_buy.php)ソースの解説

<?php session_start() ?>
ショッピングカートから値を引き継ぐために、ここでもセッションを開始しています。
foreach($_SESSION['cart'] as $code => $num) {
セッション変数 cart から商品コードと数量を順番に取り出します。
<a href="cart.php">カートに戻る</a>
セッション変数は他のページに移動しても消えないので、ショッピングカート画面に戻ってさらに買い物を続けることができます。
前ページ PHPとPostgreSQLの連携入門 TOP 
このエントリーをはてなブックマークに追加 そっか0

このページに関するコメントをどうぞ

お名前:


シャネル サングラス
リーマン・ショックが過ぎ、米国株はどんどんと上昇してしまい、買い時を逃した人も多いはず。
100年に一度と言われたリーマン・ショックですから当然ビビって底値なんかでは買えないわけです。
指をくわえて押し目待ちに押し目なしの状態だった人も多いことでしょう。
しかし、ようやく2016年にチャンスがやって来ました。
2017/07/16 05:31

カルティエ 時計
私の言いたいことは、私がどれほどまでに私はこの腕時計が好きだったことに驚きました。
つまり、はい、それは比較的きれいなダイヤルを好きなことがたくさんありました、そして多くのビンテージの手がかりは、ドームを含む(と)サファイアクリスタルは、過去の高層のアクリル系結晶の感覚を与えます。
しかしそれはクロノグラフ、ですが、私は、率直にその合併症、ユーティリティの多くのために私の人生でありません。
など、デザインは私に似合いませんでした。
ブライトリングのトランスオーシャンクロノグラフが1915年の私のスタンスを再考させるでない間、それは私と一緒に時間を過ごす幸せだったものである。
2017/07/16 03:55


あかさたなは
2017/07/12 18:39


222fffた
2017/07/11 14:49


222あ
2017/07/11 01:56



2017/07/09 13:30

阿部心臓
雷がやばい
2017/07/08 18:18

いいいい
おおおおおおおおおお
2017/07/07 15:07

東洋の魔女
はふはふ
2017/07/07 07:57


日本語が文字化けしてしまいます
2017/07/05 11:49

残りを読む »