Pythonを介してMySQLのクエリをほぼ正常に実行し、ブランドで最も頻繁に使用されるデータセットを表示しました。私が抱えている問題は、print row[1], row[2]
コマンドを実行しようとすると、productnumのように必要なスペースの代わりにproductnumが返されることです。やってみprint row[1], " ", row[2]
ましたが、テストケースを満たしていません。この問題を回避する別の方法はありますか?これは重要な質問のように聞こえないかもしれませんが、それは私を悩ませてきました、そしてそれはテストに合格しないのはこの問題です。完全なコードは以下のとおりです。
2 に答える
4
文字列を連結して SQL を作成しないでください。私が攻撃者であるふりをして、あなたの関数を次のように呼び出します。
inject = "'; SELECT name,cardnum FROM credit_cards; --"
most_popular(inject, 'LOL')
あなたのコードは、それを次のように拡張するのに役立ちます。
SELECT DISTINCT brand, product, COUNT(*) AS num FROM table1 WHERE brand = ''; SELECT * FROM credit_cards; --'" "GROUP BY product ORDER BY num desc, product asc LIMIT LOL
そして今、あなたの顧客はあなたを訴えています。自分でクエリを作成するのではなく、常にパラメーター化されたクエリを使用してください。cursor.execute()
like を次のように変更します。
cursor.execute("SELECT DISTINCT brand, product, COUNT(*) AS num FROM table1 WHERE brand = %s GROUP BY product ORDER BY num desc, product asc LIMIT %s", (brands, num_frequency))
私は何年もの間 DB ライブラリを書いてきましたが、これを正しくしようとする考えは今でも私を怖がらせます。データベース ライブラリに面倒な作業を任せてください。
于 2012-10-10T22:51:57.913 に答える
1
どうですかprint "%s %s" % (row[1], row[2])
(行に明示的なキャストが必要かどうかはわかりません)
EDIT:またはprint "{0} {1}".format(s, s2)
(との表記%
は少し古風です)
于 2012-10-10T22:49:04.187 に答える