2012-07-06 12 views
7

Python3で入力をMySQLデータベースにエスケープするにはどうしたらいいですか? 私はPyMySQLを使用し、正常に動作しますが、私は次のように何かをしようとしています:文字列が'または"を持っている場合、それは動作しませんPython3で入力をMySQLデータベースにエスケープするにはどうしたらいいですか?

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = '{}'".format(request[1])) 

。私も試してみました:

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s",request[1]) 

これに伴う問題は、ライブラリ(PyMySQL)はもう動作しませんPython2.x、%、の書式構文を使用していることです。 私はまたhereにこの可能性のある解決策

conn.escape_string() 

を見つけましたが、私はこのコードを追加する場所を知りません。 これは私が得たすべてである:

import pymysql 
import sys 
conn = pymysql.connect(host = "localhost", 
      user = "test", 
      passwd = "", 
      db  = "test") 
cursor = conn.cursor() 
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(request[1])) 

result = cursor.fetchall() 

cursor.close() 
conn.close() 

編集:私はそれを解決します! PyMySQLでは正しい方法は、このようなものです:text = conn.escape(request[1])行は、コードをエスケープするものである

import pymysql 
import sys 
conn = pymysql.connect(host="localhost", 
      user="test", 
      passwd="", 
      db="test") 
cursor = conn.cursor() 
text = conn.escape(request[1]) 
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(text)) 

cursor.close() 
conn.close() 

。 PyMySQLコードの中でそれを見つけました。そこには、request[1]が入力です。

+1

クール。あなたはあなたの質問の後半を回答として投稿するべきです。あなたは自分の答えを受け入れることができます。 – Grilse

+0

おっと、以前はそのボタンが見えませんでした。 – user1460016

+0

解決された場合は、自分の質問に合格とフラグを付けます。 :-) – Jocelyn

答えて

6

解決済み。 PyMySQLでは正しい方法は、このようなものです:text = conn.escape(request[1])行は、コードをエスケープするものである

import pymysql 
import sys 
conn = pymysql.connect(host="localhost", 
      user="test", 
      passwd="", 
      db="test") 
cursor = conn.cursor() 
text = conn.escape(request[1]) 
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(text)) 

cursor.close() 
conn.close() 

。 PyMySQLコードの中でそれを見つけました。そこには、request[1]が入力です。

14

「解決された」回答は機能しますが、ベストプラクティスではありません。 Python DBIに準拠したライブラリを使用する場合は、文字列を書式設定して実行する代わりに、バインド変数を使用する必要があります。その方法論には固有の危険性があります。これはフォーマット文字列が、実行中のカーソルに渡されたバインド変数ではないことを

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s", text) 

注:

したがって、これはそれを行うには正しい方法です。詳細について

Python DBI PEP

+0

整数などの異なる型でも '%s'を使用する必要があることに注意してください。私は '%d'を使用しようとしていて、エラーを受け取りました: '%d形式:数値は必須であり、strではありません。 – nephets

0

ヘルパー関数を使用する準備ができました

def mysql_insert(conn, table, row): 
    cols = ', '.join('`{}`'.format(col) for col in row.keys()) 
    vals = ', '.join('%({})s'.format(col) for col in row.keys()) 
    sql = 'INSERT INTO `{0}` ({1}) VALUES ({2})'.format(table, cols, vals) 
    conn.cursor().execute(sql, row) 
    conn.commit() 

使用例

insert_into(conn, 'people', { 
    'firstname': 'John', 
    'lastname': 'Doe', 
    'age': 18, }) 

参考:https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/cursors.py#L157-L158

def execute(self, query, args=None):

If args is a list or tuple, %s can be used as a placeholder in the query. 
If args is a dict, %(name)s can be used as a placeholder in the query. 
関連する問題