0

Pythonを介してMySQLのクエリをほぼ正常に実行し、ブランドで最も頻繁に使用されるデータセットを表示しました。私が抱えている問題は、print row[1], row[2]コマンドを実行しようとすると、productnumのように必要なスペースの代わりにproductnumが返されることです。やってみprint row[1], " ", row[2]ましたが、テストケースを満たしていません。この問題を回避する別の方法はありますか?これは重要な質問のように聞こえないかもしれませんが、それは私を悩ませてきました、そしてそれはテストに合格しないのはこの問題です。完全なコードは以下のとおりです。

4

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 に答える