2016-11-21 31 views
0

我基本明白,如果沒有列出變量,我的SQL語句將不會運行,因爲我想要做的是檢查名稱在寫入之前就存在了(我可以在SQL中做這個)。我理解這個問題,而不是如何糾正它......在現在是晚上9點30分之前,我想問問問題,我仍然在深入研究這個問題。由於我需要在sql查詢中運行if語句,提供變量或爲空

app.py

import sqlite3 
from sqlalchemy.orm import sessionmaker 
from tabledef import * 
engine = create_engine('sqlite:///tutorial.db', echo=True) 
Session = sessionmaker(bind=engine) 
session = Session() 

USERNAME = "Jas" 
PASSWORD = "Booger" 
EMAIL = "[email protected]" 
AMOUNT = "500" 
reg = User(USERNAME, PASSWORD, EMAIL, AMOUNT) 

conn = sqlite3.connect("tutorial.db") 
c = conn.cursor() 
try: 
    c.execute('SELECT username from users WHERE username = "%s"' % USERNAME) 
    result = str(c.fetchall()).split("'")[1] 
    print result 
except ValueError as e: 
    print e 

錯誤消息

Traceback (most recent call last): 
    File "C:/Users/sysadmin/PycharmProjects/bet1/app3.py", line 18, in <module> 
    result = str(c.fetchall()).split("'")[1] 
IndexError: list index out of range 

回答

1

不太清楚你問什麼,但我建議你閱讀從Python manual以下部分:

# Never do this -- insecure! 
symbol = 'RHAT' 
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) 

# Do this instead 
t = ('RHAT',) 
c.execute('SELECT * FROM stocks WHERE symbol=?', t) 
print c.fetchone() 

除了防止SQL注入攻擊,它還使用fetchone()而不是...轉換你對字符串的響應並再次解析。

+0

這是有道理的,我一定會合並,以消除逃逸和其他不需要的字符。我問的是,如果你有任何一個c.execute上面的變量是空的,我會得到這個錯誤,因爲查詢什麼都沒有返回。我想我可以找出這一個,我只是發現線上的SELECT EXISTS語句,這將節省我的時間,但感謝SQL注入信息。 –

+0

嗯,看起來如果我的變量將來自窗體,上述方法仍然允許用戶從POST注入代碼。所以看來我仍然必須做一些轉義,對嗎?還是有更好的方法來防止從表單注入代碼? –

+0

此方法應能自動正確地轉義所有內容。 – Lunaweaver