ウェブページを独学している者です。
ウェブページでは、商品名、個数、価格を入力すると、ID順に、商品ごとの小計、合計金額が表示される買い物リストを作ろうとしています。
商品ごとの小計を合計に足しこんで合計を求めたいのですが、
local variable referenced before assignment のエラーが消えません。
どのようにコードを書き換えれば合計をうまく表示できますか。
データベースはsqllite、Pythonを使って簡易的にwebサーバーを立ち上げて動きを確認しています。勉強でやっているので、外部公開はしません。
import cgi, sys, io, sqlite3 def main(): # formで入力された値の取得 form = cgi.FieldStorage() m1 = form.getfirst('name1') m2 = form.getfirst('num1') m3 = form.getfirst('num2') # Windows版pythonのprint()出力はShift-jisなのでUTF-8に変更 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') print("Content-type: text/html; charset=UTF-8") print("") # 改行のみを送るが規格上、必要 print( mkhead() + dbdata(m1, m2, m3) + mktail() ) def dbdata(m1,m2,m3): con = sqlite3.connect("test.db") cur = con.cursor() html = "" cur.execute("INSERT INTO log (name, price, num) values(?,?,?)", (m1,m2,m3) ) cur.execute("SELECT count(*) FROM log") n = cur.fetchone()[0] if n>0: html += """\ <table border="0"> <br> <br> <tr><th>id</th><th>品名</th><th>単価</th><th>数量</th><th>小計</th><tr> """ for row in cur.execute("SELECT * FROM log order by id ASC"): html += "<tr><td align=right>%5d</td><td>%-10s</td><td>%-s</td><td align=right>%-s</td><td>%d</td></tr>"%\ (int(row[0]), row[1], row[2],int(row[3]),int(row[2])*int(row[3])) goukei += int(row[2])*int(row[3]) html += "</table>" con.commit() con.close() return html def mkhead(): goukei = 0 # HTML前半固定部分 return '''\ <!doctype html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>買い物リスト</title> </head> <body> <h1>買い物リスト</h1> <form action="/cgi-bin/dblog.py" method="POST"> <p> 品名<input type="text" name="name1" size="20"> 単価<input type="text" name="num1" value="0"size="10"> 数量<input type="text" name="num2" value="0"size="10"> </p> <input type="submit" value="追加"> <hr/> </form> ''' def mktail(): # HTML後半固定部分 return '''\ </body> </html> ''' # 利用している関数をmainより後で定義するための処置 if __name__=='__main__': main()