2016-11-18 9 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)) 

上記newCharacter関数を使用して2つの行を挿入した後、私のstatsテーブルの一例です。下の空白の最初の列には文字列(「ユーザー名」など)を含める必要があります。

 |  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) 

これは、あなたが問題の文字を「エスケープ」することができます。それはまた、そこに補間された値が適切に引用されていることを保証します。私はあなたの問題だと思います。

関連する問題