商品情報の更新

Image from Gyazo

商品情報の表示

ログインに成功したら,商品情報を画面に表示しましょう. 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 でログインしてみましょう. 下記のように表示されれば正しく動作しています.

Image from Gyazo

上記の方法では,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です.

Image from Gyazo

商品情報の更新

商品の購入ボタンを設置します. 購入ボタンをクリックすると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)                

商品一覧に購入ボタンが表示されていることが確認できます.

Image from Gyazo

新規に 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になっていることも確認できます.

Image from Gyazo

Image from Gyazo

Image from Gyazo

購買履歴も記録しておきましょう. 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)

もう一度,マウスを購入すると,購買履歴に新しくレコードが追加されていることが確認できます.

Image from Gyazo

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.