2017-07-05 12 views
1

私が欲しいのは、SQLを実行することです select * from articles where author like "%steven%"。安全のためpymysqlでsqlを正しくフォーマットできませんでした

は、私はこの方法のように使用:

cursor.execute('select * from articles where %s like %s', ('author', '%steven%')

その後、結果は構文エラーを取得していない、単なる空ですが、ちょうど空のセット。 しかし、私はそこに何かがあると確信しています、私は最初のSQLを使用して結果を得ることができます。私のコードで動くものはありますか?

+0

実際にどのようなクエリが実行されているかを確認してください。 –

答えて

1

where %s like %sを実行しているパラメータのように、列名を設定することはできません。

sql = 'select * from articles where '+ sql_identifier('author') +' like %s' 
cursor.execute(sql, ('%steven%',)) 

sql_identifierは、SQLインジェクションのための識別子を安全に行うためのあなたのlibの関数である:動的にあなたのような実際の文字列操作を行う必要があり、列名を設定します。次のようなものがあります。

# don't actually use this! 
def sql_identifier(s): 
    return '"%s"' % s.replace('"','') 

実際に使用しているDBエンジンのテストと知識が必要です。

1

ここでの問題は、実際には小さなミスです。 @ Asad Saeeduddinのおかげで、print cursor._last_executedを使って何が起きたのかを調べようとするときに。実際に実行されているものが SELECT * FROM articles WHERE 'title' LIKE '%steven%'であることが判明しました。タイトルの前後に引用符があるので、空のセットがあるのです。 したがって、常にを覚えておいてください。書式設定後の文字列は、引用符で囲まれます。

関連する問題