ポンクソフト

ショッピングカート - 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