商品情報の更新
商品情報の表示
ログインに成功したら,商品情報を画面に表示しましょう.
main.py に商品情報を表示するためのshowItems
関数を定義します.
この関数では,SELECT文で商品の一覧を取得します.
# 商品情報の表示
def showItems(user_id):
sql = "SELECT * from Items;"
records = cur.execute(sql)
print("<h2>商品一覧</h2>")
for record in records:
print("<p>" + str(record) + "</p>")
main.py の下記部分で,定義したshowItems
関数を呼び出します.
# ユーザ情報の検索・表示
showUserInfo(form_id)
# ユーザの購買履歴の検索・表示
showUserHistory(form_id)
# 商品情報の表示
showItems(form_id)
ID:u01 ,パスワード:X2ng でログインしてみましょう. 下記のように表示されれば正しく動作しています.
上記の方法では,p
タグで表示しているだけなので読み取りにくいです.
そこで,table
タグで見た目を整形しておきます.
このとき,商品名(name),価格(price),在庫数(stock)のみを表示することにします.
# 商品情報の表示
def showItems(user_id):
sql = "SELECT * from Items;"
records = cur.execute(sql)
print("<h2>商品一覧</h2>")
table = "<table border=`1``>"
table += "<tr>"
table += "<th>name</th>"
table += "<th>price</th>"
table += "<th>stock</th>"
table += "</tr>"
for record in records:
table += "<tr>"
item_id = record[0]
name = record[1]
price = record[2]
stock = record[3]
table += "<td>"
table += str(name)
table += "</td>"
table += "<td>"
table += str(price)
table += "</td>"
table += "<td>"
table += str(stock)
table += "</td>"
table += "</tr>"
table += "</table>"
print(table)
この結果,下記のように表示されればOKです.
商品情報の更新
商品の購入ボタンを設置します.
購入ボタンをクリックすると1つだけ商品を購入することにします.
table
タグに,form
タグを新たに追加します.
このとき,ユーザIDと商品IDを非表示データ(hidden
に設定)としてフォームに追加します.
また,購入ボタンをクリックすると buy.py というCGIのプログラムにデータは送信されます.
# 商品情報の表示
def showItems(user_id):
sql = "SELECT * from Items;"
records = cur.execute(sql)
print("<h2>商品一覧</h2>")
table = "<table border=`1``>"
table += "<tr>"
table += "<th>name</th>"
table += "<th>price</th>"
table += "<th>stock</th>"
table += "<th>buy</th>"
table += "</tr>"
for record in records:
table += "<tr>"
item_id = record[0]
name = record[1]
price = record[2]
stock = record[3]
table += "<td>"
table += str(name)
table += "</td>"
table += "<td>"
table += str(price)
table += "</td>"
table += "<td>"
table += str(stock)
table += "</td>"
form = "<form method='post' target='_blank' action='buy.py'>"
form += "<input type='hidden' name='user' value='" + user_id + "'>"
form += "<input type='hidden' name='item' value='" + item_id + "'>"
form += "<input type='submit' value='購入'></form>"
table += "<td>"
table += form
table += "</td>"
table += "</tr>"
table += "</table>"
print(table)
商品一覧に購入ボタンが表示されていることが確認できます.
新規に buy.py を作成し,cgi-binフォルダに配置します(実行権限の付与が必要)..
buy.py には下記のコードを記述します.
フォームから送信されたユーザIDと商品IDを受け取っています.
ここで,商品IDを基にItemsテーブルから商品の在庫を取得し,
在庫数が1以上であれば,在庫数を1だけ減らします.
もし在庫がない場合は,購入失敗となります.
また,データベースの更新を確定するために,
con.commit()
が必要であることに注意してください.
#!/usr/bin/env python
import sqlite3
import cgi
# フォームの取得
form = cgi.FieldStorage()
form_user = form["user"].value
form_item = form["item"].value
# データベースに接続
con = sqlite3.connect('sugiten.db')
# カーソルを取得
cur = con.cursor()
print ("Content-type:text/html\n\n")
print("<!DOCTYPE html>")
print("<html>")
print("<head>")
print("<meta charset='utf-8'>")
print("<title>購入確認</title>")
print("</head>")
print("<body>")
print("<h1>購入確認</h1>");
# 在庫数の取得
sql = "SELECT stock FROM Items where id='" + form_item + "';"
records = cur.execute(sql)
record = records.fetchone()
stock = int(record[0])
# 在庫があるとき
if stock >= 1:
print("<p>購入に成功しました</p>")
# 在庫数を減らす
sql = "UPDATE items SET Stock=" + str(stock-1) + " where id='" + form_item + "';"
cur.execute(sql)
else:
print("<p>購入に失敗しました</p>")
print("<p><a href='#' onclick='window.close()'>閉じる</a></p>")
# データベースの更新の確定
con.commit()
# データベースを切断
con.close()
print("</body>")
print("</html>")
それでは,マウスの購入ボタンをクリックしてみましょう. 在庫は10あるため,マウスの購入は成功となります. また,在庫数が1減って,残りが9になっていることも確認できます.
購買履歴も記録しておきましょう. Historiesテーブルに,購入時刻,ユーザID,商品IDを追加します. 現在の時刻を取得するには,datetime ライブラリを利用します.
import datetime
# 在庫数を減らす
sql = "UPDATE items SET Stock=" + str(stock-1) + " where id='" + form_item + "';"
cur.execute(sql)
# 購買履歴を記録
dt = datetime.datetime.now()
time = dt.strftime('%Y-%m-%d %H:%M:%S')
sql = "INSERT INTO Histories(time, user_id, item_id) VALUES('" + time + "', '" + form_user + "', '" + form_item + "');"
cur.execute(sql)
もう一度,マウスを購入すると,購買履歴に新しくレコードが追加されていることが確認できます.