2016-11-18 94 views
1

我試圖向SQL表中插入字符串,但插入後字符串值爲空。我做錯了什麼,我該怎麼做才能解決它?無法將字符串插入到MySQL表中

這是我正在運行的python函數。

def newCharacter(usr): 
    cur.execute("INSERT INTO stats (user, level, exp, hp, attack, luck, aggro, hpregen) VALUES ('{}', 1, 0, 100, 10, 50, 50, 0)".format(usr)) 

下面是我stats表的使用上述newCharacter函數插入兩行之後的示例。第一列(在下面空白)應該包含一個字符串(例如「用戶名」)。

 |  1 | 0 | 100 |  10 | 50 | 50 |  0 | 
    |  1 | 0 | 100 |  10 | 50 | 50 |  0 | 
+1

您能否在您的問題中添加特定的錯誤消息或您收到的結果,並解釋它們與預期的不同之處? – ecounysis

+0

可能是默認自動提交被關閉,你需要做'cursor.commit()' –

+0

'usr'的值是什麼? – ecounysis

回答

1

我不確定是怎麼回事,但是你寫的是易受SQL injection attack的影響。任何形式的「通過將變量連接在一起進行SQL查詢」(和.format算作串聯)都容易受到SQL注入攻擊。

取而代之的是,pass the variables in as parameters to .execute

cur.execute("INSERT INTO stats (user, level, exp, hp, attack, luck, aggro, hpregen) VALUES (?, 1, 0, 100, 10, 50, 50, 0)", usr) 

several different types of parameter styles,它可能不是?

+0

謝謝你,你會怎麼建議我在表中添加一個變量呢? – ZodiacV1

+0

@ ZodiacV1就像我寫的。 – Schwern

0

一般來說,當數據庫來自用戶時,清理數據庫的輸入非常重要。如果用戶可以輸入任何他們喜歡的東西,你可以找到控制字符和語法上有意義的輸入。即使您有客戶端驗證,也是如此。

你正在使用的MySQL驅動程序實現這個很容易:

cur.execute("INSERT INTO stats (user, level, exp, hp, attack, luck, aggro, hpregen) VALUES (%s, 1, 0, 100, 10, 50, 50, 0)", usr) 

這將讓你「逃離」問題的字符。它也將確保插值的值被正確引用,我想這是你的問題。